zookeeper基础知识学习

官网: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

上一篇:DangerWind-RPC-framework---五、服务端的反射调用


下一篇:万界星空科技AI低代码平台:重塑数字化创新边界