首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Zookeeper-案例 (多AZ高可用容灾)

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

作者头像
运维小路
发布2025-05-22 10:39:00
发布2025-05-22 10:39:00
2970
举报
文章被收录于专栏:运维小路运维小路

前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解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,手工介入。

代码语言:javascript
复制
#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无论在哪里都可以正常使用。

代码语言:javascript
复制
[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。

代码语言:javascript
复制
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节点均修改完成并重启以后,集群就会恢复。

代码语言:javascript
复制
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

集群状态

代码语言:javascript
复制
[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的情况(触发脑裂)。

代码语言:javascript
复制
[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的节点不能同时启动或者能够修改配置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档