分布式一致性和CAP理论
- C(一致性):在分布式环境中,一致性是指数据在多个副本之间能否保持一致的特性
- A(可用性):系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。99.999%
- P(分区容错性):分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供一致性和可用性的服务,除非整个网络环境都发生了故障。
分布式一致性算法
RAFT
- Leader:只有一个
- Follower:选民
- Candidate:候选者
过半数 + 1即变为leader
还可以自己选自己
leader挂掉之后的情况
共识算法:拜占庭将军问题
- 拜占庭帝国(Byzantine Empire)军队的几个师驻扎在敌城外,,每个师都由各自的将军指挥.。将军们只能通过信使相互沟通,在观察敌情之后,他们必须制定一个共同的行动计划,如进攻(Attack)或者撤退(Retreat),且只有当半数以上的将军共同发起进攻时才能取得胜利。然而,其中一些将军可能是叛徒,试图阻止忠诚的将军达成一致的行动计划。更糟糕的是,负责消息传递的信使也可能是叛徒,他们可能篡改或伪造消息,也可能使得消息丢失。
- 为了更加深入的理解拜占庭将军问题,我们以三将军问题为例进行说明。当三个将军都忠诚时,可以通过投票确定一致的行动方案,General A,B通过观察敌军军情并结合自身情况判断可以发起攻击,而General C通过观察敌军军情并结合自身情况判断应当撤退。最终三个将军经过投票表决得到结果为进攻:撤退=2:1,所以将一同发起进攻取得胜利。对于三个将军,每个将军都能执行两种决策(进攻或撤退)的情况下,共存在6中不同的场景。上述是其中一种,对于其他5中场景可简单地推得,通过投票三个将军都将达成一致的行动计划。
- 当三个将军中存在一个叛徒时,将可能扰乱正常的作战计划。例如General C为叛徒的一种场景,他给General A和General B发送了不同的消息,在这种场景下General A通过投票得到进攻:撤退=1:2,最终将作出撤退的行动计划;General B通过投票得到进攻:撤退=2:1,最终将作出进攻的行动计划。结果只有General B发起了进攻并战败。
- 事实上,对于三个将军中存在一个叛徒的场景,想要总能达到一致的行动方案是不可能的。详细的证明可参看Leslie Lamport的论文。此外,论文中给出了一个更加普适的结论:如果存在m个叛将,那么至少需要3m+1个将军,才能最终达到一致的行动方案。
分布式环境中的脑裂和Lease
脑裂
- 出现网络故障
- 由于网络问题一个集群变为多个集群,出现多个leader,这种现象就是脑裂
解决方案
过半选举(Zookeeper)
保证集群的可用性,最少有大于一般的机器处于可用状态
发布leader证
每隔指定时间发布leader证,持有该证书的节点是leader。时间依赖于当前机器的时钟,因此会有时钟误差问题,需要保证集群内机器的时钟是同步的,一般设置在10秒钟的量级。