这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
简介
这次课程涉及分布式理论,是比较高级的计算机知识,对于我这种入门小白,能听到这节课提前了解相关概念是一件非常好的事情,不过确实也难度非常大。我简单总结了本节课的知识点,方便复习。主要着重于理清概念和回答思考题。
本节课程主要分为6个方面,所以本文也从6个方面总结。
概述
什么是分布式?
- 跨多个节点的计算机程序的集合,利用跨多个独立计算节点的计算资源来实现共同目标
Why-How-What
- why 储存和计算的大规模需求,降低成本
- how 分布式框架
- what 理清规模,明确要求
常见的分布式系统
- 分布式储存Zookeeper、分布式数据库MangoDB、分布式计算Spark 等等
系统模型
-
拜占庭将军问题
- 两将军问题
- 定义:两支军队的将军只能派信使穿越敌方领土互相通信,以此约定进攻时间。该问题希望求解如何在两名将军派出的任何信使都可能被俘虏的情况下,就进攻时间达成共识
- 结论:两将军问题是被证实无解的电脑通信问题,两支军队理论上永远无法达成共识
- 方案一:同时发送n个信使,任何一个达到对方军队都算成功
- 方案二:设置超时时间,发送后未在一定时间返回后,则增派信使
- 思考题
- 1、为何三次握手,而不是两次或者四次?
我认为TCP三次握手是为了确保客户端与服务器之间的连接是可靠的。三次握手的设计保证了在建立连接时不会出现丢失的报文段和不必要的资源浪费。如果只有两次握手,那么可能会出现客户端发送SYN,服务器收到后发送ACK,但是在客户端收到ACK之前它就关闭了,导致服务器的连接请求被浪费。三次握手即可实现可靠性就不需要更复杂的四次握手了。
- 2、挥手过程中,如果FIN报文丢失,发生什么?
如果FIN报文在TCP四次挥手过程中丢失,那么可能导致连接在一段时间内锁死,无法断开连接。因为在四次挥手中,FIN报文是断开连接的报文,如果丢失,那么服务器就不会知道客户端请求终止连接。
为了避免这种情况,TCP协议中设置了超时重传机制,如果在一定时间内没有收到对方的响应,那么就会重新发送该报文,直到收到对方的正确响应。这样连接就能正常断开。与拜占庭将军解决方案2一样。
-
共识和一致性
- 不同客户端A和B看到客户端C写入,因为时机的不同,产生数据读取的偏差。
理论基础
- CAP理论,即 1. Consistency(一致性)2. Availability(可用性)3. Partition tolerance(分区容忍性)。三者无法同时达到
-
CAP诞生了三类系统:
- CA系统:传统数据库的代表
- AP系统:放弃强一致性,保证高可用,不少nosql存储系统采用
- CP系统:放弃可用性,保证数据一致性
-
ACID理论
- ACID理论是针对CA系统而言的,通常在数据库中具有广泛意义
- 数据库事务拥有四个特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)
-
BASE理论
- BASE理论是针对AP系统而言的,其来源于对大型互联网分布式实践的总结
分布式事务
两阶段提交
-
二阶段提交(Two-phase Commit):为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
-
正常流程:Prepare阶段和Commit阶段
-
异常流程:Prepare阶段失败 -> 回滚;协调者宕机 -> 重新启用新的协调者;双故障重启 -> 数据库管理员介入
-
思考题:
-
日志被保存在「可靠」的存储设备上。如何保证可靠这一点?
- 在分布式时代,建立一层分布式文件系统,分布式快储存系统等来保证日志可靠存储。
-
参与者Commit了,但Ack信息协调者没收到。怎么办?
- commit没有看到ack,以为没成功,则回滚整个事务。
-
三阶段提交
将两阶段提交中的Prepare阶段,拆成两部分:CanCommit和PreCommit机制
CanCommit阶段:询问是否可以执行;PreCommit阶段:重新确认是否可以执行
MVCC
- 维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。提高并发性能的同时也解决了脏读的问题。
- 悲观锁:操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据
- 乐观锁:不会上锁,只是在执行更新时判断别人是否修改数据,只有冲突时才放弃操作
共识协议
- Quorum NWR模型
- RAFT协议
- Paxos协议
课后复习
1、分布式系统有哪些优势和挑战?
优势:去中心化、低成本、弹性、资源共享、可靠性高 挑战:普遍的节点障碍、不可靠的网络、异构的及其与硬件环境、安全
2、两将军问题为什么理论上永远达不成共识?
因为不确定状态,两个将军之间传递信息时,不能保证对方收到了正确信息,从而不能保证信息的一致性,也就达不成共识。
3、为什么TCP采用三次握手?而不是两次和四次?
这个问题在前面已经回答过。两次握手可能客户端提前关闭导致浪费。四次握手更复杂浪费。
4、为什么在4将军问题中,增加1轮协商就可以对抗拜占庭故障?
每轮协商可以减少拜占庭将军中没有故障的可能性。因此,在一个足够大的数量的协商轮次中,可以确定出哪个将军没有故障。
5、什么是最终一致性?什么是线性一致性?
最终一致性:在分布式系统中,所有节点最终都会到达相同的状态
现行一致性:指分布式系统事务中每个节点按照相同的顺序字形,从而保证事务的状态是一致的。线性一致性是实现最终一致性的基础
6、CAP理论中,请举例说明可用性和一致性的矛盾?
比如,若在分布式数据库系统中,为保证一致性,请求数据都经过单一的数据中心进行处理,那么可用性就会下降,因为数据中心可能会出故障,导致所有请求无法处理。
7、数据库里的一致性和分布式系统中的一致性有什么区别?
数据库一致性:指数据库内部的一致性
分布式系统中的一致性:指数据在多个节点或数据中心间能保持一致
8、两阶段提交中,什么场景需要数据库管理员介入?
Coordinator宕机,Participant宕机的情况,这是个无法确认的状态,需要数据库管理员介入。
9、三阶段提交缓和两阶段提交的哪两个问题?
缓和了性能问题、网络分区场景带来的数据一致性问题。但本质上依然没有解决。
10、什么场景适合乐观锁?什么场景适合悲观锁?
乐观锁允许多读,更新时判断别人是否修改数据,冲突是才放弃操作,所以适用于多读场景。
悲观锁只允许单个读写,操作完成后才释放锁。所以适合多写场景。
后三个问题暂略。以后再思考补充。
参考资料:
【后端专场 学习资料三】第五届字节跳动青训营 - 掘金 (juejin.cn)
分布式理论 - 现代架构基石.pptx - 飞书云文档 (feishu.cn)