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

bash 复制代码
mkdir data

2、在XXX/apache-zookeeper-3.5.7-bin/data/目录下创建文件myid

bash 复制代码
vi myid

在文件中添加与server对应的编号(注意:上下不要有空行,左右不要有空格)

bash 复制代码
1

3、配置zoo.cfg,添加如下配置:

bash 复制代码
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
bash 复制代码
[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详情
bash 复制代码
[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给该节点名称进行顺序编号
bash 复制代码
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
相关推荐
ltl25 分钟前
大多数「无锁」代码其实不是无锁的
linux
ltl28 分钟前
Linux 内核的内存屏障:一个让我调了三天的 bug
linux
paopaokaka_luck2 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
minglie12 小时前
zynq高频小数据量PS闭环 抖动时间的测量
学习
long3162 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
Lonely 净土3 小时前
Rocky Linux 安装教程
linux·运维·服务器
梦雨生生3 小时前
java开发工具(学习第一天)
java·开发语言·学习
李白你好7 小时前
Windows 离线 Linux 提权辅助查询工具
linux
Lust Dusk7 小时前
记一次Linux应急响应题目解析
linux·运维·服务器·网络·安全·网络安全
ShineWinsu8 小时前
对于Linux:五种IO模型以及非阻塞IO的详细解析
linux·c++·面试·io·阻塞·非阻塞·fcntl