Zookeeper 从入门到精通Zookeeper 原理
Posted 思想累积
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper 从入门到精通Zookeeper 原理相关的知识,希望对你有一定的参考价值。
1.1 选举机制
- 半数机制:集群中半数以上的机器存活,集群可用,所以 Zookeeper 适合安装奇数台服务器,存活服务器要大于挂掉的服务器
- Zookeeper 在配置文件中没有指定 Master 和 Slave。但是,Zookeeper 工作时,有一个节点作为 Leader,其它为 Follower,leader 通过内部选举机制临时产生。
- 多个服务器同时启动的话,选举 myid 最大的作为 leader
- 多个服务器依次启动的话,第一个启动处于 looking 状态,第二个启动之后 编号大,但投票数未超过半数,均处于 looking 状态。第三台服务器启动之后,编号最大所以第三台胜出,成为 leader,其它服务器成为 follower,第四台启动之后虽然编号大,但是第三台服务器已经胜出,所以第四台服务器成为 follower
- 如果正常运行的 Zookeeper 集群有机器 down 掉,需要重新选举的话,选举的过程需要加入
数据 id(数据的 version)
服务器 id(myid)
逻辑时钟(每次选举对应一个值,从 0 开始)
等。逻辑时钟小的选举结果忽略,重新投票。统一逻辑时钟后,数据 id 大的胜出,数据 id 相同的话,服务器 id 大的胜出
1.2 节点类型
- 持久(Persistent)
- 客户端与 Zookeeper 断开连接后,节点仍然存在,持久化顺序编号目录节点
- 短暂(Ephemeral)
- 客户端与 Zookeeper 断开连接后,节点被删除
1.3 Stat 结构体
- czxid
- 创建节点的事务 id,每次修改 Zookeeper 的状态都会收到一个 zxid 形式的时间戳,事务id 是 Zookeeper 中所有修改总的次序,每个修改都有唯一的 zxid
- ctime-znode
- 被创建的毫秒数
- mzxid-znode
- 最后更新的事务 zxid
- mtime-znode
- 最后修改的毫秒数
- pZxid-znode
- 最后更新的子节点 zxid
- cversion-znode
- 子节点变化号,znode 子节点修改次数
- dataversion-znode
- 数据变化号
- aclVersion
- 访问控制列表的变化号
- ephemeralOwner-
- 如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点为 0
- dataLength-znode
- 数据长度
- numChildren-znode
- 子节点数量
1.4 监听器原理
- 首先有一个 main() 线程
- 在 main 线程中创建 Zookeeper 客户端,这个时候会创建两个线程,一个 connect 负责网络连接,一个 listener 负责监听
- 通过 listener 将注册的监听事件发送给 Zookeeper
- 在 Zookeeper 注册监听列表中将注册的监听事件添加到列表中
- Zookeeper 监听到有数据或者路径发生变化,将消息发送给 listener 线程
- listener 线程内部调用 process() 方法
1.5 写数据流程
- 客户端向 Zookeeper 的 Server 上写数据,发送一个请求
- Server 会将接收到的请求转发给 leader,leader 将请求广播给各个 Server,各个 Server 写成功后会通知 leader
- 当 leader 收到大多数 Server 数据写成功了,就说明数据写成功了。leader 告诉第一个发送过来请求的 Server 数据写成功了
- Server 通知客户端数据写成功后,操作完成
以上是关于Zookeeper 从入门到精通Zookeeper 原理的主要内容,如果未能解决你的问题,请参考以下文章
《黑马ZooKeeper教程(ZooKeeper框架入门到精通)》