这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天,感觉是收获最大的一节课了,重点学习了分布式系统模型,ACID、CAP理论,了解了事务、Raft协议。用空做做网上找的实验。
概述
分布式系统是计算机程序集合,这些程序跨多个独立计算节点的资源实现相同的目标。
优点
去中心化:相比单个服务器,可提升整体存储、计算能力
可靠性高:多副本冗余
挑战
- 网络:程序状态变为了对、错、网络未响应
- 安全性
系统模型
故障模型
- [正确性]byzantinue failure:节点篡改发给其他节点的数据(大部分分布式系统不解决)
- ADB(拜占庭故障特例):只篡改自己数据,不影响别人。eg,磁盘晶体管位反转。
- [时间性,故障和非故障中间态]performance failure: 数据处理时间不稳定,或快或慢。分布式思维:换节点,恢复不是首要目标,因为恢复时间不确定。
- [故障]ommision:节点收不到数据。
- [状态]crash failure:宕机
- [状态+原因]fail-stop failure:
拜占庭将军问题
共识:两将军就攻击时间达成一致。
结论:理论上永远达不到共识。
TCP工程解:增加超时机制
普遍:3m+1将军,其中m个叛徒,可增加m轮协商,最终达成一致 比特币解决拜占庭容错机制
问题
1.TCP三次握手?
引用:小林coding
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
2.挥手FIN丢失发生什么?
客户端->服务端FIN丢失:客户端超时重传,超过tcp_orphan_retries直接CLOSE。
服务端->客户端FIN丢失:服务端超时重传,达到了重传最大次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到客户端的第四次挥手(ACK报文),那么服务端就会断开连接。
共识和一致性
最终一致性:改动期间存在不一致
线性一致性:强一致,改动后会同步消息到其他线程,同步过程会有时延,可用性受损。
Lamport 论文
Lamport L. Time, clocks, and the ordering of events in a distributed system[M]//Concurrency: the Works of Leslie Lamport. 2019: 179-196.
兰伯特逻辑时钟:逻辑时钟的值
理论基础
CAP理论
C 一致性,多副本的一致 A 可用性,请求都能收到非错的响应,但不一定是最新的数据 P 分区容错。 不能同时100%的CAP,只能CA类似单机数据库,CP用户体验强系统,AP算钱的系统。 近似方法:整一个master、其他的是backup,故障就切换,但一致性和可用性都有一些损失。
ACID
事务:数据库执行过程的逻辑单元,所有操作要么全部执行,要么全不执行。
C:
- CAP 的C是线性一致性[多个节点看到的数据是相同的状态],ACID的C是事务一致性[转账:双方总金额相同]。
- A指操作,C指状态
BASE
基本可用(功能降级),软状态(允许中间态),最终一致性
分布式事务
大部分系统避免处理分布式事务
两阶段提交
两个角色:coordinate和participants,联网通信 两个阶段1.prepare阶段,2.commit阶段
三阶段提交
prepare拆分为两部分cancommit、precommit
MVCC
并发控制方法,维护数据多个版本使得读写没有冲突,因此不会阻塞写,也不阻塞读。每个修改都可保存一个当前时间戳版本。解决了脏读问题。
重点:所有服务器的时间戳一致,可用软时间戳TSO:中心化时钟。
锁
悲观锁:凡是操作都要锁
乐观锁:不上锁,冲突时放弃
共识模型
NWR模型
N份待备份文件,成功写要W份写入成功,成功读要R份读成功。
强一致性,需要W + R > N
CAP选择权给用户,可配置WRN值
Raft协议
概念
- leader主节点,负责所有的用户请求,向follower同步请求日志。
- follower跟随者,不发请求,接收并持久化leader的同步日志。leader故障推荐自己为candidate。
- candidate,leader选举过程的临时角色,获得大部分投票的当选leader。
term:单调递增,每一个term内只有一个leader。
过程
只需要写两份,读一份(leader是最新的)。
切换leader
leader失去follower响应,释放leader 双主:加等待时间(新皇帝必须等老皇帝驾崩才能当皇帝)。
Raft与Paxos
Raft必须连续修改日志,必须leader服务
Paxos没有任何一个节点有全局的信息
项目
MapReduce MapReduce--6.5840 Lab 1: MapReduce
reduce故障:重跑整个job
mapper故障:新起mapper,重新调度
raft-kv rart-kv--TiDB-talent-plan