点击关注公众号,k8s优秀车间主任及时送达


一、Zookeeper 介绍


ZooKeeper 是⼀种分布式协调服务,⽤于管理⼤型主机。在分布式环境中协调和管理服务是 ⼀个复杂的过程。ZooKeeper 通过其简单的架构和 API 解决了这个问题。ZooKeeper 允许开发⼈员专注于核⼼应⽤程序逻辑,⽽不必担⼼应⽤程序的分布式特性。

Zookeeper 集群与leader选举原理_配置文件


二、数据结构



ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识。



Zookeeper 集群与leader选举原理_服务器_02


三、应用场景


一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。



四、Zookeeper Linux 服务器端聚群搭建


我这边就用一台服务器作为模拟环境。


Zookeeper 集群与leader选举原理_配置文件_03


第一步:拷贝拷贝三份配置文件,分别为zoo1.cfg、zoo2.cfg、zoo3.cfg。


​zoo1.cfg 配置文件如下:​

Zookeeper 集群与leader选举原理_配置文件_04


​zoo2.cfg 配置文件如下:​

Zookeeper 集群与leader选举原理_服务器_05


​zoo3.cfg 配置文件如下:​

Zookeeper 集群与leader选举原理_配置文件_06


​zookeeper 的三个端口作用​


  • 1、​2181​ 、​2182​、​2183​: 对 client 端提供服务
  • 2、​2001​、​2002​、​2003​: 集群内机器通信使用
  • 3、​3001​、​3002​、​3003​ 选举 leader 使用


第二步、添加4个节点myid,并且设值

/usr/local/zookeeper/zkdata/zk1# echo 1 > myid /usr/local/zookeeper/zkdata/zk2# echo 2 > myid /usr/local/zookeeper/zkdata/zk3# echo 3 > myid /usr/local/zookeeper/zkdata/zk4# echo 4 > myid


第三步、启动服务

Zookeeper 集群与leader选举原理_zookeeper_07


第四步、查看状态


​zoo1信息​

Zookeeper 集群与leader选举原理_服务器_08


​zoo2信息​

Zookeeper 集群与leader选举原理_zookeeper_09


​zoo3信息​

Zookeeper 集群与leader选举原理_zookeeper_10


最后显示集群搭建成功!Mode:leader 代表主节点,follower 代表从节点,一主二从。


五、Zookeeper 集群选举过程



zookeeper 的 leader 选举存在两个阶段,一个是服务器启动时 leader 选举,另一个是运行过程中 leader 服务器宕机。在分析选举原理前,先介绍几个重要的参数。


  • 服务器 ID(myid):编号越大在选举算法中权重越大
  • 事务 ID(zxid):值越大说明数据越新,权重越大
  • 逻辑时钟(epoch-logicalclock):同一轮投票过程中的逻辑时钟值是相同的,每投完一次值会增加



选举状态


  • LOOKING​: 竞选状态
  • FOLLOWING​: 随从状态,同步 leader 状态,参与投票
  • OBSERVING​: 观察状态,同步 leader 状态,不参与投票
  • LEADING​: 领导者状态


集群上线时的Leader选举过程


Zookeeper 集群与leader选举原理_服务器_11



以上述案例为讲解:

1、服务器1启动,此时服务器1为looking状态,服务器1会生成一张选票投自己。这时服务器1票数只有一票,票数没能够过半。选举无法正常进行,服务器1还得处于looking。

2、服务器2启动,再次发起一次选举,服务器1和2分别会投自己一票和相互交换选票,此时选票已经过半。服务器2因此当选为leader。

3、服务器3启动,发现集群已经选举出了leader,于是自己就作为小弟follower。


​**注:崩溃恢复时的Leader选举。Leader建⽴完后,Leader周期性地不断向Follower发送⼼跳(ping命令,没有内容的 socket)。当Leader崩溃后,Follower发现socket通道已关闭,于是Follower开始进⼊到 Looking状态,重新回到上⼀节中的Leader选举过程,此时集群不能对外提供服务。**​




注重点 :选举机制



选举机制 半数机制,超过半数的投票通过,即通过。

(1)第一次启动选举规则:投票过半数时,服务器 id 大的胜出

(2)第二次启动选举规则:

①EPOCH 大的直接胜出

②EPOCH 相同,事务 id 大的胜出

③事务 id 相同,服务器 id 大的胜出