这是我参与「第五届青训营」伴学笔记创作活动的第 9 天
一、本堂课重点内容
本节课程主要分为六个方面:
- 分布式理论概述
- 系统模型
- 理论基础
- 分布式事务
- 共识协议
- 分布式实践
二、详细知识点介绍
1 分布式理论概述
-
分布式系统
- 定义:跨多个节点的计算机程序的集合。
- 优势:去中心化、低成本、弹性、资源共享、可靠性高。
- 挑战:故障、网络、环境、安全。
-
常见的分布式系统
- 分布式存储:GFS、Ceph、HDFS、Zookeeper
- 分布式数据库:Spanner、TiDB、HBase、MangoDB
- 分布式计算:Hadoop、YARN、Spark
2 系统模型
-
故障模型(按处理的从难到易)
- Byzantine failure:节点可以任意篡改发送给其他节点的数据。
- Authentication detectable byzantine failure (ADB):节点可以篡改数据,但不能伪造其他节点的数据。
- Performance failure:节点未在特定时间段内收到数据,即时间太早或太晚。
- Omission failure:节点收到数据的时间无限晚,即收不到数据。
- Crash failure:节点停止响应,持续性的故障。
- Fail-stop failure:错误可检测。
-
故障模型举例
-
拜占庭将军问题
- 两将军问题
- 描述:两支军队的将军只能派信使穿越敌方领土互相通信,以此约定进攻时间。该问题希望求解如何在两名将军派出的任何信使都可能被俘虏的情况下,就进攻时间达成共识。
- 结论:无解,两支军队理论上永远无法达成共识。TCP是两将军问题的一个工程解。
- 三将军问题:当有一个将军是“叛徒”(即出现拜占庭故障)时,整个系统无法达成一致。
- 四将军问题
- 描述:将军D作为消息分发中枢,约定如果没收到消息则执行撤退。
- 结论:无论D是否是叛徒,都能保证最终决策符合大多数。
- 能够证明,当有3m+1个将军,m个“叛徒”时,可以进行m轮协商,最终达成一致。
- 两将军问题
-
共识和一致性
- 问题描述:不同客户端A和B看到客户端C写入,因为时机的不同,会产生数据读取的偏差。
- 要保证所有客户端看到相同的值,需要多节点进行“协商”,达成共识,来保证线性一致性。
-
时间和事件顺序:利用逻辑时钟,可以对整个系统中的事件进行全序排序。
3 理论基础
- CAP
- 定义:CAP分别代表一致性、可用性、分区容错性。三者无法同时达到。
- 三类系统
- CA系统:传统数据库的代表。
- AP系统:放弃强一致性,保证高可用,不少nosql存储系统采用。
- CP系统:放弃可用性,保证数据一致性。
- ACID:ACID理论是针对CA系统而言的,数据库事务拥有四个特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
- BASE:BASE理论是针对AP系统而言的,来源于对大型互联网分布式实践的总结。
- Basically Available(基本可用):假设系统出现了不可预知的故障,但还可以使用。
- Soft state(软状态):允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性。
- Eventually consistent(最终一致性):数据最终一定能够达到一致的状态。
4 分布式事务
- 两阶段提交
- 定义:为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
- 正常流程:Prepare阶段和Commit阶段
- 异常流程:Prepare阶段失败 -> 回滚;协调者宕机 -> 重新启用新的协调者;双故障重启 -> 数据库管理员介入
- 三阶段提交:针对两阶段提交的补充,将两阶段提交中的Prepare阶段,拆成两部分:CanCommit和PreCommit机制。
- MVCC:多版本并发控制的方法。维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。提高并发性能的同时也解决了脏读的问题。
5 共识协议
- Quorum NWR模型
- N:在分布式存储系统中,有多少份备份数据
- W:代表一次成功的更新操作要求至少有w份数据写入成功
- R: 代表一次成功的读数据操作要求至少有R份数据成功读取
- 为了保证强一致性,需要保证 W+R>N
- Raft协议
- 定义:Raft协议是一种分布式一致性算法(共识算法),即使出现部分节点故障,网络延时等情况,也不影响各节点,进而提高系统的整体可用性。
- 三种角色
- Leader - 领导者:Leader 负责处理所有的客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后,通知Follower提交日志。
- Follower - 跟随者:接受并持久化Leader同步的日志,在Leader告知日志可以提交后,提交日志。
- Candidate - 备选者:Leader选举过程中的临时角色。向其他节点发送请求投票信息。
- 四种定义
- Log(日志):节点之间同步的信息,以只追加写的方式进行同步,解决了数据被覆盖的问题。
- Term(任期号):单调递增,每个Term内最多只有一个Leader。
- Committed:日志被复制到多数派节点,即可认为已经被提交。
- Applied:日志被应用到本地状态机:执行了log中命令,修改了内存状态。
- Paxos协议
- 可以并发修改日志,而Raft写日志操作必须是连续的。
- 可以随机选主,不必最新最全的节点当选Leader。