选举机制
选举流程简述
1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
3)以一个简单的例子来说明整个选举的过程。
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图:
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1、2、3、4、5,按编号依次启动,它们的选择举过程如下:
-
服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
-
服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是Looking。
-
服务器3启动,给自己投票,同时与之前启动的服务器1、2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1、2成为小弟。
-
服务器4启动,给自己投票,同时与之前启动的服务器1、2、3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
-
服务器5启动,后面的逻辑同服务器4成为小弟。
选举机制中的概念
Serverid:服务器ID。比如有三台服务器,编号分别是1、2、3。编号越大在选择算法中的权重越大。
Zxid:数据ID。服务器中存放的最大数据ID。值越大说明数据越新,在选举算法中数据越新权重越大。
Epoch:逻辑时钟。或者叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。
Server状态:选举状态。
-
LOOKING,竞选状态。
-
FOLLOWING,随从状态,同步leader状态,参与投票。
-
OBSERVING,观察状态,同步leader状态,不参与投票。
-
LEADING,领导者状态。
集群搭建
集群规划
机器编号 | Ip 地址 | 端口 |
---|---|---|
Zk-1 | 192.168.120.131 | 2181 |
Zk-2 | 192.168.120.131 | 2182 |
Zk-3 | 192.168.120.131 | 2183 |
Linux下集群搭建
#新建一个集群的文件夹
cd /usr/local/
mkdir zk-cluster
cd zk-cluster/
#准备三个zookeeper
cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk1/
cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk2/
cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk3/
#修改配置文件(以zk1为例,其它类似,修改数据、日志存放)
[root@localhost zk-cluster]# vim zk1/conf/zoo.cfg
#隔间时间的单位,以后它是配置时间的一个单位
tickTime=2000
# 10 * 2000 = 时间 初始化超时时间,和集群里面的机器交流,最大的间隔时间,若超过该时间,则认为超时
initLimit=10
# 同步数据的超时时间,小弟从大佬里面复制数据,超时的时间为 5 * 2000
syncLimit=5
# zookeeper 的数据目录,三个zk 的数据目录需要不同才行
dataDir=/usr/local/zk-cluster/zk1/data
# zookeeper的日志目录
dataLogDir=/usr/local/zk-cluster/zk1/log
# zookeeper 的client的端口号
clientPort=2181
# 集群的配置文件
#第几个服务器(1,2,3来自数据目录的一个myid文件,该文件里面保存着当前集群的标识(1,2,3))
# 后面的ip代表将绑定那个ip地址 第一个端口:代表在集群内部,数据复制的接口 第二个端口代表:选举端口
server.1=192.168.120.131:2888:3888
server.2=192.168.120.131:2889:3889
server.3=192.168.120.131:2887:3887
#创建data目录和日志目录log
[root@localhost zk-cluster]# mkdir zk1/data zk1/log
[root@localhost zk-cluster]# mkdir zk2/{data,log}
[root@localhost zk-cluster]# mkdir zk3/{data,log}
#给数据目录里面新建一个myid文件
[root@localhost zk-cluster]# touch zk1/data/myid
[root@localhost zk-cluster]# touch zk2/data/myid
[root@localhost zk-cluster]# touch zk3/data/myid
#给myid里面加入一个值为 1(zk1)、2(zk2)、3(zk3)
[root@localhost zk-cluster]# vim zk1/data/myid
[root@localhost zk-cluster]# vim zk2/data/myid
[root@localhost zk-cluster]# vim zk3/data/myid
#启动测试
[root@localhost zk-cluster]# ./zk1/bin/zkServer.sh start
[root@localhost zk-cluster]# ./zk2/bin/zkServer.sh start
[root@localhost zk-cluster]# ./zk3/bin/zkServer.sh start
#查看状态
[root@localhost zk-cluster]# ./zk1/bin/zkServer.sh status
测试
[root@localhost zk-cluster]# ./zk1/bin/zkCli.sh -server 127.0.0.1:2181
[root@localhost zk-cluster]# ./zk2/bin/zkCli.sh -server 127.0.0.1:2182
[root@localhost zk-cluster]# ./zk3/bin/zkCli.sh -server 127.0.0.1:2183
在zk1下面创建一个节点,看看zk2和zk3下面有没有:
客户端连接
我们可以使用图形化工具的客户端连接Zookeeper。
Zookeeper 数据查看工具 ZooInspector。
官网下载:https://issues.apache.org/jira/secure/attachment/12436620/。
解压后得到如下目录:
运行成功后会弹出一个窗口:
连接成功:
评论区