irpas技术客

Zookeeper 集群部署详解_LlinCK_zookeeper集群部署

网络投稿 5789

一、集群结构介绍

接收客户端请求的端口号 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 选择操作,过程如下:

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


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #zookeeper集群部署 #zookeeper #工作只 #假如有 #2