这是我参与「第五届青训营 」笔记创作活动的第6天
分布式概述
-
什么是分布式系统?
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源实现共同的目标
-
为什么要学习分布式系统?
帮助理解服务器之间协作的机理
-
常见的分布式系统
分布式存储:GFS、Ceph、HDFS、Zookeeper
分布式数据库:Spanner、TIDB、HBase、MongoDB
分布式计算:Hadoop、YARN、Spark
系统模型
故障模型
- Byzantine failure:节点可以任意篡改数据
- Authenticaiton detectable byzantine failure:节点可以篡改自己的数据
- Performance failure:节点未在特定时间收到数据
- Omission failure: 收不到诗句
- Crash failure:节点停止相应
- Fail-stop failure:错误可检测
拜占庭将军问题
-
两将军问题:
- 定义:如何在两面将军派出的任何信使都可能被俘虏的情况下,就进攻时间达到共识
- 结论:永远无法达到共识
- TCP是两将军问题的一个工程解
-
三将军问题:
- 三个将军如果出现一个"叛徒",那么无法达到一致
- 因为叛徒可以篡改信息,比如进攻改为撤退,那么A将军收到两票进攻一票撤退,B将军收到两票撤退一票进攻
-
四将军问题:
- 将军D作为消息分发中枢,约定没有收到消息则执行撤退
- 步骤:
- 如果D为叛徒,ABC无论收到任何消息,总能达成一致
- 如果D为忠将,那么最终决策能复合大多数
- 能够证明,当有3m+1位将军,m个叛徒时,可以进行m轮协商,最终达到一致
共识和一致性
- 不同客户端看到客户端的写入时机不同,产生数据读取偏差(脏读?)
- 所以需要共识保证所有客户端看到相同值
时间和事件顺序
略
理论基础
CAP理论
-
定义:
C:一致性
A:可用性
P:分区容错性
-
系统: CP系统:为了避免读到不一致数据,可能拒绝访问 AP系统:为了保证可用性,允许不同进程读到不同数据
-
故障转移:
- 允许一个进程作为Master,其他进程作为Backup,当故障时将请求转移给Backup进行处理
ACID理论
-
定义:
A:原子性
C:一致性
I:隔离性
D:持久性
-
ACID是针对CA系统而言的
BASE理论
-
BASE是针对AP系统而言的
-
定义:
Basically Avaliable:假设系统出现了不可预知的故障,但还是能用
Soft state:允许系统中的数据存在中间状态,并认为该状态不影响系统整体可用性
Eventually consisitent:数据最终一定能够达到一致的状态
分布式事务
二阶段提交
-
三个假设:
- 协调者和参与者进行通信
- 预写式日志保存在可靠的存储设备
- 所有节点不会永久损坏,即使仍然可以恢复
-
正常流程:
Prepare和commit
-
异常流程:
Prepare阶段失败 -> 回滚
协调者宕机 -> 重新启用新的协调者
双故障重启 -> 数据库管理员介入
-
问题:
- 性能问题:需要多次网络通信,资源需要等待并锁定
- 新协调者:如何选出
- Commit阶段网络分区带来的数据不一致:非所有节点都收到Commit请求
三阶段提交
- 将两阶段提交中的Prepare拆分为:CanCommit和PreCommit
- CanCommit:询问是否可以执行;Precommit:重复确认是否可以执行
- DoCommit:向所有人提交事务
MVCC
- MVCC:多版本并发控制。维持一个数据多个版本使读写操作没有冲突
- 悲观锁和乐观锁
- 悲观锁:锁住资源,不让其他人访问数据
- 乐观锁:不会锁住资源,只在执行更新时判断别人是否修改数据,冲突时放弃操作
- 版本的选取:物理时钟或逻辑时钟
总结
这节课我学习到了一些简单的分布式理论,对于raft等分布式协议我还没有学会,所以在此就不放出来误导大家了