这是我参与「第五届青训营」伴学笔记创作活动的第 16 天
前言
本文笔记主要内容:
- 分布式事务
- 共识协议
- 分布式实践
1 分布式事务
1.1 二阶段提交
-
定义:
- 二阶段提交(Two-phase Commit):为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
-
三个假设:
- 引入协调者(Coordinator)和参与者(Participants),互相进行网络通信
- 所有节点都采用预写式日志,且日志被写完后即被保持在可靠的存储设备上
- 所有节点不会永久性损坏,即使损坏后仍然可以恢复
-
正常流程:
- Prepare阶段
- Commit阶段
-
异常流程:
- 参与者宕机导致Prepare阶段失败
- 需要回滚
- 协调者宕机
- 需要重新启用新的协调者,待查询状态后,重复二阶段提交
- 双故障重启
- 没办法了,只能让数据库管理员介入
- 参与者宕机导致Prepare阶段失败
-
两阶段提交需解决的问题:
- 性能问题
- 需要多次网络通信,资源需要等待并锁定
- 新协调者
- 如何确定状态选出新协调者
- Commit阶段网络分区带来的数据不一致
- 非所有节点都收到Commit请求
- 性能问题
因此,引入了三阶段提交
1.2 三阶段提交
- 针对两阶段提交的补充,将两阶段提交中的Prepare阶段,拆成两部分:CanCommit和PreCommit机制
- CanCommit阶段:询问是否可以执行
- PreCommit阶段:重新确认是否可以执行
- DoCommit阶段:向所有人提交事务
- 解决了两个问题
- 单点故障问题
- 阻塞问题
- 并且引入了超时机制
- 但是还有两个二三阶段都存在的问题:
- 性能问题
- 网络分区场景带来的数据一致性问题
1.3 MVCC
-
MVCC是一种多版本并发控制的方法。维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。
-
MVCC为每个修改保存一个版本,和事务的时间戳相关联
-
MVCC可提高并发性能,也解决了脏读的问题。
-
悲观锁和乐观锁
-
时间戳的实现
- 物理时钟:Spanner论文提供TrueTime API(一个物理时钟的方式),有Master节点维持一个绝对时间,保证各个服务器之间时钟误差通常控制在1到7ms之间。
- 逻辑时钟:时间截预言机(TSO),采用中心化的授时方式,所有协调者向中心化节点获取时钟。优点是算法简单,实现方便,但需要每个节点都与他进行交互,会产生一些网络通信的成本。TSO的授时中就需要考虑低延迟,高性能以及更好的容错性。
2 共识协议
2.1 Quorum NWR模型
-
NWR模型三要素:
- N:在分布式存储系统中,有多少份备份数据
- W:代表一次成功的更新操作要求至少有w份数据写入成功
- R: 代表一次成功的读数据操作要求至少有R份数据成功读取
- 其中为了保证强一致性,需要保证 W+R>N
-
Quorum NWR模型将CAP的选择交给用户,是一种简化版的一致性模型
-
思考
- 在读写的并发更新中容易引起一致性问题
- 读者如果读到副本1和副本2,得出v=3的结论
- 如果读到副本2和副本3,得出v=2的结论
- 根源:允许数据被覆盖
- 在读写的并发更新中容易引起一致性问题
2.2 RAFT协议
-
概述
- Raft协议是一种分布式一致性算法(共识算法),即使出现部分节点故障,网络延时等情况,也不影响各节点,进而提高系统的整体可用性。
- Raft是使用较为广泛的分布式协议。
- 一定意义上讲,Raft协议也使用了Quorum机制
-
三种角色
- Leader领导者
- 通常一个系统中是一主 (Leader) 多从(Follower)。 Leader 负责处理所有的客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后,通知Follower提交日志
- Follower跟随者
- 跟随者,不会发送任何请求。接受并持久化Leader同步的日志,在Leader告知日志可以提交后,提交日志。当Leader出现故障时,主动推荐自己为Candidate。
- Candidate备选者
- 备选者,Leader选举过程中的临时角色。向其他节点发送请求投票信息。如果获得大多数选票,则晋升为Leader。
- Leader领导者
-
四种定义:
- Log(日志):节点之间同步的信息,以只追加写的方式进行同步,解决了数据被覆盖的问题
- Term(任期号):单调递增,每个Term内最多只有一个Leader
- Committed:日志被复制到多数派节点,即可认为已经被提交
- Applied:日志被应用到本地状态机:执行了log中命令,修改了内存状态
-
RAFT协议的状态机:
- 算法
- 具体看ppt吧,总的来说所有关于RAFT协议的算法感觉都需要仔细看看,而且都挺重要感觉
2.3 Paxos协议
-
Paxos算法与RAFT算法区别:
- Multi-Paxos 可以并发修改日志,而Raft写日志操作必须是连续的
- Multi-Paxos 可以随机选主,不必最新最全的节点当选Leader
-
优缺点
- 优势:写入并发性能高,所有节点都能写入
- 劣势:没有一个节点有完整的最新的数据,恢复流程复杂,需要同步历史记录
- 示意图:
3 分布式实践
3.1 MapReduce
-
Mapper: 将输入分解为多个Job来并行处理。彼此间几乎没有依赖关系
-
Shuffler: 将maper结果打乱,防止数据倾斜
-
Reducer: 对map阶段的结果进行全局汇总
-
容错:
- Mapper故障:由中心化节点重新发起调度,新起Mapper重跑job
- Reducer故障重跑Mapper,代价大
-
示意图:
3.2 分布式KV
- 架构:
- 将海量结构化数据根据Key分成不同的Region,每个Region构建一个单机KV数据库,Region之间形成Raft Groups做到强一致
- 容错:
- 当Node故障时通过Raft Learner模式进行数据修复
- 弹性:
- 当出现局部Kev热点或数据膨胀时,Region可以进行Split操作,分成两个子Region,反之收缩时进行Merge操作
如图所示
心得
本文主要还是做个笔记,基本上所有的东西都很重要,我也都不是特别太懂,所以还是多看看,多请教请教其他人,还有对于实际的软件应用上我其实不太清楚这种东西具体怎么应用,但概念上还是非常具有学习价值的,明天继续加油努力
引用
ppt:分布式理论 - 现代架构基石.pptx - 飞书云文档 (feishu.cn)