Zookeeper 集群部署详解

一、集群结构介绍

接收客户端请求的端口号 2181
集群之间数据同步端口号 3888
集群选举端口号 只有leader会监听 2888
flower 会随机打开一个端口向2888请求数据
只有leader才能写,写完才同步到flower
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、集群角色介绍

在这里插入图片描述

三、Zookeeper 集群特性

整个集群中只要有超过集群数量一半的 zookeeper 工作只 正常的,那么整个集群对外就是可用的。
假如有 2 台服务器做了一个 zookeeper 集群,只要有任何一台故障或宕机,那么这个 zookeeper 集群就不可用了,因为 剩下的一台没有超过集群一半的数量。
但是假如有三台 zookeeper 组成一个集群, 那么损坏一台就还剩两台,大于 3 台的一半,所以损坏一台还是可以正常运行的, 但是再损坏一台就只剩一台集群就不可用了。
那么要是 4 台组成一个 zookeeper 集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么 2 台不大于 集群数量的一半。
所以 3 台的 zookeeper 集群和 4 台的 zookeeper 集群损坏两台 的结果都是集群不可用,以此类推 5 台和 6 台以及 7 台和 8 台都是同理,所以这也就是为什么集群一般都是奇数的原因

如果有数据写入leader,一般来讲其余所有的zk完成写入才是真正的写入完成。
但是在三台zk的情况下,只要有一台flower返回给leader写入成功即可。可以忽略一台zk是否写入。
这就是半同步机制。

四、集群选举

初期:
比较事物ID,一般都没有数据,所以所有zk的事物ID一致
再者比较server ID,谁的大,谁选举为leader

后期:
比较事物ID

五、Zookeeper 集群环境

zk-node1:10.0.0.31 
zk-node2:10.0.0.32 
zk-node3:10.0.0.33

各 zookeeper 服务器都配置 java 环境并部署 zookeeper 集群

apt install openjdk-8-jdk -y

cd /usr/local/src
wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar xvf apache-zookeeper-3.6.3-bin.tar.gz
ln -sv /usr/local/src/apache-zookeeper-3.6.3-bin /usr/local/zookeeper    #对 zookeeper 做软连接
'/usr/local/zookeeper' -> '/usr/local/src/apache-zookeeper-3.6.3-bin'

cd /usr/local/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg    #基于模板配置文件生成配置文件

mkdir /usr/local/zookeeper/data #创建数据目录

六、Zookeeper 集群配置

grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg #配置文件内容 
tickTime=2000 #服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒 
initLimit=10 #集群中 leader 服务器与 follower 服务器初始连接心跳次数,即多少 个 2000 毫秒 
syncLimit=5 # leader 与 follower 之间连接完成之后,后期检测发送和应答的心跳 次数,如果该 follower 在设置的时间内(5*2000)不能与 leader 进行通信,那么此 follower 将被视为不可用。 
dataDir=/usr/local/zookeeper/data #自定义的 zookeeper 保存数据的目录 
clientPort=2181 #客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个 端口,接受客户端的访问请求 
maxClientCnxns=128 #单个客户端 IP 可以和 zookeeper 保持的连接数 
autopurge.snapRetainCount=3 #3.4.0 中的新增功能:启用后,ZooKeeper 自动清 除功能会将 autopurge.snapRetainCount 最新快照和相应的事务日志分别保留在 dataDir 和 dataLogDir 中,并删除其余部分,默认值为 3。最小值为 3。 
autopurge.purgeInterval=1 # 3.4.0 及之后版本,ZK 提供了自动清理日志和快照 文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个 1 或更大的 整数,默认是 0,表示不开启自动清理功能 
server.1=172.18.0.101:2888:3888 # server.服务器编号=服务器 IP:LF 数据同步端 口:LF 选举端口 
server.2=172.18.0.102:2888:3888 
server.3=172.18.0.103:2888:3888

echo "1" > /usr/local/zookeeper/data/myid #自己的集群 id 要拷贝到配置文件所指定的dataDir目录下
scp zoo.cfg 172.18.0.103:/usr/local/zookeeper/conf/zoo.cfg #将配置文件分发至 其他服务器
scp zoo.cfg 172.18.0.103:/usr/local/zookeeper/conf/zoo.cfg

zk1、zk2、zk3的配置文件一致

zk1配置

root@zk1:~# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.31:2888:3888
server.2=10.0.0.32:2888:3888
server.3=10.0.0.33:2888:3888

root@zk1:~# echo "1" > /usr/local/zookeeper/data/myid

zk2配置

root@zk2:~# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.31:2888:3888
server.2=10.0.0.32:2888:3888
server.3=10.0.0.33:2888:3888

root@zk2:~# echo "2" > /usr/local/zookeeper/data/myid

zk3配置

root@zk3:~# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.31:2888:3888
server.2=10.0.0.32:2888:3888
server.3=10.0.0.33:2888:3888

root@zk3:~# echo "3" > /usr/local/zookeeper/data/myid

七、各 Zookeeper 服务器启动

/usr/local/zookeeper/bin/zkServer.sh start

八、验证 zookeeper 集群状态

root@zk1:/usr/local/zookeeper/conf# /usr/local/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

root@zk2:/usr/local/zookeeper/conf# /usr/local/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

root@zk3:/usr/local/zookeeper/conf# /usr/local/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

九、Zookeeper 集群选举过程

9.1 节点角色状态

LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程 
LEADING:领导者状态,处于该状态的节点说明是角色已经是 Leader 
FOLLOWING:跟随者状态,表示 Leader 已经选举出来,当前节点角色是 follower 
OBSERVER:观察者状态,表明当前节点角色是 observer

9.2 选举 ID

选举 ID: ZXID(zookeeper transaction id):每个改变 Zookeeper 状态的操作都会形成一个对应的 zxid (zookeeper事物ID)。 
myid:服务器的唯一标识(SID),通过配置 myid 文件指定,集群中唯一。

9.3 leader 选举过程

当集群中的 zookeeper 节点启动以后,会根据配置文件中指定的 zookeeper 节点 地址进行 leader 选择操作,过程如下:

  1. 每个 zookeeper 都会发出投票,由于是第一次选举 leader,因此每个节点都 会把自己当做 leader 角色进行选举,每个 zookeeper 的投票中都会包含自己 的 myid 和 zxid,此时 zookeeper 1 的投票为 myid 为 1,初始 zxid 有一个初始 值,后期会随着数据更新而自动变化,zookeeper2 的投票为 myid 为 2,初始 zxid 为初始生成的值。
  2. 每个节点接受并检查对方的投票信息,比如投票时间、是否状态为 LOOKING 状态的投票。
  3. 对比投票,优先检查 xvid,如果 xvid 不一样则 xvid 大的为 leader,如果 xvid 相同则继续对比 myid,myid 大的一方为 leader 。

成为 Leader 的必要条件: Leader 要具有最高的 zxid;当集群的规模是 n 时,集 群中大多数的机器(至少 n/2+1)得到响应并 follow 选出的 Leader。

心跳机制:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法 响应 PING 时,将重新发起 Leader 选举。

9.4 投票日志

Zookeeper1 的投票日志

root@zk1:~# vim /usr/local/zookeeper/logs/zookeeper-root-server-zk1.out
2021-07-29 15:08:33,900 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:3, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:33,902 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:2, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:34,107 [myid:1] - INFO  [QuorumPeer[myid=1](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@858] - Peer state changed: following
2021-07-29 15:08:34,107 [myid:1] - INFO  [QuorumPeer[myid=1](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@1465] - FOLLOWING

Zookeeper2 的投票日志

root@zk2:/usr/local/zookeeper/conf# vim /usr/local/zookeeper/logs/zookeeper-root-server-zk2.out
2021-07-29 15:08:33,896 [myid:2] - INFO  [WorkerReceiver[myid=2]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:3, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:33,899 [myid:2] - INFO  [WorkerReceiver[myid=2]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:2, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:33,902 [myid:2] - INFO  [WorkerReceiver[myid=2]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:1, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:34,106 [myid:2] - INFO  [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@858] - Peer state changed: following
2021-07-29 15:08:34,106 [myid:2] - INFO  [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@1465] - FOLLOWING

Zookeeper3 的投票日志

root@zk3:/usr/local/zookeeper/conf# vim /usr/local/zookeeper/logs/zookeeper-root-server-zk3.out
2021-07-29 15:08:33,820 [myid:3] - INFO  [WorkerReceiver[myid=3]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:1, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:33,821 [myid:3] - WARN  [SendWorker:1:QuorumCnxManager$SendWorker@1294] - Send worker leaving thread id 1 my id = 3
2021-07-29 15:08:33,821 [myid:3] - INFO  [WorkerReceiver[myid=3]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:2, n.state:LOOKING, n.leader:2, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:33,822 [myid:3] - INFO  [WorkerReceiver[myid=3]:FastLeaderElection$Messenger$WorkerReceiver@389] - Notification: my state:LOOKING; n.sid:2, n.state:LOOKING, n.leader:3, n.round:0x1, n.peerEpoch:0x0, n.zxid:0x0, message format version:0x2, n.config version:0x0
2021-07-29 15:08:34,027 [myid:3] - INFO  [QuorumPeer[myid=3](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@858] - Peer state changed: leading
2021-07-29 15:08:34,027 [myid:3] - INFO  [QuorumPeer[myid=3](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@1477] - LEADING
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值