Raft算法以超半数写入即确认保存成功, 那如果访问的正好是没写入那个节点,怎么保证一致

假设有A, B, C, D, E 5个节点(当前状态都是x), 客户端发送一个状态更新请求 x->y, 写入了A, B, C三个节点, 然后被确认保存了(A, B, C都committed).

  1. 如果在D, E还未同步到y的时候(D, E中没有uncommited的状态), 客户端去D拿状态了, 此刻D的状态还是x, 这时候怎么保证一致性?
  2. 如果D中的y状态尚处于uncommitted, 客户端去D拿状态了, 此时又是怎么处理?
加两个问题:
3 . A是Leader, 5个节点的数据是: A(0), B(0), C(0), D(0), E(0);
写入3并确认, 节点: A(0, 3), B(0, 3), C(0, 3), D(0), E(0);
如果此时A挂了, 在B, C, D, E中重新选举, 那么D, E会成为新Leader吗? 如果E成为了Leader, E的数据并不全, 怎么办?

4 . A是Leader, 5个节点的数据是: A(0), B(0), C(0), D(0), E(0);
写入3并确认, 节点: A(0, 3), B(0, 3), C(0, 3), D(0, 3-uncommitted), E(0, 3-uncommitted);
如果此时A挂了, 那么D, E会成为新Leader吗? 如果E成为了Leader, E还有一条uncommitted的数据怎么处理?

阅读 2.4k
1 个回答

Raft 是个强 Leader 模型,只由 Leader 处理客户端请求,就算客户端连接了 Follower,Follower 也会把请求转发给 Leader 处理。

Raft 论文 5.1 节:

The leader handles all client requests (if a client contacts a follower, the follower redirects it to theleader).

第 3 个问题:D、E 不会成为 Leader,因为它们的日志比 B、C 的日志更旧,B 和 C 不会投票给 D 和 E。看最后一句:
image

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏