后端基础| 青训营笔记

94 阅读9分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 7 天。

image.png

分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算、分布式存储、分布式数据库等。
场景:数据库系统 数据库同步系统 缓存系统 服务器集群 中间件 文件存储系统 实时计算系统(构建在便宜的服务器集群上)
场景:数据库系统 数据库同步系统 缓存系统 服务器集群 中间件 文件存储系统 实时计算系统(构建在便宜的服务器集群上)
优势: 去中心化 低成本 弹性 资源共享 可靠性高(多副本冗余)
挑战:普遍的节点故障 不可靠的网络(对/错/未决) 异构的机器与硬件环境(性能不可预测) 安全

使用者视角:
why: 1.数据爆炸,对存储和计算有大规模运用的诉求 2.成本低,构建在廉价服务器之上
how:1.分布式框架2.成熟的分布式系统
what:1.理清规模,负载,一致性要求等 2.明确稳定性要求,制定技术方案
学习者视角
why:1.后端开发必备技能2.帮助理解后台服务器之间协作的机理
How:1.掌握分布式理论2.了解一致性协议
What:1.把要点深入展开,针对难点搜索互联网资料进行学习2.将所学知识运用于实践

image.png

故障模型(根据处理的难易程度进行划分)
Byzantine failure: 节点可以任意篡改发送给其他节点的数据(网络出现严重问题或者安全事故)加密或者冗余涉及
Authentication detectable byzantine failure(ADB): Byzantine failure的特例;节点可以篡改数据,但不能伪造其他节点的数据(内存或磁盘发生错误)
Performance failure: 节点未在特定时间段内收到数据,即时间太早或太晚(处理慢了,不要尝试做恢复因为不知道回恢复时间)
Omission failure: 节点收到数据的时间无限晚,即收不到数据(表现为长时间不响应)
Crash failure: 在omission failure的基础上,增加了节点停止响应的假设,也即持续性地omission failure(宕机)
Fail-stop failure: 在Crash failure的基础上增加了错误可检测的假设(错误码是明确的)
正确性,时间,状态,原因
故障模型 image.png

拜占庭将军问题:派出信使,约定进攻时间,有可能被俘虏,然后是否能达成共识
结论:理论上永远无法达成共识
方案一:同时发送N个信使,任何一个到达对方军队,都算成功
方案二:设置超时时间,发送后未在一定时间返回,则加派信使
共识与消息传递的不同:即使保证了消息传递成功,也不可能保证达成共识
TCP三次握手是在两个方向确认包的序列号,增加了超时重试,是两将军问题的一个工程解。

image.png

共识和一致性
最终一致性:改动期间可能看到不同的数据结果
线性一致性:强一致性,也就是在读到更新的数据的时候就会同步给其他的客户端

image.png

时间和时间顺序
a b之间不能相互指向,我们称之为两件事情是并发的

image.png

image.png

cap理论:
C(consistence)一致性,指数据在多个副本之间能够保持一致的特性(严格的一致性)
A(Availability)可用性,指系统提供的服务必须一直处于可用的状态,每次请求都能获得到非错的响应——但是不保证获取的数据为最新数据
P(Network partitioning)分区容错性,分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障
CAP理论:数据库领域,分布式存储方向
CA:放弃分区容错性,加强一致性和可用性,其实就是传统的淡季数据库的选择
AP:放弃一致性(强一致性),追求分区容错性和可用性,例如一些注重用户体验的系统
CP:放弃可用性,追求一致性和分区容错性,例如与钱财安全相关的系统

image.png
左边那个是可用性,不保证一致性。右边就是访问P2的时候就直接拒绝服务 定义两个节点
Master,所有请求由他来负责
Backup,备用,如果master发生故障就把负载转换到backup 可用性和可用性损失一点,但是没上面那些方案这么严重

image.png

数据库的一致性指的是事务的一致性,cap里面的一致性指的是信息的一致性 原子性更多指的是操作,一致性更多指的是状态

image.png

二阶段提交:为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
三个假设:
引入协调者和参与者,互相进行网络通信
所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上
所有节点不会永久性损坏,即使损坏后仍然可以恢复
prepare阶段,就是Coordinator给参与者发送prepare指令然后参与者回复done指令,例子:就是转账的时候进行协商,跟其中一个说减少跟另一个说进行增加
commit阶段,然后就是Coordinator发送commit消息,然后参与者回复ack就可以进行提交

image.png


1.性能问题:两阶段提交需要多次节点间的网络通信,耗时过大,资源需要进行锁定,徒增资源等待时间
2.协调者单点故障问题:如果事务协调者节点宕机,需要另起新的协调者,否则参与者处于中间状态无法完成事务
3.网络分区带来的数据不一致:一部分参与者收到了Commit消息,另一部分没有收到,会导致节点之间数据不一致(要进行回滚,锁的机制进行查询,存在一定的可用性问题)

可靠如何保证
通常单机: 由高性能的硬件进行保障IOE,EMC的存储,可靠
分布式: 建立一层分布式文件系统,块存储或者kv系统

参与者commit 但是ack没收到: 回滚整个事务

三阶段提交:
就是将prepare阶段拆分成CanCommit(进行询问可以避免阻塞或资源浪费,也能很好防止单点故障问题)和PreCommit,另外还引入了超时机制,在等待超时之后,会继续进行事务的提交。

image.png

image.png MVCC是一种并发控制的方法,维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。MVCC为每个修改保存一个版本,和事务的时间戳相关联,可以解决并发性能,解决脏读的问题。

image.png 这种依赖硬件

另外一种时间戳的实现:时间戳预言机(TSO),采用中心化的授时方式,所有协调者向中心化节点获取时钟。优点是算法简单,实现方便,但需要每个节点都与他进行交互,会产生一些网络通信的成本。TSO的授时中就需要考虑低延迟,高性能以及更好的容错性。

共识协议

image.png 能把cap的选择交给用户

RAFT协议:是一种分布式一致算法(共识算法),即使出现部分节点故障,网络延迟等情况,也不影响各节点,进而提高系统的整体可用性。RAFT是使用较为广泛的分布式协议。一定意义上讲,RAFT也使用了Quorum机制。

image.png

Log(日期号):节点之间同步的信息,以只追加写的方式进行同步,解决了数据被覆盖的问题
Term(任期号):单调递增,每个Term内最多只有一个Leader
Committed:日志被复制到多数派节点,即可认为已经被提交
Applied:日志被应用到本地状态机:执行了log中命令,修改了内存状态

image.png

Leader选举:一开始全是F,然后Current Term+1,然后选举自己,接着收到多数派请求成为Leader,其他为F。收到部分,但是未达到多数派,选举超时,随机timeout开始下一轮
两个规则:在一个任期内每个参与者最多投一票(持久化)要成为Leader,必须拿到多数投票
Log Replication过程:新Leader产生,L和F不同步,L强制覆盖F的不同步的日志
1.Leader收到写请求w
2.将w写入本地log
3.向其它Follower发起AppendEntries RPC
4.等待多数派回复
更新本地状态机,返回给客户端
下一个心跳通知Follower上一个Log已经被Committed了
Follower也根据命令应用本地状态机
5. Follower有问题,Leader一直retry
心跳指的是:L和F的周期性发送的过程
Leader出现问题就重新进行选举
切主
当Leader出现问题时,就需要进行重新选举
1.Leader发现失去Follower的响应,失去Leader身份
2.两个Follower之间一段时间未收到心跳,重新进行选举,选出新的Leader,此时发生了切主
3.Leader自杀重启,以Follower的身份加入进来


Stale读
发生Leader切换,old leader收到了读请求,如果直接响应,可能会有Stale Read。如何解决 ?
解决方案,保证读的强一致
读操作在lease timeout内,默认自己是leader:不是则发起一次heartbeat。等待Commit Index应用到状态机。
Election timeout > lease timeout : 新leader _上任,自从上次心跳之后一定超过了Electiontimeout,旧leader大概率能够发现自己的Lease过期

image.png

image.png

在线服务 image.png

总结思维导图 image.png