【zookeeper学习-7】zookeeper集群(伪集群搭建)

介绍

zookeeper在一个系统中,扮演着一个类似于“组织者”或者“协调者”的角色。如果只部署了一个zk服务,而且挂了,可能就会引起程序之间无法联动的问题。因此,部署一个zk集群是很有必要的。

zookeeper集群的搭建,需选举一个zk服务器作为leader。

Leader选举:

Serverid: 服务器ID,比如有三台服务器,编号分别是1,2,3,编号越大在选择算法中的权重越大。

Zxid:数据ID,服务器中存放的最大数据ID,值越大说明数据越新,在选举算法中数据越新权重越大。

在Leader选举的过程中,如果某台ZooKeeper获得了超过半数的选票,则此ZooKeeper就可以成为Leader了。

举例

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第1张图片

现在有五个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

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第2张图片

 第五步:配置集群

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

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第3张图片

 第六步:启动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

实验 

1. 集群超过半数节点启动,就已经可以选举出leader。

依次启动zk1、zk2、zk3,可以看到zk2被选为了leader,启动到zk2的时候,投票已超过集群的半数。

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第4张图片

2. 集群超过半数节点挂掉,整个集群都无法正常运行。

现在假设zk3出现了故障挂掉,把zk3关了。

zk1、zk2还是正常运行,因为还有半数以上的服务正常,leader也还是zk2。 

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第5张图片

再把zk1关掉。

zk2也不能正常运行了,因为超过半数以上的zk节点挂了,集群不能正常运行了。

将zk1重新启动,zk2重新成为leader,集群恢复正常。

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第6张图片

3. 当leader节点挂掉之后,会重新选举一个leader。

现在假设作为leader的zk2挂掉了。

zk1还是follwer,zk3变成了leader,集群依旧能正常运行。 

  • 【zookeeper学习-7】zookeeper集群(伪集群搭建)_第7张图片

 zk2恢复正常后,变成了follwer。

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第8张图片

集群角色

【zookeeper学习-7】zookeeper集群(伪集群搭建)_第9张图片

1. Leader领导者:

  • 处理事务请求
  • 集群内部各服务器的调度者

2. Follower跟随者:

  • 处理客户端非事务请求,转发事务请求给Leader服务器
  • 参与Leader选举投票

3. Observer 观察者:

  • 处理客户端非事务请求,转发事务请求给Leader服务器

你可能感兴趣的:(java-zookeeper,zookeeper,学习)