这是我参与「第五届青训营」伴学笔记创作活动的第 13 天
前言
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。本文主要介绍分布式事务和共识协议。
详细知识点介绍
分布式事务
二阶段提交
为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
在分布式系统中,每个节点只知道自己操作的成败,不知道其他节点操作的成败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交。
具体算法思路:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情况决定各参与者是要提交操作还是中止操作。
假设:
- 引入协调者(Coordinator)和参与者(Participant),相互进行网络通信。
- 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上。
- 所有节点不会永久性损坏,即使损坏后仍然可以恢复。
可能出现的情况:
- Coordinator不宕机,Participant宕机:需要进行回滚操作。
- Coordinator宕机,Participant不宕机:起新的协调者,待查询状态后,重复二阶段提交。
- Coordinator宕机,Participant宕机:无法确认状态,需要数据库管理员介入,防止数据库进入一个不一致的状态。
三阶段提交
在二阶段提交的第一阶段和第二阶段之间插入了准备阶段,解决了单点故障和阻塞两个问题。
MVCC
多版本控制并发,通过保存数据在某个时间点的快照来实现并发控制,也就是保存数据的历史版本,通过对数据行的多个版本管理来实现数据库的并发控制。
共识协议
Quorum NWR模型
三要素:
- N:在分布式存储系统中,有多少份备份数据。
- W:代表一次成功的更新操作要求只要有W份数据写入成功。
- R:代表一次成功的读数据操作要求至少有R份数据成功读取。
为了保证强一致性,需要保证W+R>N。
RAFT协议
RAFT协议是一种分布式一致性算法(共识算法),使用RAFT协议即使出现部分节点故障、网络延迟等情况,也不影响各节点,可以提高系统整体的可用性。
三种状态:
- Leader-领导者:负责处理所有的客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后,通知Follower提交日志。
- Follower-跟随者:不发送任何请求;接受并持久化Leader同步的日志;在Leader告知日志可以提交后提交日志;当Leader出现故障时主动推荐自己为Candidate。
- Candidate-候选者:Leader选举过程中的临时角色,向其他节点发送请求投票信息,如果获得大多数选票,则晋升为Leader。
状态转移图:
选举过程:
follower 在 timeout 时间内,没有收到来自 leader 的心跳,则会发起选举。
-
增加节点本地的 current term, 切换为 candidate 状态
-
投自己一票
-
并行的发送给其他节点 RequestVotes RPCs
-
等待其他节点的回复
- 收到了 大多数选票(majority ),那么赢得选举,切换状态为 leader
- 被告知别人已经当选,则切换为 follower
- 一段时间还是没有收到 majority 的投票结果,保持 candidate 状态,重新发出选举。
-
规则:
- 在一个任期内每个参与者最多投一票。
- 要成为Leader,必须拿到多数投票。
Paxos协议
角色:
- Proposer:提案者。Proposer 可以有多个,Proposer 提出议案(value)。所谓 value,在工程中可以是任何操作,例如“修改某个变量的值为某个值”、“设置当前 primary 为某个节点”等等。 Paxos协议中统一将这些操作抽象为 value,同一轮 Paxos过程,最多只有一个 value 被批准。
- Acceptor:批准者。Acceptor 有 N 个,Proposer 提出的 value 必须获得超过半数(N/2+1)的 Acceptor 批准后才能通过。Acceptor 之间完全对等独立。
- Learner:学习者。不参与决策,学习被批准的 value(即获得 N/2 + 1 的 Acceptor 批准)。所谓学习就是通过读取各个 Proposer/Acceptor 对 value 的选择结果,如果某个 value 被超过半数 Proposer 通过,则 Learner 学习到了这个 value。
流程:
Paxos 协议一轮一轮的进行,每轮都有一个编号。每轮 Paxos 协议可能会批准一个 value,也可能无法批准一个 value。 如果某一轮 Paxos 协议批准了某个 value,则以后各轮 Paxos 只能批准这个 value 。各轮协议流程组成了一个 Paxos 协议实例,即一次 Paxos 协议实例只能批准一个 value。
优势:
写入并发性能高,所有节点都能写入。
劣势:
没有一个节点有完整的最新的数据,恢复流程复杂,需要同步历史记录。