一. 配置集群

1. 准备多台ZooKeeper服务器   

2. 配置ZooKeeper服务器

在每台服务器的conf/zoo.cfg文件中添加如下内容:

server.20=192.168.4.20:2888:3888
server.21=192.168.4.21:2888:3888
server.22=192.168.4.22:2888:3888

格式: server.A=B:C:D
A表示这台服务器的编号ID,是一个数字
B表示服务器的IP地址或域名
C表示这台服务器与集群中的Leader交换信息时使用的端口
D表示执行选举Leader服务器时互相通信的端口

3. 创建myid配置文件

在集群环境下,需要在dataDir 目录中创建一个名为myid 的文件,文件内容是当前服务器的编号
ID,即上面配置的A

cd data
echo A的值 > myid

ZooKeeper启动时会读取这个文件,将里面的数字与zoo.cfg中配置的server.A进行比较,从而判断这台服务器是哪个

4.开启zookeeper

开启3台虚拟机的zookeeper程序

/usr/local/zookeeper/bin/zkServer.sh start

开启成功后查看zookeeper集群的状态

/usr/local/zookeeper/bin/zkServer.sh status

出现Mode:follower或是Mode:leader则代表成功


二:集群特性

  • 一个ZooKeeper集群中,有一个领导者Leader和多个跟随者Follower
  • Leader负责进行投票的发起和决议,更新系统状态
  • Follower用于接收客户端的请求并向客户端返回结果,在选举Leader过程中参与投票
  • 半数机制:可用节点数量>总节点数量/2
  • 全局数据一致:集群中每台服务器保存一份相同的数据副本,不论客户端连接到哪个服务器,数据都是
    一致的
  • 更新请求顺序执行:来自同一个客户端的更新请求,按其发送顺序依次执行
  • 数据更新的原子性:一次数据更新,要么成功,要么失败
  • 实时性:在一定的时间范围内,客户端能读取到最新数据

 


三:选举机制

 

ZooKeeper在提供服务时会自动选举一个节点服务器作为Leader,其他都是Follower

zookeeper 设置隔离 zookeeper设置myid_zookeeper

选举流程:

  1. Server1启动,给自己投票,然后发送投票信息,由于其它服务器都还没启动,所以它发现的消息收不到任何反馈,此时Server1为Looking(竞选)状态
  2. Server2启动,给自己投票,同时与Server1通信交换选举结果,由于Server2的id值较大,所以Server2胜出,但由于投票数没有过半,此时Server1和Server2都为Looking状态
  3. Server3启动,给自己投票,同时与Server1和Server2通信交换选举结果,由于Server3的id值较大,所以Server3胜出,此时票数已经过半,所以Server3为Leader,Server1和Server2为Follower
  4. Server4启动,给自己投票,同时与Server1、Server2、Server3通信交换选举结果,尽管Server4的id较大,但由于集群中已经存在Leader,所以Server4只能为Follower
  5. Server5启动,同Server4类似,只能为Follower

总结:

 

  • 每个服务器在启动时都会选择自己,然后将投票信息发送出去
  • 服务器编号ID越大,在选择算法中的权重越大
  • 投票数必须过半,才能选出Leader
  • 谁是Leader:启动顺序的前集群数/2+1 个服务器中,id值最大的会成为Leader