一个重要的机制----选举机制
原则:集群中半数以上机器存活,集群可用。所以 Zookeeper 适合安装奇数台服务器。
Zookeeper 虽然在配置文件中并没有指定 Master 和 Slave 。但是 Zookeeper工作时,是有一个节点为 Leader ,其他则为 Follower,Leader 是通过内部的选举机制临时产生的。
以一个简单的例子来说明整个选举的过程。
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,存放数据量都是一样的。假设这些服务器按照顺序启动,来看看会发生什么,如图
(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,默认投给id较大的,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。
(5)服务器5启动,同4一样当小弟。
具体搭建过程
机器编号 | IP地址 | 端口 |
---|---|---|
zk1 | xxx | 2181 |
zk-2 | xxx | 2182 |
zk-3 | xxx | 2183 |
1、在 /usr/local/zk-cluster 目录下先复制一个 Zookeeper ,并重命名为 zk-1,在 zk-1 下新建 log 和 data 目录
2、在data 目录创建 myid 文件,写一个标识(1,2,3)
3、修改 zoo.cfg
4、复制两个 zk-1,并改名为 zk-2、zk-3
5、修改 zk-2 和 zk-3 中的 myid 文件和 zoo.cfg 文件
6、分别启动三个 Zookeeper
7、连接三个cli
注意:
在高版本中 log 目录可以不建立,默认会在 data 目录中记录日志
# 复制并重命名
cp -r /usr/local/zookeeper /usr/local/zk-cluster/zk-1
# 进入
cd zk-1
# 创建log和data目录
mkdir log
mkdir data
# 创建myid文件
touch /usr/local/zk-cluster/zk-1/data/myid
# 写一个数字1进去
vim /usr/local/zk-cluster/zk-1/data/myid
# 修改 zoo.cfg
vim /usr/local/zk-cluster/zk-1/conf/zoo.cfg
zk-1的zoo.cfg内容如下:
# 通信心跳数,取默认值
tickTime=2000
# LF初始通信时限
initLimit=10
# LF同步通信时限
syncLimit=5
# 指定data和log的保存目录
dataDir=/usr/local/zk-cluster/zk-1/data
dataLogDir=/usr/local/zk-cluster/zk-1/log
# 端口
clientPort=2181
# 集群配置
# 1,2,3 来自于data目录中的myid文件,该文件保存了当前集群的标识
# 2888,2889,2890为内部通信的端口,可以相同,只要不占用系统资源
# 3888,3889,3890为内部选举端口,可以相同,只要不占用系统资源
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
# 复制两个 zk-1,并改名为 zk-2、zk-3
cp -r zk-1 /usr/local/zk-cluster/zk-2
cp -r zk-1 /usr/local/zk-cluster/zk-3
# 修改 zk-2 和 zk-3 中的 myid 文件和 zoo.cfg 文件
# 把zk-2中的myid文件改为2,把zk-3中的myid文件改为3
vim ./zk-2/data/myid
vim ./zk-3/data/myid
# 修改zoo.cfg 文件
vim ./zk-2/conf/zoo.cfg
vim ./zk-3/conf/zoo.cfg
zk-2的zoo.cfg
zk-3的zoo.cfg
注意:按顺序启动,2为 leader
# 分别启动三个 Zookeeper
./zk-1/bin/zkServer.sh start
./zk-2/bin/zkServer.sh start
./zk-3/bin/zkServer.sh start
# 连接三个cli
cd /usr/local/zk-cluster/zk-1/bin/
./zkCli.sh -server 127.0.0.1:2181
cd /usr/local/zk-cluster/zk-2/bin/
./zkCli.sh -server 127.0.0.1:2182
cd /usr/local/zk-cluster/zk-3/bin/
./zkCli.sh -server 127.0.0.1:2183
三台Zookeeper都可以读写操作。
关于不同加载顺序选举 leader 的问题
原则:谁的 myid 大,票就投给谁,直到选举成功(票数超过 Zookeeper 半数就选举成功),选举成功之后,将不再进行选举,只有投出 Leader 这个集群才能跑起来。
1、按照顺序 1 2 3启动
2 是Leader
2、倒序 3 2 1 启动
3 是Leader
3、启动顺序为:2 3 1
3是 Leader