1. 分布式概述
1.1 什么是分布式
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标.可以分为分布式计算,分布式存储,分布式数据库等.
优势:
- 去中心化
- 低成本
- 弹性
- 资源共享
- 可靠性高
挑战:
- 普遍节点故障
- 不可靠的网络
- 异构的机器与硬件环境
- 安全
1.2 WHY-HOW-WHAT
1.3 常见的分布式系统
分布式存储
分布式数据库
分布式计算
2. 系统模型
2.1故障模型
- Byzantine failure:节点可以任意篡改发送给其他节点的数据
- Authentication detectable byzantine failure(ADB):Byzanting failure的特例;节点可以篡改数据,但是不能伪造其他节点的数据。
- Performance failure:节点未在特定时间段内收到数据,即时间太早或太晚。
- Omission failuer:节点收到数据的时间无限晚,即收不到数据。
- Crash failuer:在omission failure的基础上,增加了节点停止响应的假设,也即持续性地omission failure。
- Fail-stop failure :在Crash failure的基础上增加了错误可检测的假设。
真实故障及分类
2.2 拜占庭将军问题
2.3 共识和一致性
2.4 时间和时间顺序
Lamport逻辑时钟
03 理论基础
1. CAP理论
2. ACID理论
一致性是比较难以理解的,事务一致性,单体发生变化,但是总体的状态与原来状态要一致.
3. BASE理论
BASE理论是基于AP系统的。
04 分布式事务
4.1 二阶段提交
二阶段提交(Two-phase Commit):为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
三个假设:
- 引入协调者(Coordinator)和参与者(Participants),互相进行网络通信
- 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上
- 所有节点不会永久性损坏,即使损坏后任然可以恢复
可能出现的情况:
- Coordinator不宕机,Particiioant宕机。如下所示,需要进行回滚操作
- Coordinator宕机,Participant不宕机。可以起新的协调者,待查询状态后,重复二阶段提交
- Coordinator宕机,Participant宕机
回滚:在Prepare阶段,如果某个事务参与者反馈失败消息,说明该节点的本地事务执行不成功,必须回滚。
两阶段提交需注意的问题:
-
性能问题
两阶段提价需要多次节点间的网络通信,耗时过大,资源需要进行锁定,徒增资源等待时间
-
协调着单点故障问题
如果事务协调者节点宕机,需要另起新的协调者,否则参与者处于中间状态无法完成事务
-
网络分区带来的数据不一致
一部分参与者收到了Commit消息,另一部分参与者没收到Commit消息,会导致节点之间数据不一致。
思考:
-
日志被保存在[可靠]的存储设备上,如何保证这一点?
单机时代,使用IOE(IBM服务器,orcle数据库,EMC的存储),高可用的硬件来保证
现在,分布式文件系统或者分布式KV系统
-
参与者Commit看,但是Ack信息协调者没收到怎么办?
需要重新建联
4.2 三阶段提交
4.3 MVCC
两种锁机制,乐观锁和悲观锁
MVCC:一种并发控制的方法,维持一个数据的多个版本,使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。MVCC为每个修改保存一个版本,和事务的时间戳相关联。可以提高并发性能,解决脏读问题。
5. 共识协议
5.1 Quorum NWR模型
5.2 RAFT协议
5.3 Paxos协议
06 分布式实践
6.1 MapReduce
6.2 分布式KV
07 总结
思维导图
思考: