分布式系统为了保证其可靠性,一般都会多节点提供服务,各别节点的故障不会影响系统的可用性。对于分布式的存储系统来说,在保证可用性的同时,数据的可靠性(不丢失)也是其要解决的核心问题。目前通用的方案是使用多副本存储。这就会引入一个新的问题,分布式存储系统的又一核心问题——多个副本间的数据一致性保障。所以就有了各种数据一致性协议。例如:Zookeeper的Zab、Etcd使用的Raft和无比复杂的Paxos等等。这些一致性协议都有一个共同的特点,那就是都有一个主节点(Leader)负责数据的同步。
本文不讨论这些一致性协议的工作原理,我们重点聊一聊它们的选主策略——当Leader挂掉后,集群必须有能力选出一个新的Leader。为什么只讨论选主呢?因为在我们的工作中几乎不太可能去设计实现一致性协议,但"选主"这个事儿还是有可能需要我们去做的。例如之前文章介绍的时间轮,我们有多个节点提供服务,但只能有一个节点去转动轮子(一秒移动一次当前指针),这个时候就需要系统中始终有一个Leader负责转动轮子。业务上类似的需求还有很多,这里就不举例了,接下来我们介绍下几种选主策略。
首先明确下选主的时机:一般发生在集群的Leader宕机或者集群刚刚启动时,集群中没有Leader,这时就会触发选主。这里有两个技术点:
1、集群中节点需要能够感知到Leader的存在;
2、从剩余的活跃节点中选出一个新的Leader;
选主常用的方式有两种:投票和竞争,下面我们分别介绍下。
一、投票选主
在投票选主方式中,一般集群中会有两种角色:Leader和Follower,Leader和各Follower间保持心跳&#x