请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于主节点宕机的其他场景

假如:
主节点的offset:2000,
从节点1的offset:1500,

这个时候主节点宕机了,从节点1还没有来得及复制主节点上的数据,然后从节点1被选举成新的主节点,并开始接收producer发过来的数据,当从节点1的offset变成4000后,原来的主节点又恢复了,原来的主节点开始做数据对齐的操作。

这种情况下,是不是从节点1会丢失那500条消息(2000-1500=500)?
如果会丢失,要怎么处理?

正在回答 回答被采纳积分+3

1回答

LBruce 2025-01-04 12:09:51

这里我的想法是,利用之前讲过的主从复制机制。

1. 客户端发送消息到了主节点1,主节点1写入磁盘,但此时尚未回送确认ack给客户端。

2. 主节点1再把数据同步到从节点1,直到从节点1返回数据同步ack给主节点1,主节点再返回确认ack给客户端,表示该消息发送成功。

3. 如果主节点1写入磁盘,但从节点1尚未完成同步,主节点1就宕机了,客户端此时也并没有收到消息发送成功的ack,此时客户端会重投消息,给到主节点2,由主节点2写入磁盘,并做主从复制。

4. 主节点1恢复后,此时它已成为了从节点,它的offset不是最新的了,它将开始数据对齐动作,把主节点2的数据同步到本地。


主从复制(同步,异步,半同步),性能最高的是异步,但真的没法保证主节点1宕机时,至少有1个从节点已经复制了主节点1的最新数据,所以折中一下,开启半同步复制。

0 回复 有任何疑惑可以回复我~
  • 这个思路很不错!也可以看看kafka的设计,kafka采用了一种高水位的做法,在高吞吐和可靠性中作了一些折中,如果从节点的offset与主节点的offset差距过大,是不应该允许成为新主的。
    回复 有任何疑惑可以回复我~ 2025-01-06 08:52:55
  • LBruce 回复 Danny_Idea #2
    回复 Danny_Idea:老师过奖了,这个我也有了解过。从节点中offset最贴近主节点offset的节点,最有成为新主节点的话语权。忘了是以前学zookeeper还是学啥时了解到过这个思想,很多中间件其实底层来来回回用到的手段都差不多,都是一些共性的东西。
    回复 有任何疑惑可以回复我~ 2025-01-06 15:39:30
  • 提问者 慕勒2467293 #3
    谢谢。
    回复 有任何疑惑可以回复我~ 7天前
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信