zookeeper
-
Zookeeper 选举机制
-
当启动的服务器没有超过半数以上那么,那么每启动一个服务器就会发生一次选举,而每次票数最多的就是相应myid 最大的那一个服务器,最终在 已启动的服务器超过半数的时候,就会成为 leader,在产生leader 之前,所有的服务器的状态都是 LOOKING 状态,而当产生之后,leader 的状态就是 leading , 而其他的就是following。而只要这个leader 没有宕机,那么接下来启动的服务器都时following
-
集群非第一次启动的话,当一台服务器出现两种情况的时候
- 初始化启动
- 运行期间无法和服务器保持连接
就会进入选举流程
-
在进入选举流程后,会有两种情况
- 在集群中还有leader
如果还有leader 的话,那么,当其尝试去选举的时候,会被告知已经存在leader 了,
那么就会尝试和这台leader 去取得链接
- 在集群中没有leader
那么就会进入选举流程,当不是第一次启动的话,在选举的时候会先后比较三个因素,任期时长,事务数,服务器id,分别是EPOCH ,ZXID,SID
-
-
生产集群安装多少 zk 合适
- 安装奇数台
- 生产经验
- 10 3
- 20 5
- 100 11
- 200 11
- 生产经验
- 安装奇数台
-
监听器原理
- 有一个main 线程创建于客户端, 会创建两个两个线程
- 一个负责 网络通信(connect)
- 一个负责监听(listener)
- 通过 connect 线程 将注册的监听事件发送给 Zookeeper
- 在 Zookeeper 的注册监听列表中将注册的监听事件添加到列表中
- Zookeeper 监听到有数据或者路径的变化,就会将这个消息发送给listener 线程
- listener 线程内部调用了 process() 方法
- 有一个main 线程创建于客户端, 会创建两个两个线程
-
客户端向 服务端写数据的流程
- 客户端访问服务器分为两种情况 访问的时leader 和 访问的是 follower
- 当访问的是 leader 的时候,leader 是拥有写权限的,他会自己写一部分,还会将另一部分分发给 follower 进行 写操作,当follower 写操作完成的时候,会像leader 发送写ack 完成指针,标识写操作完成,那么当半数以上服务器都发送了ack 的时候,leader 就会向Client 进行应答,就会提交数据
- 当访问的是 follower 的时候,follower 会将写请求发送给leader ,然后leader 会组织写数据,人后将返回的ack 完成指针,发送给当时的follow,由 follower 提交给 Client
- 客户端访问服务器分为两种情况 访问的时leader 和 访问的是 follower
这样就保证了每个写入请求都会成功的写入到集群中,若有新的服务器加入进来,也会对Leader进行数据同步,来达到集群中数据的一致性。
- Zookeeper 动态上下线
- 服务器启动去Zookeeper 集群注册信息(注册的都是临时节点)
- 客户端获取服务器列表,并且注册监听
- 当某个服务器下线的时候,因为是 临时节点,所以相应的节点会删除
- 节点删除,就会通知客户端
- 客户端就会执行process ()方法重新获取服务器的监听列表,
- 达到如果要去访问服务器的时候,访问的都是 正常启动的服务器