分布式技术之Zookeeper基础---小白学习专用

Zookeeper

一、Zookeeper介绍

1、Zookeeper是什么?

Zookeepe是一个分布式的、开放源码的分布式应用协调服务。是Apache Hadoop 的一个子项目,公开了一组简单的API,分布式应用程序可以基于这些API用于同步节点状态、配置、服务注册等信息。其由JAVA编写,支持JAVA和C两种语言的客户端。

2、目录节点

Zookeeper其实是维护了一个类似文件系统的一个数据结构,如下图所示
简单数据结构
上图圈红处 /master等就被称作为 znode(目录节点),和文件类似,我们能够在一个znode下自由的增加、删除子znode,同时在znode中我们可以存储少量的数据,如上图绿色圈出的就为存储的数据。

其中znode有四种类型:
	PERSISTENT-持久目录节点
	
	客户端与zookeeper断开连接后,该节点依旧存在(该节点也是默认创建的)
	
	PERSISTENT_SEQUENTIAL-持久序号目录节点
	
	客户端与zookeeper断开连接后,该节点依旧存在,但是Zookeeper会给该节点名称后追加顺序编号
	
	EPHEMERAL-临时节点
	
	客户端与zookeeper断开连接后,该节点被删除
	
	EPHEMERAL_SEQUENTIAL-临时序号目录节点
	
	客户端与zookeeper断开连接后,该节点被删除,但是Zookeeper给该节点名称后追加顺序编号

二、Zookeeper安装与配置以及基本命令

1、Zookeeper安装

(1).因为Zookeeper基于JAVA开发的所以必须要有JAVA环境(JAVA环境就不在这说了大家肯定都知道~)

(2).下载Zookeeper安装包并解压,我安装的是当前最稳定的版本3.5.5,并在linux环境下演示

官网:http://zookeeper.apache.org/
源码:https://github.com/apache/zookeeper

(3).进入到解压目录执行: cp conf/zoo_sample.cfg conf/zoo.cfg,拷贝默认目录

(4).复制完直接进入bin目录下执行 ./zkServer.sh start 就可以直接启动
zookeeper
(5).连接客户端可以直接在当前目录下执行 ./zkCli.sh 即可,出现如下图即表示安装成功
在这里插入图片描述

2、Zookeeper使用中的常用命令
close  				关闭当前会话
connect host:port  	重新连接指定Zookeeper服务
create [-s] [-e] [-c] [-t ttl] path [data] [acl] 	创建节点(无参默认创建持久节点)
		-s 序号节点,-e 临时节点
delete [-v version] path	删除节点(不能存在子节点)
deleteall path 删除路径及所有子节点
ls path	列出子节点
set [-s] [-v version] path data 设置值
get [-s] [-w] path	获取值
setquota -n|-b val path 设置节点限额 -n 子节点数 -b 字节数
listquota path 查看节点限额
delquota [-n|-b] path 删除节点限额
get [-s] [-w] path 查看节点数据 
	 -s 包含节点状态 -w 添加监听 
getAcl [-s] path	获取权限
ls [-s] [-w] [-R] path 	列出子节点 -s状态 
	-R 递归查看所有子节点 -w 添加监听
printwatches on|off 	是否打印监听事件
quit  退出客户端
history  查看执行的历史记录
redo cmdno  重复 执行命令,history 中命令编号确定
removewatches path [-c|-d|-a] [-l] 删除指定监听
setAcl [-s] [-v version] [-R] path acl 为节点设置ACL权限
stat [-w] path 查看节点状态 -w 添加监听
sync path 强制同步节点
3、zoo.conf文件参数的含义

zoo.conf配置

tickTime=2000 zookeeper时间配置中的基本单位 (毫秒)

initLimit=10 允许follower初始化连接到leader最大时长,它表示tickTime时间倍数

syncLimit=5 允许follower与leader数据同步最大时长,它表示tickTime时间倍数

dataDir=/tmp/zookeeper zookeper数据存储目录

clientPort=2181 对客户端提供的端口号

maxClientCnxns=60 单个客户端与zookeeper最大并发连接数

autopurge.snapRetainCount=3 保存的数据快照数量,之外的将会被清除

autopurge.purgeInterval=1 自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除

4、节点的监听

其实Zookeeper最重要的功能就是节点的监听。客户端通过监听节点的数据变化,以及子节点发生变化(增加或删除)来了解zookeeper分布式集群的状态,以此来进行处理。

ls -w path 可以监听该目录下子节点的变化

get -w path 可以监听该节点数据的变化

5、acl权限设置

ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode的访问。基于scheme: id: permission的方式进行权限控制。scheme表示授权模式、id模式对应值、permission即具体的增删改权限位。

scheme授权模式:

world	开放模式,world表示全世界都可以访问(这是默认设置)
ip		ip模式,限定客户端IP防问
auth	用户密码认证模式,只有在会话中添加了认证才可以防问
digest	与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。

permission权限位:

权限位	权限	描述
c	CREATE	可以创建子节点
d	DELETE	可以删除子节点(仅下一级节点)
r	READ	可以读取节点数据及显示子节点列表
w	WRITE	可以设置节点数据
a	ADMIN	可以设置节点访问控制列表权限

world模式示例: setAcl path world : anyone : 权限位(其中anyone是world模式下唯一的值,所有人都可以访问)

ip模式示例: setAcl path ip : <ip地址||地址端> : 权限位

auth模式示例: setAcl path auth:<用户名>:<密钥>:权限位

digest模式示例: setAcl path digest:<用户名>:<密钥>:权限位

a.其中<密钥>可通过如下命令生成:
	echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64
b.为节点设置digest权限后,需要执行	addauth digest <用户名>:<密码> 命令才可以进行访问
c.权限仅对当前节点有效,不会让子节点继承。如限制了IP防问A节点,但不妨碍该IP防问A的子节点 /A/B。

三、Zookeeper客户端

Zookeeper官方客户端在java中我们可以引用如下依赖

<dependency>
           <groupId>org.apache.zookeeper</groupId>
           <artifactId>zookeeper</artifactId>
           <version>3.5.5</version>
</dependency>

注意版本要跟你的服务端版本一致。

但是由于我们官方的客户端有很多限制做的还不是很好,比如监听节点,每次只能监听一次,当触发后则需
要重新对该节点进行监听等,所以我们在日常使用java客户端时候一般都使用第三方客户端ZkClient,依
赖如下

<dependency>
   		<groupId>com.101tec</groupId>
     	<artifactId>zkclient</artifactId>
     	<version>0.11</version>
 </dependency>
上面是zookeeper的基本使用,具体在java中的代码实现我就不写了,自己查看API基本也可以看懂,跟命令比较相似

四、Zookeeper集群

集群一般部署最少需要三台服务器,并且服务器总数最好为奇数,因为Zookeeper集群采用半数机制,也就是活跃的服务器数目超过总服务器数目的一半,集群服务就能正常使用,如果两台服务器的话,一台挂掉集群也就整体挂掉了(因为超过了半数),这样的话与一台服务器并没有什么区别,达不到集群的高可用特性,所以我们一般最少需要三台服务器来构建一个集群

1、集群角色

leader:主节点,又名领导者。用于写入数据,通过选举产生,如果宕机将会选举新的主节点。

follower:子节点,又名追随者。用于实现数据的读取。同时他也是主节点的备选节点,并拥有投票权。

observer:次级子节点,又名观察者。用于读取数据,与fllower区别在于没有投票权,不能选为主节点。并且在计算集群可用状态时不会将observer计算入内。

2、选举机制

为了保证集群的特性,我们的多台服务器中必须有一个leader主节点来接收客户端的请求,再由leader同步到下面的子节点,并且只有主节点才可以写入数据,所以我们第一次启动或者当主节点挂掉之后,我们要通过选举来选出新的主节点。
选举
如图就是当有三台服务器时的leader选举,无论怎么启动,总是myid为2的服务器当选为主节点

投票机制说明:

第一轮投票全部投给自己

第二轮投票给myid比自己大的相邻节点

如果得票超过半数,选举结束。

3、Zookeeper典型应用场景

(1)分布式集群管理(可以进行服务器cpu,内存等日志的监控)

(2)分布式注册中心(Dobbo分布式框架的应用)

(3)分布式job(解决多台机器执行一个任务)

(4)分布式锁(这个实现方式有很多,zookeeper只是其中一种参考)

以上只是个人在学习zookeeper时整理的一些笔记,都是比较基础的东西,希望能给刚接触zookeeper的通许有一些帮助,谢谢!如果有什么问题,可踊跃提出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值