采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
假如: 主节点的offset:2000, 从节点1的offset:1500,
这个时候主节点宕机了,从节点1还没有来得及复制主节点上的数据,然后从节点1被选举成新的主节点,并开始接收producer发过来的数据,当从节点1的offset变成4000后,原来的主节点又恢复了,原来的主节点开始做数据对齐的操作。
这种情况下,是不是从节点1会丢失那500条消息(2000-1500=500)? 如果会丢失,要怎么处理?
这里我的想法是,利用之前讲过的主从复制机制。
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的最新数据,所以折中一下,开启半同步复制。
这个思路很不错!也可以看看kafka的设计,kafka采用了一种高水位的做法,在高吞吐和可靠性中作了一些折中,如果从节点的offset与主节点的offset差距过大,是不应该允许成为新主的。
回复 Danny_Idea:老师过奖了,这个我也有了解过。从节点中offset最贴近主节点offset的节点,最有成为新主节点的话语权。忘了是以前学zookeeper还是学啥时了解到过这个思想,很多中间件其实底层来来回回用到的手段都差不多,都是一些共性的东西。
谢谢。
登录后可查看更多问答,登录/注册
MQ大牛成长课--从0到1手写分布式消息队列中间件
50 4
136 3
85 3
204 2
88 2