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

90 阅读4分钟

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

分布式概述

  1. 什么是分布式系统?

    分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源实现共同的目标

  2. 为什么要学习分布式系统?

    帮助理解服务器之间协作的机理

  3. 常见的分布式系统

    分布式存储:GFS、Ceph、HDFS、Zookeeper

    分布式数据库:Spanner、TIDB、HBase、MongoDB

    分布式计算:Hadoop、YARN、Spark

系统模型

故障模型

  • Byzantine failure:节点可以任意篡改数据
  • Authenticaiton detectable byzantine failure:节点可以篡改自己的数据
  • Performance failure:节点未在特定时间收到数据
  • Omission failure: 收不到诗句
  • Crash failure:节点停止相应
  • Fail-stop failure:错误可检测

拜占庭将军问题

  • 两将军问题:

    • 定义:如何在两面将军派出的任何信使都可能被俘虏的情况下,就进攻时间达到共识
    • 结论:永远无法达到共识
    • TCP是两将军问题的一个工程解
  • 三将军问题:

    • 三个将军如果出现一个"叛徒",那么无法达到一致
    • 因为叛徒可以篡改信息,比如进攻改为撤退,那么A将军收到两票进攻一票撤退,B将军收到两票撤退一票进攻
  • 四将军问题:

    • 将军D作为消息分发中枢,约定没有收到消息则执行撤退
    • 步骤:
      • 如果D为叛徒,ABC无论收到任何消息,总能达成一致
      • 如果D为忠将,那么最终决策能复合大多数
    • 能够证明,当有3m+1位将军,m个叛徒时,可以进行m轮协商,最终达到一致

共识和一致性

  • 不同客户端看到客户端的写入时机不同,产生数据读取偏差(脏读?)
  • 所以需要共识保证所有客户端看到相同值

时间和事件顺序

理论基础

CAP理论

  • 定义:

    C:一致性

    A:可用性

    P:分区容错性

  • 系统: CP系统:为了避免读到不一致数据,可能拒绝访问 AP系统:为了保证可用性,允许不同进程读到不同数据

  • 故障转移:

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

ACID理论

  • 定义:

    A:原子性

    C:一致性

    I:隔离性

    D:持久性

  • ACID是针对CA系统而言的

BASE理论

  • BASE是针对AP系统而言的

  • 定义:

    Basically Avaliable:假设系统出现了不可预知的故障,但还是能用

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

    Eventually consisitent:数据最终一定能够达到一致的状态

分布式事务

二阶段提交

  • 三个假设:

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

    Prepare和commit

  • 异常流程:

    Prepare阶段失败 -> 回滚

    协调者宕机 -> 重新启用新的协调者

    双故障重启 -> 数据库管理员介入

  • 问题:

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

三阶段提交

  • 将两阶段提交中的Prepare拆分为:CanCommit和PreCommit
  • CanCommit:询问是否可以执行;Precommit:重复确认是否可以执行
  • DoCommit:向所有人提交事务

MVCC

  • MVCC:多版本并发控制。维持一个数据多个版本使读写操作没有冲突
  • 悲观锁和乐观锁
    • 悲观锁:锁住资源,不让其他人访问数据
    • 乐观锁:不会锁住资源,只在执行更新时判断别人是否修改数据,冲突时放弃操作
  • 版本的选取:物理时钟或逻辑时钟

总结

这节课我学习到了一些简单的分布式理论,对于raft等分布式协议我还没有学会,所以在此就不放出来误导大家了