这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
分布式理论-现代框架基石 | 青训营笔记
分布式概论
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。包括分布式计算、分布式存储、分布式数据库等。
- 优势
- 去中心化
- 低成本
- 弹性
- 资源共享
- 可靠性高
- 挑战
- 普遍的节点故障
- 不可靠的网络
- 异构的机器与硬件环境
- 安全
分布式故障衡量的四个维度: 正确性、时间、状态、原因 大多数分布式系统不解决拜占庭故障,而是加密数据,让数据尽量不被篡改
拜占庭将军问题
现实中往往采取方案二。TCP是工程解法而非理论解法,能够近似解决问题。
比特币系统是拜占庭容错的,实际大部分系统是非拜占庭容错的。
为何是三次握手,而不是两次?
无效syn包只要到达服务端就会建立连接,占用服务端资源,造成资源浪费。
共识和一致性
最终一致性:写入过程中可能读到不一致的状态,但是写入完成后一定读到一致的数据。
线性一致性(强一致性):客户端读到更新的版本后,及时把消息同步给其他客户端。
理论基础
CAP理论
C(consistence):强一致性,副本间强一致
A(avaliability):可用性,系统提供的服务必须可用
P(network partitioning):分区容错性,分布式网络在遇到任何网络分区故障时,仍能对外提供满足一致性和可用性的服务
无法百分百同时满足C/A/P,可以放弃某一维度,以另外两个维度为主。
在网络发生分区的情况下必须在可用性和一致性间做出选择。近似解决方法:把故障节点的负载转移给备用节点负责。
ACID理论
事务是数据库管理系统执行过程中的一个逻辑单元,保证一个事务中所有操作要么全部执行,要么全部不执行。
数据库事务拥有四个特性ACID:
ACID的一致性是事务一致性,不同于CAP的线性一致性。
原子性强调操作,一致性强调状态。
数据库一定保证A和C,不一定保证I和D
BASE理论
对CAP中一致性和可用性权衡的结果
分布式事务
两阶段提交
真正执行事务的是第二阶段commit-ack
参与者成功commit,协调者没收到Ack,仍需要回滚事务。
prepare成功, commit不成功仍然会导致数据不一致。因此commit不成功,要将整个事务回滚一遍。实际中,要在锁的状态中保护操作。
三阶段提交
cancommit发现节点故障,不继续后续
参与者没有收到commit命令,一段时间后自动提交
MVCC
悲观锁:操作数据时直接把数据锁住,直到操作完成才释放锁;上锁期间其他人不能修改数据
乐观锁:不会上锁,只是在执行更新时判断别人是否修改数据,只有冲突时才放弃操作
MVCC是一种并发控制方法,维持一个数据的多个版本使读写操作没有冲突。所以不阻塞写,也不阻塞读。为每个修改保存一个版本,和事务的时间戳相关联。
问题关键是时间戳如何确定?
物理时钟: TrueTime API
软时钟: 时间戳预言机(TSO),采用中心化授时方式,所有协调者想中心化节点获取时钟。
共识协议
Quorum NWR模型
N份备份,至少写W份才算更新成功,至少读R份才算读取成功
调整W和R的值进行CAP选择
RAFT协议
committed和applied类似于两阶段提交
解决方法:等待老的leader任期结束,才能让新的leader上位,让选举等待两个超时时间。损失一点可用性,因为会有一段无主的状态。