在分布式系统的设计中,要解决的最主要问题之一就是单点故障问题(single point of failure (SPOF) )。为了能在某个节点宕机后,系统仍然具备正常工作的能力,通常需要对节点部署多个副本,互为主备,通过选举协议在多副本中挑选出主副本,并在主副本发生故障后通过选举协议自动切换至备副本。
主副本称为 Leader,备副本称为 Follower。
在分布式系统中,一个工作良好的选举协议应当符合两点预期:
正确性
即当一个副本认为自己是 Leader 的时候,不应该有其他副本同时也认为自己是 Leader,在集群中同时有两个副本认为自己是 Leader 的情况称为"脑裂",如 Raft 协议中的选举机制,通过保证为每个 Term 只分配一个 Leader 来避免脑裂,但是原生 Raft 中同一时刻可能有多个副本认为自己是 Leader(尽管它们分管不同的 Term,且更小的 Term 的主副本已经失效但是其不自知),使用原生的 Raft 协议必须读取多数派的内容来保证读取到的数据最新,OceanBase 数据库通过 Lease 机制避免对多数派的访问,确保在任意的时间点上只有一个副本能认为自己是 Leader。
活性
即任意时刻,当 Leader 宕机时,只要集群中仍然有多数派的副本存活,那么在有限的时间内,存活副本中应当有副本能够成为 Leader。
在满足正确性和活性的基础上,OceanBase 数据库的选举协议还提供了优先级机制与切主机制,优先级机制在当前没有 Leader 的情况下在当前可当选 Leader 的多个副本中,选择其中优先级最高的副本称为 Leader;切主机制在当前有 Leader 的情况下可以无缝将 Leader 切换至指定副本。
租约时长
当 Leader 与多数派超过一个租约时长无法连通时,将开启新一轮的选举,并选出下一任 Leader。
默认的租约时长是 10s,用户可以修改配置变更租约时长。
注意
更长的租约时长意味着对消息延迟抖动的更高容忍度,更好的鲁棒性,但同时也将延长宕机恢复时间。
更短的租约时长意味着对消息延迟抖动的更低容忍度,更差的鲁棒性,但同时也将缩短宕机恢复时间。
优先级
在选举过程中,Leader 将通过续约动作感知 Follower 副本的优先级变化,当 Follower 副本的优先级高于自己的时候,Leader 将通过主动切主动作,将 Leader 转移至 Follower 副本。
目前的优先级从高到低仅包含:
用户指定的 Leader。
Primary Zone。
切主
用户可以通过 ALTER SYSTEM SWITCH REPLICA 命令控制日志流 Leader 的分布,内部将通过平滑切主机制,尽量以外部无感知的方式变更 Leader 的位置。
用户也可以变更 Primary Zone,选举将感知到 Primary Zone 的变化,并将 Leader 切换至目标副本。




