侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

ZK集群

coydone
2022-05-18 / 0 评论 / 0 点赞 / 312 阅读 / 2,950 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

选举机制

选举流程简述

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/。

解压后得到如下目录:

运行成功后会弹出一个窗口:

连接成功:

0

评论区