Zookeeper学习笔记
Zookeeper学习笔记

1 | |
集群配置
每一个节点都要修改
- 在zk的数据目录新建一个myid文件,输入myid的值
- 在zoo.cfg中加入集群配置信息,如下
1 | |
客户端操作
1 | |
常用命令
1 | |
节点类型
持久的
断开连接不删除
临时的
客户端与服务端断开连接就删除临时节点
有序的
无序的
监听器
注意:监听是不能重复监听,需要重复监听就需要重复watch
监听节点值的变化
1
2
3
4
5
6
7
8
9
10
11
12# 通过某个客户端设置监听的节点
get -w /node1
#在其他客户端修改节点值
set /node1 test
# 监听客户端收到如下通知
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/node1监听子节点节点数的变化
1
2
3
4
5
6
7
8# 通过某个客户端设置监听的节点
ls -w /node1
# 当有新增或者删除节点时,客户端会收到如下通知
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node1
选举机制
首次启动集群
服务器1启动
- 投自己一票
- 此时集群中只有一个节点,不进行选票传递
- 判断自己的选票有没有大于集群中的半数节点,即是否大于3,不大于进入LOOKING状态
服务器2启动
- 投自己一票
- 进行选票传递,服务器1的myid小于服务器2的myid,服务器1将选票传递给服务器2,此时服务器1的选票为0,服务器2的选票为2
- 判断自己的选票有没有大于集群中的半数节点,即是否大于3,不大于进入LOOKING状态
服务器3启动
- 投自己一票
- 进行选票传递,服务器2的myid小于服务器3的myid,服务器2将选票传递给服务器3,此时服务器1、2的选票均为0,服务器3的选票为3
- 判断自己的选票有没有大于集群中的半数节点,即是否大于3,大于3,选举成功,此时服务器3是Leader节点,状态由LOOKING变为LEADING;服务器1/2自动变为Follower节点,状态由LOOKING变为FOLLOWING
服务器4启动
- 投自己一票
- 此时集群中1/2/3服务器已经不再是LOOKING状态,服务器4自动变为Follower
服务器5启动
- 投自己一票
- 此时集群中1/2/3/4服务器已经不再是LOOKING状态,服务器5自动变为Follower
非第一次启动
当服务器5无法与Leader保持连接时,会发起一次选举
Leader正常,只是服务器5无法与Leader保持连接,则继续尝试连接Leader
Leader确实挂了,则进入选举
假如当前集群中SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且SID为3的服务器为Leader;此时服务器3与5突然挂了,需要进行Leader重新选举,流程如下:
- 1、2、4进行Leader选举,依次比较Epoch、ZXID、SID,大的成为Leader
- 此时1、2、4的数据分别为1 8 1、1 8 2、1 7 4,所以服务器2为新的Leader
集群启动脚本
1 | |
PS. 如果出现JAVA_HOME is not set and java could not be found in PATH,请修改zkEnv.sh
1 | |
写数据流程
- 客户端连接的是Leader节点

客户端连接的是Follower节点

场景应用
服务的动态上下线

分布式锁

zk实现的分布式锁请使用curator框架
集群zk的节点数
- 安装奇数台
- 生产经验值:
- 10台服务器,安装3台zk
- 20台服务器,安装5台zk
- 100台服务器,安装11台zk
- 200台服务器,安装11台zk
- 服务器台数多,好处是提高稳定性,坏处是通信延迟
zookeeper一致性问题
Paxos算法
角色:
Proposer(提案者),Acceptor(接收者)、Learner(学习者);每个节点可以身兼数职
三个阶段:
- 准备阶段
- Proposer向Acceptor发出Propose请求Promise(许可),无需携带提案内容
- Acceptor向Proposer发送同意此提案
- Accept接收阶段
- Proposer收到超过半数的Acceptor许可后,向Acceptor发出正式Propose
- Acceptor接收到提案后进行Accept处理
- Lean阶段
- Proposer将最终的提案发送给所有的Learners
存在的问题:多个提案者可能出现迟迟无法达成一致的问题,导致性能降低
ZAB算法
借鉴Paxos算法,只有一个提案者
包含两种模式:消息广播、崩溃恢复
源码
找到启动入口
1
2zkServer.sh start
ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
Zookeeper学习笔记
http://example.com/2023/03/09/Middleware/Zookeeper学习笔记/