分布式理论 - 现代架构基石 | 青训营笔记

98 阅读10分钟

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

前言

本文主要是介绍了分布式理论的概述、系统模型、理论基础、事务、共识协议及分布式实践等内容。

概述

什么是分布式

分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算、分布式存储、分布式数据库等。

分布式系统五大优势:

  • 去中心化
  • 低成本
  • 弹性
  • 资源共享
  • 可靠性高

四大挑战:

  • 普遍的节点故障
  • 不可靠的网络
  • 异构的机器与硬件环境
  • 安全

常见的分布式系统

image.png

系统模型

故障模型

  • Byzantine failure:节点可以任意篡改发送给其他节点的数据,是最难处理的故障
  • Authentication detectable byzantine failure (ADB):节点可以篡改数据,但不能伪造其他节点的数据
  • Performance failure:节点未在特定时间段内收到数据,即时间太早或太晚
  • Omission failure:节点收到数据的时间无限晚,即收不到数据
  • Crash failure:节点停止响应,持续性的故障
  • Fail-stop failure:错误可检测,是最容易处理的故障

拜占庭将军问题

  • 两将军问题

    • 定义:

      • 两支军队的将军只能派信使穿越敌方领土互相通信,以此约定进攻时间。该问题希望求解如何在两名将军派出的任何信使都可能被俘虏的情况下,就进攻时间达成共识
    • 结论:

      • 两将军问题是被证实无解的电脑通信问题,两支军队理论上永远无法达成共识
    • TCP是两将军问题的一个工程解

  • 三将军问题:

    • 两个“忠将”A和B,一个“叛徒”C,互相传递消息,消息可能丢失,也可能被篡改,当有一个将军是“叛徒”(即出现拜占庭故障)时,整个系统无法达成一致。
    • 由于“叛徒”C的存在,将军A和将军B获得不同的信息。这样将军A获得2票进攻1票撤退的信息,将军B获得1票进攻2票撤退的信息,产生了不一致
  • 四将军问题:

    • 将军D作为消息分发中枢,约定如果没收到消息则执行撤退

    • 步骤:

      • 如果D为“叛徒”,ABC无论收到任何消息,总能达成一致
      • D为“忠将”,ABC有2人将D的消息进行正确的传递,同样能保证最终决策符合大多数。
    • 进而能够证明,当有3m+1个将军,m个“叛徒”时,可以进行m轮协商,最终达成一致

共识和一致性

  • 不同客户端A和B看到客户端C写入,因为时机的不同,产生数据读取的偏差。引导出最终一致性的详细说明
  • 要保证所有客户端看到相同的值,需要多节点进行“协商”,达成共识,来保证线性一致性
  • 一致性和可用性是对矛盾

时间和事件顺序

  • 1978年Leslie Lamport发表《Time, Clocks, and the Ordering of Events in a Distributed System》

    • 定义了计算机系统中的时间和事件顺序,引入happened before和并发的定义,可以以此对分布式系统中的事件进行推导
    • 根据上述推导,创造了Lamport逻辑时钟的概念,这个概念在分布式理论中具有革命性的意义,帮助我们在一系列分布式事件当中梳理出逻辑的先后关系。利用逻辑时钟,我们可以对整个系统中的事件进行全序排序

理论基础

CAP理论

  • CAP的定义,分别代表一致性、可用性、分区容错性。三者无法同时达到

  • CAP诞生了三类系统:

    • CA系统:传统数据库的代表
    • AP系统:放弃强一致性,保证高可用,不少nosql存储系统采用
    • CP系统:放弃可用性,保证数据一致性
  • 举例说明两个分布式进程之间同步数据,当出现故障的时候,如何选择不同的CAP系统,以及带来的影响

    • CP系统:故障发生时,为了避免读到不一致的数据,可能拒绝访问
    • AP系统:故障发生时,为了保证可用性,允许不同进程读到不同的数据
  • 针对故障场景,可以通过故障转移的方式,做一个相对较优的解决方式:

    • 允许一个进程作为Master,其他进程作为Backup,当故障时将请求转移给Backup进行处理

ACID理论

  • BASE理论是针对AP系统而言的,其来源于对大型互联网分布式实践的总结

    • Basically Available(基本可用):假设系统,出现了不可预知的故障,但还是能用

    • Soft state(软状态):允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性

    • Eventually consistent(最终一致性):数据最终一定能够达到一致的状态

image.png

BASE理论

  • BASE理论是针对AP系统而言的,其来源于对大型互联网分布式实践的总结

    • Basically Available(基本可用):假设系统,出现了不可预知的故障,但还是能用
    • Soft state(软状态):允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性
    • Eventually consistent(最终一致性):数据最终一定能够达到一致的状态

分布式事务

二阶段提交

  • 定义:

    • 二阶段提交(Two-phase Commit):为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法。
  • 三个假设:

    • 协调者和参与者进行通信
    • 预写式日志被保持在可靠的存储设备上
    • 所有节点不会永久性损坏,即使损坏后仍然可以恢复
  • 正常流程:Prepare阶段和Commit阶段

  • 异常流程:Prepare阶段失败 -> 回滚;协调者宕机 -> 重新启用新的协调者;双故障重启 -> 数据库管理员介入

  • 两阶段提交需解决的问题:

    • 性能问题:需要多次网络通信,资源需要等待并锁定
    • 新协调者:如何确定状态选出新协调者
    • Commit阶段网络分区带来的数据不一致:非所有节点都收到Commit请求
  • 两个思考:

    • 日志被保存在「可靠」的存储设备上。如何保证这一点?
    • 参与者Commit了,但Ack信息协调者没收到。怎么办?

三阶段提交

  • 针对两阶段提交的补充,将两阶段提交中的Prepare阶段,拆成两部分:CanCommit和PreCommit机制
  • CanCommit阶段:询问是否可以执行;PreCommit阶段:重新确认是否可以执行
  • DoCommit阶段:向所有人提交事务

MVCC

  • MVCC:多版本并发控制的方法。维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。提高并发性能的同时也解决了脏读的问题。

  • 悲观锁和乐观锁

    • 悲观锁:操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据
    • 乐观锁:不会上锁,只是在执行更新时判断别人是否修改数据,只有冲突时才放弃操作
  • 版本的选取:使用物理时钟或逻辑时钟

    • 物理时钟:提供TrueTime API,有Master节点维持一个绝对时间,保证各个服务器之间时钟误差控制在ϵ内,通常ϵ<7ms。
    • 逻辑时钟:中心化授时的方式--时间戳预言机(TSO),好处是无需硬件的支持

共识协议

Quorum NWR模型

  • 三要素:

    • N:在分布式存储系统中,有多少份备份数据
    • W:代表一次成功的更新操作要求至少有w份数据写入成功
    • R: 代表一次成功的读数据操作要求至少有R份数据成功读取
    • 为了保证强一致性,需要保证 W+R>N
  • Quorum NWR模型将CAP的选择交给用户,是一种简化版的一致性模型

  • 引起的并发更新问题

    • 如果允许数据被覆盖,则并发更新容易引起一致性问题

RAFT协议

  • 概述

    • Raft协议是一种分布式一致性算法(共识算法),即使出现部分节点故障,网络延时等情况,也不影响各节点,进而提高系统的整体可用性。Raft是使用较为广泛的分布式协议。
  • 三种角色

    • Leader - 领导者:Leader 负责处理所有的客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后,通知Follower提交日志
    • Follower - 跟随者:接受并持久化Leader同步的日志,在Leader告知日志可以提交后,提交日志
    • Candidate - 备选者:Leader选举过程中的临时角色。向其他节点发送请求投票信息
  • 四种定义:

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

image.png

  • Leader选举过程:

    • 初始全部为Follower

    • Current Term + 1

    • 选举自己

    • 向其它参与者发起RequestVote请求,retry直到

      • 收到多数派请求,成为Leader,并发送心跳
      • 收到其它Leader的请求,转为Follower,更新自己的Term
      • 收到部分,但未达到多数派,选举超时,随机timeout开始下一轮

两个规则:

  1. 在一个任期内每个参与者最多投一票(持久化)
  2. 要成为Leader,必须拿到多数投票
  • Log Replication过程:

    • 新Leader产生,Leader和Follower不同步,Leader强制覆盖Followers的不同步的日志
  • 切主:当Leader出现问题时,就需要进行重新选举

    • Leader发现失去Follower的响应,失去Leader身份
    • 两个Follower之间一段时间未收到心跳,重新进行选举,选出新的Leader,此时发生了切主
    • Leader自杀重启,以Follower的身份加入进来
  • Stale读:

    • 发生Leader切换,old leader收到了读请求。如果直接响应,可能会有Stale Read

Paxos协议

  • Paxos算法与RAFT算法区别:

    • Multi-Paxos 可以并发修改日志,而Raft写日志操作必须是连续的
    • Multi-Paxos 可以随机选主,不必最新最全的节点当选Leader
  • 优劣势

    • 优势:写入并发性能高,所有节点都能写
    • 劣势:没有一个节点有完整的最新的数据,恢复流程复杂,需要同步历史记录

分布式实践

MapReduce

设计一个简易的MapReduce系统。

image.png

Mapper:将输入分解为多个Job来并行处理。彼此间几乎没有依赖关系 Shuffler:将maper结果打乱,防止数据倾斜 Reducer:对map阶段的结果进行全局汇总

容错: 1.Mapper故障:由中心节点重新发起调度,新起Mapper重跑job 2.Redeuer故障:重跑Mapper,代价大

分布式KV

设计一个简易的分布式键值系统。

架构:将海量结构化数据根据Key分成不同的Region,每个Region构建一个单机KV数据库,Region之间形成Raft Groups,做到强一致

容错:当Node故障,通过Raft Learner模式进行数据修复

弹性:当出现局部Key热点或数据膨胀时,Region可以进行Split操作,分成两个子Region,反之收缩时进行Merge操作

image.png

引用

  • 第五届字节跳动青训营-「分布式理论 - 现代架构基石」