baidu / braft

An industrial-grade C++ implementation of RAFT consensus algorithm based on brpc, widely used inside Baidu to build highly-available distributed systems.
Apache License 2.0
3.95k stars 881 forks source link

support arbiter in a new way #404

Open CkTD opened 1 year ago

CkTD commented 1 year ago

支持 arbiter 副本,arbiter 不维护 FSM,没有用户数据,不能成为主,只能发起投票,必要时协助日志提交。

实现方式

分析 一致性:引入arbiter不会影响一致性。 可用性:引入arbiter会降低可用性。考虑以下场景: 3个节点,时刻A ,挂了一个非arbiter节点,此时 leader 通过arbiter提交一些日志。时刻B,旧的leader 挂了,并且挂掉的非arbiter节点恢复。恢复的节点无法成为主,因为缺失了一些日志,会被 arbiter 节点拒绝。这个是可以接受的,因为故障出现了交集,概率非常小。

对比其他实现

优点:

  1. 正常情况下,leader 与 arbiter 之间只有心跳,开销比较小,可能有助于增加 qps。
  2. 不会出现leader挂了,arbiter日志可能更新的问题。

缺点:

  1. 写请求时延可能增大(例如,3副本,其中一个为arbiter,正常情况下leader 必须把日志复制到非arbiter follower节点上才提交, 而不是两个follower中的任意一个)。
  2. 如果非 arbiter follower 故障,检测到降级之前,无法提交新日志。

总结:这个方案可以减少空间占用、提高qps,但会增加 latency,降低可用性。