这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
分布式概论
-
什么是分布式:利用多个独立的资源来实现共同的目标,分布式计算,存储,数据库
- 优点:去中心化,低成本,弹性(白天在线服务晚上离线计算,扩容缩容),资源共享(一台电脑数据存储邮上限数据共享),可靠性高(小零件可拆卸)
- 挑战:节点故障(必然),不可靠的网络,异构的机器(各种机器,性能不可预测),安全(集群被攻破)
-
Whyhowwhat
- 使用者:why:1.数据多2.成本低 how:分布式框架,成熟的分布式系统 what:1.明确规模,负载,一致性要求2.明确稳定性要求,指定技术方案
- 学习者:why:1.后端开发必备2.理解协作 how: 1.掌握分布式理论2.了解一致性协议 what:1.要点深入,难点搜索2.所学用于实践
-
常见的分布式系统
- 分布式计算:Hadoop, Spark , YARN
- 分布式存储:Google File System, Ceph, Hadoop HDFS , ZooKeeper
- 分布式数据库 : Google Spanner , TiDB , HBase, MongoDB
系统模型
-
故障模型
- Byzantine failure :节点任意篡改发送给其他节点数据
- Authentication detectable byzantine failure (ADB):篡改本节点数据,不能伪造其他节点数据
- Performance failure : 节点未在特定时间段内收到数据,太早或者太晚,非常普遍
- Omission failure : 收到数据时间无限晚,收不到数据
- Crash failure :持续性的Omission failure
- Fail-stop failue : 知道错误码的错误
-
Byzantine Question
-
两将军无法产生共识,tcp是工程解 ->丢失问题
-
三将军问题,有一个叛徒整个系统无法达成一致->一致性问题
- 如果有m个叛徒,至少3m+1的将军,进行m轮协商
-
-
共识一致性:
- Eventually consistent :最终一致性
- Linearizability consistent: 线性一致性
-
时间和事件顺序:
- 当需要找分布式上两个毫不相关事件的关系可以由happened-before 来推导
- 使用lamport逻辑时钟,把同一节点的连续两个事件之间至少有一条tick line
理论基础
-
CAP理论
- Consisitence线性一致性, Availability可用性, Network Partitioning
- 使用备份节点
-
ACID理论
- 数据库事务:Atomicty(原子性-操作) Consistency(一致性-状态) Isolation(隔离性) Durability(持久性)
-
BASE理论
- Basically available : 基本可用
- Soft state: 软状态
- Eventually consistent :最终一致性
分布式事务
-
Two-phase Commit(二阶段提交)
-
Prepare阶段和Commit阶段
-
出错:participant宕机,回滚
-
Coordinator宕机,起新的协调者查询后重复二阶段
-
都当机了,人接入
-
问题:1.性能问题2.协调者单点故障3.网络分区带来的数据不一致,commit没接收,整个事务回滚,锁解决,出现可用性问题
-
思考:
- 1.日志被保存在[可靠的]存储设备上,如何保证这一点?分布式持久化块存储
- 2.参与者Commit了,但是Ack没收到,怎么办?没收到也会回滚
-
-
Three-phase Commit(三阶段提交)
- 把prepare阶段拆成两部分CanCommit和PreCommit
- 好处 1.单点故障问题2.阻塞问题 3. 引入超时机制
- 没解决:1.性能问题2.网络分区带来的数据一致性
-
MVCC
- 悲观锁,操作时直接锁住
- 乐观锁,执行更新的时候判断修改数据
- 多版本控制方案:使用truetime api或者TSO中心化授时,后者会产生网络通信的成本
共识协议
-
Quorum NWR模型
- N:多少份备份数据
- W:多少分写了才算写成功剩下的并发更新
- R:多少分读了才算都成功
- W+R > N
- 并发更新带来的问题:有可能读到旧版本的数据,根源在于允许数据被覆盖。因此一般用在append-only这种分布式文件系统,只追加写,不覆盖。
- 优势:CAP的选择由用户选择
-
RAFT协议
- leader,candidate,follower
- log:日志只追加写解决数据被覆盖的问题
-
Paxos协议
- 可以并发修改日志
- 可以随机选主,不必最新最全的节点
- 优势:写入并发性能高,所有节点都能写入
- 劣势:没有一个节点有完整的最新的数据,恢复流程复杂,需要同步历史记录
思考题(单纯自己理解,坐等指正)
1.分布式系统有那些优势和挑战?
- 我答:优势在于去中心化,便宜,分而治之效率高,小模块坏了好换。挑战在于:网络通信性能问题,数据一致性问题,集群安全问题。
- 标答:
优点:去中心化,低成本,弹性(白天在线服务晚上离线计算,扩容缩容),资源共享(一台电脑数据存储邮上限数据共享),可靠性高(小零件可拆卸)
挑战:节点故障(必然),不可靠的网络,异构的机器(各种机器,性能不可预测),安全(集群被攻破)
- 反思,数据一致性是分布式存储的问题不是分布式系统的问题
2.两将军问题为什么理论上永远达不成共识?
- 我答:因为单次消息的传递本身就是为了确认上一条消息是否收到因此就会无限次的确认。故而要么事先就进行约定,每一次的消息确认需要带着额外信息。
3.为什么TCP采用三次握手而不是四次握手或者两次?
- 我答:因为一次消息的传递需要一个发出信号以及一次确认信号,而B发出的确认信号也可以看成是一次发出信号,因此三次。次握手只能确认单方消息能收到,四次又太多了不必要。
4.为什么在四将军问题中,增加一轮协商就可以对抗拜占庭问题?
- 我答:其实我这快也没听明白,第一轮加第二轮是确认公证人将军是不是叛徒,然后第二轮确认大多数人的选项,但是其实四个人,只有一个叛徒,一次协商票型不都是至少3比一麻,没有整明白,还有后面m轮的推导得再看看。
5.什么是最终一致性,什么是线性一致性?
- 我答:最终一致性指的是数据完成并发复制操作后最终数据一致,线性一致性指的是当收到某一个数据更新后就广播实现各个分布式的数据一致
6.CAP理论中,请举例说明可用性和一致性的矛盾?
- 我答:分布式数据库a通知数据库b失败,根据一致性,就不能提供服务,如果满足可用性,但是数据库b就拿不出一致的数据
7.ACID理论中的一致性和CAP理论的一致性的区别?
- 我答:ACID理论的一致性是状态一致,举视频里的例子就是A+B总存款不变,而CAP的则是大家查到的某条数据得是一致的
8.两阶段提交中,什么场景需要数据管理员接入?
- 我答:就是协调者和参与者都存在宕机,无法确认系统状态
9.三阶段提交缓和两阶段提交的哪两个问题?
- 我答:三阶段提交就是在prepare阶段之前问一句在吗,自己都不能发了,就是自己坏了,如果没反应不在就是参与者坏了,就是解决了单机故障,如果参与者说这事我干不了,那就是避免了阻塞问题
10.什么场景适合乐观锁?什么场景适合悲观锁?
- 我答:多读适合客观锁,多写适合悲观锁
11.在共识协议中,为什么说允许数据被覆盖会带来数据一致性问题?
- 我答:因为他不是把每个写了再写下一个请求,是写W个就算写成功了,剩下N-W个就是并发复制了,因此会导致读的时候读到还在并发写的导致不满足W+R>N了
12.在RAFT,leader写成功日志log20,后宕机没来的及同步,然后新主上了重写了一条log20,然后这两条不一样,怎么区分并且拒掉前面的log20
- 我答:我也没搞懂,但是任期号应该可以分辨出谁是新上任的主,然后对于旧主为了数据一致性可以,就按照新主往前推知道那条开始不一致然后删除不一样的日志。
13.RAFT协议中,stale读是如何产生的?如何解决stale读的问题?
- 我答:产生于双主时期,通过选举时间大于废弃时间,使得浪费一点可用性来避免双主导致的脏读。