赞
踩
接收客户端请求的端口号 2181
集群之间数据同步端口号 3888
集群选举端口号 只有leader会监听 2888
flower 会随机打开一个端口向2888请求数据
只有leader才能写,写完才同步到flower
整个集群中只要有超过集群数量一半的 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
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 #创建数据目录
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
/usr/local/zookeeper/bin/zkServer.sh start
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
LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程
LEADING:领导者状态,处于该状态的节点说明是角色已经是 Leader
FOLLOWING:跟随者状态,表示 Leader 已经选举出来,当前节点角色是 follower
OBSERVER:观察者状态,表明当前节点角色是 observer
选举 ID: ZXID(zookeeper transaction id):每个改变 Zookeeper 状态的操作都会形成一个对应的 zxid (zookeeper事物ID)。
myid:服务器的唯一标识(SID),通过配置 myid 文件指定,集群中唯一。
当集群中的 zookeeper 节点启动以后,会根据配置文件中指定的 zookeeper 节点 地址进行 leader 选择操作,过程如下:
成为 Leader 的必要条件: Leader 要具有最高的 zxid;当集群的规模是 n 时,集 群中大多数的机器(至少 n/2+1)得到响应并 follow 选出的 Leader。
心跳机制:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法 响应 PING 时,将重新发起 Leader 选举。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。