ZooKeeper-案例 (多AZ高可用容灾)

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件。

我们前面部署3节点集群已经满足一般情况下的高可用,但是随着互联网的发展,集群的规模会越来越大,比如出现双AZ或者多AZ的情况下如何保证这种分布式集群的高可用性。下面我们以双AZ来讲解。(这里的AZ可以简单理解一个地区的不同的机房)

讲解这个双AZ之前,我们来讲解一个特殊角色:Observer 不参与 Leader 选举和事务提案(ZAB 协议)的投票过程,仅接收并同步 Leader 的事务日志。这一设计减少了投票阶段的网络通信开销,提升了集群的扩展性。

仅处理读请求Observer 可以响应客户端的读请求(如 getDataexists),但不处理写请求。这使其适合分担高并发读场景的压力。

所有我们这里准备了6个节点,AZ1:3个普通节点,AZ2:2个普通节点,一个OB节点。由于OB的特性,可以算这个集群只有5个节点,只要有3个节点就可以正常选举出来Leader。

如果AZ2宕机,则不影响整个集群的使用,因为他可以在AZ1还可以选举出来Leader。但是如果是AZ1宕机,则AZ2由于只有2个节点参与投票,所所以无法选举出来的Leader,ZooKeeper集群异常,需要手工介入修复(也是本次演示模式)。

当然如果你有3个AZ,则可以使用3+3+1方式,不配置OB节点,则可以正常选举Leader,但是3个AZ和2个AZ在实际情况下代价会高很多(云环境除外。所以我们这里介绍的是双AZ,手工介入。

#AZ1
server.1=192.168.31.140:2888:3888    
server.2=192.168.31.141:2888:3888
server.3=192.168.31.142:2888:3888

#模拟AZ2
server.4=192.168.31.140:12888:13888
server.5=192.168.31.141:12888:13888
server.6=192.168.31.142:12888:13888:observer

正常情况下,这个leader无论在哪里都可以正常使用。

[root@localhost ~]# python3 zk.py 
开始检查 ZooKeeper 节点状态...
192.168.31.140:2181 follower
192.168.31.140:12181 follower
192.168.31.141:2181 follower
192.168.31.141:12181 follower
192.168.31.142:2181 leader
192.168.31.142:12181 observer
检查完成!

这个时候我们主动关闭所有2181的ZooKeeper进程。由于OB节点原因,导致我们无法选举出来Leader。​​​​​​​

2025-04-29 00:04:52,384 [myid:] - DEBUG [WorkerReceiver[myid=6]:o.a.z.s.q.FastLeaderElection$Messenger$WorkerReceiver@359] - Receive new notification message. My id = 6
2025-04-29 00:04:52,384 [myid:] - INFO  [WorkerReceiver[myid=6]:o.a.z.s.q.FastLeaderElection$Messenger$WorkerReceiver@391] - Notification: my state:LOOKING; n.sid:5, n.state:LOOKING, n.leader:3, n.round:0x2, n.peerEpoch:0x6, n.zxid:0x500000000, message format version:0x2, n.config version:0x0
2025-04-29 00:04:52,384 [myid:] - DEBUG [QuorumPeer[myid=6](plain=[0:0:0:0:0:0:0:0]:12181)(secure=disabled):o.a.z.s.q.FastLeaderElection@724] - id: 3, proposed id: 3, zxid: 0x500000000, proposed zxid: 0x500000000
2025-04-29 00:04:52,384 [myid:] - DEBUG [QuorumPeer[myid=6](plain=[0:0:0:0:0:0:0:0]:12181)(secure=disabled):o.a.z.s.q.FastLeaderElection@1034] - Adding vote: from=5, proposed leader=3, proposed zxid=0x500000000, proposed election epoch=0x2

修改AZ2的配置,由于总数只有6个节点(过半原则),所以必须在AZ1节点选一个节点进行设置为OB节点。3个AZ2节点均修改完成并重启以后,集群就会恢复。​​​​​​​

server.1=192.168.31.140:2888:3888
server.2=192.168.31.141:2888:3888
server.3=192.168.31.142:2888:3888:observer
server.4=192.168.31.140:12888:13888
server.5=192.168.31.141:12888:13888
server.6=192.168.31.142:12888:13888

集群状态

[zk: 127.0.0.1:12181(CONNECTED) 4] get /zookeeper/config
2025-04-29 00:38:33,915 [myid:] - DEBUG [main:o.a.z.ZooKeeperMain@391] - Processing get
2025-04-29 00:38:33,917 [myid:127.0.0.1:12181] - DEBUG [main-SendThread(127.0.0.1:12181):o.a.z.ClientCnxn$SendThread@968] - Reading reply session id: 0x600002a659f0003, packet:: clientPath:null serverPath:null finished:false header:: 4,4  replyHeader:: 4,47244640267,0  request:: '/zookeeper/config,F  response:: #7365727665722e313d3139322e3136382e33312e3134303a323838383a333838383a7061727469636970616e74a7365727665722e323d3139322e3136382e33312e3134313a323838383a333838383a7061727469636970616e74a7365727665722e333d3139322e3136382e33312e3134323a323838383a333838383a6f62736572766572a7365727665722e343d3139322e3136382e33312e3134303a31323838383a31333838383a7061727469636970616e74a7365727665722e353d3139322e3136382e33312e3134313a31323838383a31333838383a7061727469636970616e74a7365727665722e363d3139322e3136382e33312e3134323a31323838383a31333838383a7061727469636970616e74a76657273696f6e3d30,s{0,0,0,1745857108303,-1,0,-1,0,288,0,0} 
server.1=192.168.31.140:2888:3888:participant
server.2=192.168.31.141:2888:3888:participant
server.3=192.168.31.142:2888:3888:observer
server.4=192.168.31.140:12888:13888:participant
server.5=192.168.31.141:12888:13888:participant
server.6=192.168.31.142:12888:13888:participant
version=0

​​​​​​​

当按照上面配置以后,恢复集群以后可正常提供服务,但是如果AZ1这个时候恢复,并且3个节点都启动成功,则会出现6个节点,2个Leader的情况(触发脑裂)。​​​​​​​

[zk: localhost:2181(CONNECTED) 4] get /zookeeper/config
2025-04-29 00:52:44,588 [myid:] - DEBUG [main:o.a.z.ZooKeeperMain@391] - Processing get
2025-04-29 00:52:44,591 [myid:localhost:2181] - DEBUG [main-SendThread(localhost:2181):o.a.z.ClientCnxn$SendThread@968] - Reading reply session id: 0x300004836990000, packet:: clientPath:null serverPath:null finished:false header:: 6,4  replyHeader:: 6,38654705665,0  request:: '/zookeeper/config,F  response:: #7365727665722e313d3139322e3136382e33312e3134303a323838383a333838383a7061727469636970616e74a7365727665722e323d3139322e3136382e33312e3134313a323838383a333838383a7061727469636970616e74a7365727665722e333d3139322e3136382e33312e3134323a323838383a333838383a7061727469636970616e74a76657273696f6e3d30,s{0,0,0,1745852983202,-1,0,-1,0,147,0,0} 
server.1=192.168.31.140:2888:3888:participant
server.2=192.168.31.141:2888:3888:participant
server.3=192.168.31.142:2888:3888:participant
version=0

如果这AZ1这3个节点只要有一个未启动则AZ1的3个ZooKeeper无法选举Leader。所以就需要保证AZ1的节点不能同时启动或者能够修改配置。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值