官网:Apache ZooKeeper
下载地址:Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7
ZK配置参数说明:
1、tickTime=2000:通讯心跳时间,zookeeper服务器与客户端心跳时间,单位毫秒
2、initLimit=10:LF初始通讯时限
Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量)
3、syncLimit=5:LF同步通信时限
Leader和Follower之间通信时间如果超过syncLimit * tickTime,Leader认为Follower死掉,从服务器列表中删除Follower。
4、dataDir:保存zookeeper中的数据
注意:默认的tmp目录,会被linux系统定期清理,数据一般不放到/tmp下面
5、dataLogDir:保存zookeeper中的事务日志(服务器启动恢复数据的)
6、clientPort=2181:客户端连接端口
集群搭建配置:
1、在zk安装目录XXX/apache-zookeeper-3.5.7-bin/下创建data
mkdir data
2、在XXX/apache-zookeeper-3.5.7-bin/data/目录下创建文件myid
vi myid
在文件中添加与server对应的编号(注意:上下不要有空行,左右不要有空格)
1
3、配置zoo.cfg,添加如下配置:
server.1=192.168.1.100:2888:3888
server.2=192.168.1.101:2888:3888
server.3=192.168.1.102:2888:3888
2888:代表服务器Follower与集群中的Leader服务器交换信息的端口
3888:如果集群中Leader服务器挂掉。需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器间通讯的端口
客户端启动:
1、连接本地
bin/zkCli.sh
2、连接指定服务器
bin/zkCli.sh -server 192.168.1.101:2181
ZK常用命令:
命令 | 描述 |
---|---|
help | 显示所有操作命令 |
ls path | 使用ls命令来查看当前znode的子节点【可监听】
-w 监听子节点变化 -s 附加次级信息 |
create | 普通创建 -s 含有序列 -e 临时(重启或者过期消失) |
get path | 获得节点的值【可监听】 -w 监听节点内容变化 -s 附加次级信息 |
set | 设置节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
deleteall | 递归删除节点 |
1、ls /path:查看当前znode
[zk: localhost:2181(CONNECTED) 4] ls /platform
[com.p2p.plugin.login.ILogin, com.p2p.plugin.login.ILoginExport]
[zk: localhost:2181(CONNECTED) 5]
ls -s /path:查看当前znode详情
[zk: localhost:2181(CONNECTED) 3] ls -s /platform
[com.p2p.plugin.login.ILogin, com.p2p.plugin.login.ILoginExport]cZxid = 0x3
ctime = Sun Jul 14 18:47:01 CST 2024
mZxid = 0x3
mtime = Sun Jul 14 18:47:01 CST 2024
pZxid = 0xb
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
参数 | 说明 |
---|---|
czxid | 创建节点的事务zxid 每次修改zookeeper状态都会产生一个zookeeper事务id。 事务id是zookeeper中所有修改总的次序。 每次修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生 |
ctime | znode被创建的毫秒数(从1970年开始) |
mzxid | znode最后更新的事务zxid |
mtime | znode最后修改的毫秒数(从1970年开始) |
pZxid | znode最后更新的子节点zxid |
cversion | znode子节点变化号,znode子节点修改次数 |
dataversion | znode数据变化号 |
aclVersion | znode访问控制列表的变化号 |
ephemeralOwner | 如果是临时节点,这个是znode拥有者的session id。 如果不是临时节点则是0. |
dataLength | znode的数据长度 |
numChildren | znonde子节点数量 |
2、create xxx
znode节点有四种类型:
- PERSISTENT:永久节点。客户端与zookeeper断开连接后,该节点依旧存在
- EPHEMERAL:临时节点。客户端与zookeeper断开连接后,该节点被删除
- PERSISTENT_SEQUENTIAL:永久节点、序列化。客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
- EPHEMERAL_SEQUENTIAL:临时节点、序列化。客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
create /xx test # 创建持久化节点
create -e /xx test # 创建临时节点
create -s /xx test # 创建持久序列化节点
create -e -s /xx test # 创建临时序列化节点
3、get path
获取节点信息
4、set path
设置节点
5、delete path
删除节点
6、监听器总结
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。
1)节点的值变化监听
get -w /xx
注意:在右边的客户端多次修改/dd0000000007的值,左边不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。
2)节点的子节点变化监听(路径变化)
ls -w /xx
3)当某个节点创建或者删除的时候
stat -w /xx
zk选举机制:
半数机制,超过半数的投票通过,即通过
1、第一次启动选举规则:
- 投票过半数时,服务器id大的胜出
2、第二次启动选举规则:
- EPOCH(参与选举任期数)大的直接胜出
- EPOCH相同,事务id大的胜出
- 事务id相同,服务器大的胜出
.Zookeeper选举机制——第一次启动
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING;
(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。
名词 | 简介 | 含义 |
---|---|---|
SID | 服务器ID | 用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致 |
ZXID | 事务ID | ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。 |
Epoch | 每个Leader任期的代号 | 没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加 |
Zookeeper选举机制——非第一次启动
(1)当zookeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:
- 服务器初始化启动
- 服务器运行期间无法和leader保持连接
(2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:
- 集群中本来就已经存在一个Leader
对于这种已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。
- 集群中确实不存在Leader(重点)
假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。最后选了服务器2。
生产环境zk服务器多少合适:
安装奇数台。
生产经验:
- 10台服务器:3台zk
- 20台服务器:5台zk
- 100台服务器:11台zk
- 200台服务器:11台zk