zookeeper在一个系统中,扮演着一个类似于“组织者”或者“协调者”的角色。如果只部署了一个zk服务,而且挂了,可能就会引起程序之间无法联动的问题。因此,部署一个zk集群是很有必要的。
zookeeper集群的搭建,需选举一个zk服务器作为leader。
Leader选举:
Serverid: 服务器ID,比如有三台服务器,编号分别是1,2,3,编号越大在选择算法中的权重越大。
Zxid:数据ID,服务器中存放的最大数据ID,值越大说明数据越新,在选举算法中数据越新权重越大。
在Leader选举的过程中,如果某台ZooKeeper获得了超过半数的选票,则此ZooKeeper就可以成为Leader了。
现在有五个zk服务端,在这五个里面选一个Leader出来。
zk1先启动,然后投票,发现只有自己启动了,就给自己投了一票。但是该投票无效,因为投票未过半数。
然后zk2启动,再次投票,按照编号大小排,因为编号2大于1,zk1投给了zk2,zk2投给了自己,zk2得了两票。但是此轮投票也是无效,投票仍然未过半数。
然后zk3启动,再次投票,按照编号大小排,zk1和zk2都投给了zk3,zk3也投给了自己。此次投票过了半数,因此在这个集群中zk3选举为Leader。
然后zk4、zk5启动,无需再次投票,因为zk3已经被选为该集群的Leader。
真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动很多个虚拟机内存会吃不消,所以我们通常会描建伪集群,也就是把所有的服务都搭建在一台虚拟机上, 用端口进行区分。
我们这里要求描建一个三个节点的Zookeeper集群(伪集群)。在同一个服务器,安装3个端口不同的zk服务器。
第一步:创建一个zk集群文件夹,用于存放zk的安装目录。
mkdir /usr/local/zookeeper-cluster
第二步:把之前安装好的zk目录复制到这个文件夹,复制3份。
cp -r apache-zookeeper-3.6.4-bin /usr/local/zookeeper-cluster/zookeeper-1
cp -r apache-zookeeper-3.6.4-bin /usr/local/zookeeper-cluster/zookeeper-2
cp -r apache-zookeeper-3.6.4-bin /usr/local/zookeeper-cluster/zookeeper-3
第三步:每个zk目录都删除掉原来的data文件夹,然后重新建一个data文件夹
rm -rf /usr/local/zookeeper-cluster/zookeeper-1/data
rm -rf /usr/local/zookeeper-cluster/zookeeper-2/data
rm -rf /usr/local/zookeeper-cluster/zookeeper-3/data
mkdir /usr/local/zookeeper-cluster/zookeeper-1/data
mkdir /usr/local/zookeeper-cluster/zookeeper-2/data
mkdir /usr/local/zookeeper-cluster/zookeeper-3/data
第四步:把每个zk目录的conf下的zoo.cfg配置,修改新的data目录路径和端口
vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
第五步:配置集群
1. 在每个zk目录的data目录创建一个myid文件,内容分别是1、2、3。这个文件就是记录每个服务器的id
echo 1 >/usr/local/zookeeper-cluster/zookeeper-1/data/myid
echo 2 >/usr/local/zookeeper-cluster/zookeeper-2/data/myid
echo 3 >/usr/local/zookeeper-cluster/zookeeper-3/data/myid
2. 给每个zk目录的zoo.cfg配置集群服务器ip列表
vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
ip列表
server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口
server.1=192.168.59.128:2881:3881
server.2=192.168.59.128:2882:3882
server.3=192.168.59.128:2883:3883
第六步:启动zk集群服务器
sh /usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
sh /usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
sh /usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start
依次启动zk1、zk2、zk3,可以看到zk2被选为了leader,启动到zk2的时候,投票已超过集群的半数。
现在假设zk3出现了故障挂掉,把zk3关了。
zk1、zk2还是正常运行,因为还有半数以上的服务正常,leader也还是zk2。
再把zk1关掉。
zk2也不能正常运行了,因为超过半数以上的zk节点挂了,集群不能正常运行了。
将zk1重新启动,zk2重新成为leader,集群恢复正常。
现在假设作为leader的zk2挂掉了。
zk1还是follwer,zk3变成了leader,集群依旧能正常运行。
zk2恢复正常后,变成了follwer。
1. Leader领导者:
2. Follower跟随者:
3. Observer 观察者: