分布式理论基础

370 阅读4分钟
一致性
  1. 强一致性,系统写入立刻可读,对性能影响较大。
  2. 弱一致性,不承诺写入后立即可读,最终会达到一致。具体:
    1. 会话一致性:在同一客户端可以读到一致
    2. 用户一致性:在同一用户可以读到一致
  3. 最终一致性,是弱一致性的特例,系统回在保证的时间内达到一致,业界比较推崇的模型。
分布式特点

分布式系统分布在不同网络计算机上,仅通过消息传递通信和协调。

  1. 分布性:任意分布
  2. 对等性:没有主从,有副本提供冗余的数据和服务。
  3. 并发性
  4. 缺乏全局时钟,很难定义不同机器执行是谁先谁后。
典型问题
  1. 通信异常:即便正常通信,单机内存访问时延10ns,网络通信一次0.1~1ms,相差100倍左右,消息丢失和延迟比较普遍。
  2. 网络分区(脑裂):网络出现问题,只有部分节点能正常通信,这一小部分节点需要完成整个分布式系统的功能。
  3. 三态:成功、失败、超时
  4. 节点故障:某个节点故障

分布式ACID事务

  1. CAP理论:无法同时满足Consistency, Availability, PartitionTolerance这三个需求。
    1. C: 一致性
    2. A: 有限时间内返回结果,超时判定这个系统不可用
    3. P:分区容错性,任何一个网络分区故障,依然可以提供服务,除非整个网络故障。
放弃ACP之一
  1. P:所有数据放在一个节点,系统无法扩展
  2. A: 与放弃P恰好相反,如果网络错误,则都会被受影响
  3. C:无法完全放弃一致性,否则系统没有意义,只能放弃强一致性,保留最终一致性。

BASE理论

由ACP演化而来

  1. basicall available
  2. soft state:数据存在中间状态,允许不同副本之间拷贝数据的时延。
  3. eventually consistent

一致性协议

由协调者和参与者,协调者负责调度参与者的行为,并决定参与者是否提交事务。

2PC two-phase commit
  • phase 1:
    1. 协调者询问参与者是否可以执行事务
    2. 参与者执行询问,记录redo,undo log
    3. 各个参与者反馈协调者事务询问相应
  • phase 2:
    1. 提交请求
    2. 事务提交
    3. 反馈事务提交结果
    4. 完成
  • phase 0: (事务未完成中断)
    1. 发送回滚
    2. 事务回滚
    3. 参与者反馈回滚
    4. 中断
优点:简单方便
缺点:
  1. 同步阻塞,所有参与者相应时都阻塞
  2. 过度依赖协调者,如果p2中协调者出问题,所有参与者事务都被锁定。
  3. commit的时候,如果崩了,可能只有一部分commit,一部分没有。导致数据不一致
  4. 参与者故障只能依靠协调者超时中断,策略差。
3PC
sequenceDiagram
Coor->>Part: can commit?
Part->>Coor: yeah!
Coor->>Part: pre commit
Part->>Coor: ack!
Coor->>Part: do commit
Part->>Coor: done!
  • phase 1 Propose:
    1. 询问
    2. 参与者返回
  • phase 2 pre commit:
    1. 协调者发送请求,进入prepared
    2. 执行事务,记录undo,redo log
    3. 反馈事务结果,并等待最终指令(commit, abort)
  • phase 3 docommit:
    1. 协调者发送请求
    2. 参与者事务提交
    3. 反馈结果
    4. 完成
  • phase 0: 参与者中断或超时中断
与两阶段提交不同的是,三阶段提交有两个改动点。
  1. 引入超时机制。(超时提交策略,当第三阶段参与者等待协调者超时后会提交事务,解决参与者同步阻塞问题,同时能在发生单点故障时,继续达成一致)
  2. 3pc的propose阶段只询问,不做事务操作,因此此时不会阻塞,2pc的propose阶段包含询问和执行事务但不commit。
Paxos

拜占庭将军问题(Byzantine Generals Problem):军队分开,只有通讯员通讯,通讯员可以背叛欺骗将军,不把信息给将军。

古希腊有个Paxos小岛,使用议会通过法令,议员通过信使传递消息,议员和信使都是兼职,随时会放弃离开,信使可能重复传递消息。保证其中不会冲突。

Quarum机制
  1. WARO write all read one,写的时候所有服务器都成功写入才算成功,否走都会失败。因此WARO牺牲了写服务,增强了读服务。
  2. Quarum是一个折中方案,比如一共有5个节点,假设需要成功更新3个节点表示更新成功,那么当读取时,至少要读取3个节点。3+3>5,因此一定会读到一个正确的值。