一个关于 Raft 协议的疑问

2020-07-02 08:57:39 +08:00
 phpcyy

如果有 A 、B 、C 、D 、E 一共 5 个节点,A 是 Leader 。 原本的 logIndex 都是 3,如果 A 发送了 4 的日志,B 、C 确认,获得多数 ack,会返回 client 成功。

第一个问题: 这时候如果 Leader 挂掉,B 、C 还没来得及接收下次心跳进入 committed 状态,4 这条日志仍然能保存成功吗?

第二个问题: 如果这时候 A 、B 挂掉,4 这条日志还能确保可以成功保存吗?

最近在看 Raft 相关文章,都没理解上边的这个情况该如何处理,所以求教大家,不胜感激。

我的理解是第一种情况,需要获得多数节点 4 这条日志的状态,B 、C 加上必然存在该消息的 Leader,可以过半,因此可以保存成功。

第二种情况看起来系统已经不能正常工作了,无法确认这条 uncommited 的消息是否需要保存。

4540 次点击
所在节点    程序员
42 条回复
fishofcat
2020-07-03 13:12:45 +08:00
@Caskia 新的 leader 怎么回复 client 端?原先的 leadera 都挂掉了,长链接都断开了,原先的 leader 怎么知道 client 的地址的????应该是 client 会重新发起请求,然后新的 leader 根据某个条件判断是否请求过了。其实我没太搞懂的是 client 重发的时候服务端怎么判断已经请求过了。。。
Caskia
2020-07-03 14:40:48 +08:00
两种实现方式:
1. 如果超时,客户端会访问其他的任意服务,这时候服务会把新的 leader 给 client,所以 client 是可以跟新的 leader 进行交流的。
2. 如果是 client 重新发起请求,文档中有说过对发起的请求要做唯一性,也就是给每一个请求都有一个标号,这样服务端可以做幂等处理,新的 leader 看到这个重复的标号,那么就知道是之前处理过的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX