参考: https://www.bilibili.com/video/av21667358
什么是分布式系统?
由多台设备组成的一个系统叫做分布式系统。
什么是一致性?
CAP理论
对于一个分布式系统,不能同时满足以下三点:
- 一致性(Consistency)
 - 可用性(Availability)
 - 分区容错性(Partition Tolerance)
 
一致性模型
- 弱一致性
- 最终一致性
- DNS(Domain Name System)
 - Gossip(Cassandra的通信协议)
 
 
 - 最终一致性
 - 强一致性
- 同步
 - Paxos
 - Raft(multi-paxos)
 - ZAB(multi-paxos)
 
 
最终一致性
例如:
映射域名test.yangzhang.edu到11.11.11.11,这个操作是对这个分布式系统中一台设备的操作,不会立即被整个分布式系统同步,所以当你想立即访问你的域名时,可能会出现访问不到的情况,但过了一段时间之后,一定可以访问到那个域名,这种情况被称为最终一致性。
首先——明确问题
数据不能存在单点上。
分布式系统对 fault tolorance 的一般解决方案是 state machine replication。
其实强一致性算法的本质就是 state machine replication 的共识算法。
(系统的最终一致性,不仅需要达成共识,还会取决于 client 的行为)
state machine replication: 通过存/读 log 的方式来完成一致性
强一致性算法——主从同步
- Master接受写请求
 - Master复制日志到slave
 - Master等待,直到所有slave返回
 
问题:
一个节点失败,导致Master阻塞,整个集群不可用,保证了一致性,但可用性缺大大降低。
强一致性算法——多数派
基本思想:
每次写都保证写入大于 N/2 个节点,每次读都保证从大于 N/2 个节点中读。
问题:
在高并发的场景下,例如某台设备input Inc5(增加5),另一台设备input Set0,会导致某些设备上的 log 顺序不一致。 
强一致性算法——Paxos
发明者:Lesile Lamport
为描述Paxos算法,Lamport虚拟了一个叫做Paxos的希腊城邦,这个岛按照议会民主制的政治模式制定法律,但是没有人愿意将自己的全部时间和精力放在这种事。所以无论是议员,议长或者传递纸条的服务员都不能承诺别人需要时一定会出现,也无法承诺批准决议或者传递消息的时间。
- Paxos
- Basic Paxos
 - Multi Paxos
 - Fast Paxos
 
 
强一致性算法——Basic Paxos
- 角色介绍:
- Client:系统外部角色,请求发起者。比作民众。
 - Proposer:接受Client请求,向集群提出提议(propose)。并在冲突发生时,起到冲突调节的作用。比作议员,替民众提出议案。(在Basic中是多个,在Multi中是单个)
 - Accpetor(Voter):提议投票和接收者,只有在形成法定人数(Qunrum = (n+1)/2,一般即为majority多数派)时,提议才会最终被接受。比作国会。
 - Learner:提议接受者,backup,备份,对集群一致性没什么影响。比作记录员。
 
 
基本流程:
- Client民众 对 Proposer议员 发出一个写请求
 - Proposer议员 对 Acceptor1、2、3 发出请求:请求采用方案1(1是编号,此时只对Acceptor发送编号,不发生方案的实际内容)
 - Acceptor1、2、3 响应 Proposer 表示同意(一共有3个 Acceptor,其中有3个 Acceptor表示同意,同意的数量大于等于 Qunrum(大多数))
 - Proposer议员 对 Acceptor1、2、3 发送方案1的实际内容
 - Acceptor1、2、3 相应 Proposer 表示同意,并告诉 Learner记录员 记下这个方案(此时才正式写入log)
 - Learner 将 response 返回给 client
 
部分节点失败,但达到了Quorum:
 
失败的方案1:
在方案1没有完成记录之前,方案2到来,Acceptor将直接放弃方案1,只相应编号最大的方案。
潜在问题:活锁
每个方案在被记录之前,都有新的方案提出,导致没有任何方案记录,没有response,产生活锁。
Basic Paxos 总结:
- 难实现
 - 效率低(2轮RPC)
 - 活锁
 
强一致性算法——Multi Paxos
引入新的概念:Leader,唯一的Proposer,所有写请求都需要经过此Leader。
基本流程:
- Proposer 请求 Acceptor 成为 Leader
 - 达到Quorum数量的 Acceptor 响应(同意),此Proposer成为Leader
 - Client发出request给Leader
 - 第N号Leader(Proposer),发出编号I的方案和方案内容给Acceptor
 - Acceptor响应Leader,并通知Learner 写入log
 - Client发出request给Leader
 - 第N号Leader(Proposer),发出编号I+1的方案和方案内容给Acceptor
 - Acceptor响应Leader,并通知Learner 写入log
...... 
Multi Paxos总结:
- 解决活锁:只有一个Leader,由Leader来决定方案顺序
 - 提高效率
 
强一致性算法——Raft
- Raft
- 划分成三个子问题:
- Leader Election
 - Log Replication
 - Safety
 
 - 重定义角色:
- Leader
 - Follower
 - Candidate(只存在一段时间)
 
 - 原理动画解释:http://thesecretlivesofdata.com/raft/
 - 场景测试:https://raft.github.io/
 
 - 划分成三个子问题:
 

京公网安备 11010502036488号