一致性
- 强一致性,系统写入立刻可读,对性能影响较大。
- 弱一致性,不承诺写入后立即可读,最终会达到一致。具体:
- 会话一致性:在同一客户端可以读到一致
- 用户一致性:在同一用户可以读到一致
- 最终一致性,是弱一致性的特例,系统回在保证的时间内达到一致,业界比较推崇的模型。
分布式特点
分布式系统分布在不同网络计算机上,仅通过消息传递通信和协调。
- 分布性:任意分布
- 对等性:没有主从,有副本提供冗余的数据和服务。
- 并发性
- 缺乏全局时钟,很难定义不同机器执行是谁先谁后。
典型问题
- 通信异常:即便正常通信,单机内存访问时延10ns,网络通信一次0.1~1ms,相差100倍左右,消息丢失和延迟比较普遍。
- 网络分区(脑裂):网络出现问题,只有部分节点能正常通信,这一小部分节点需要完成整个分布式系统的功能。
- 三态:成功、失败、超时
- 节点故障:某个节点故障
分布式ACID事务
- CAP理论:无法同时满足Consistency, Availability, PartitionTolerance这三个需求。
- C: 一致性
- A: 有限时间内返回结果,超时判定这个系统不可用
- P:分区容错性,任何一个网络分区故障,依然可以提供服务,除非整个网络故障。
放弃ACP之一
- P:所有数据放在一个节点,系统无法扩展
- A: 与放弃P恰好相反,如果网络错误,则都会被受影响
- C:无法完全放弃一致性,否则系统没有意义,只能放弃强一致性,保留最终一致性。
BASE理论
由ACP演化而来
- basicall available
- soft state:数据存在中间状态,允许不同副本之间拷贝数据的时延。
- eventually consistent
一致性协议
由协调者和参与者,协调者负责调度参与者的行为,并决定参与者是否提交事务。
2PC two-phase commit
- phase 1:
- 协调者询问参与者是否可以执行事务
- 参与者执行询问,记录redo,undo log
- 各个参与者反馈协调者事务询问相应
- phase 2:
- 提交请求
- 事务提交
- 反馈事务提交结果
- 完成
- phase 0: (事务未完成中断)
- 发送回滚
- 事务回滚
- 参与者反馈回滚
- 中断
优点:简单方便
缺点:
- 同步阻塞,所有参与者相应时都阻塞
- 过度依赖协调者,如果p2中协调者出问题,所有参与者事务都被锁定。
- commit的时候,如果崩了,可能只有一部分commit,一部分没有。导致数据不一致
- 参与者故障只能依靠协调者超时中断,策略差。
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:
- 询问
- 参与者返回
- phase 2 pre commit:
- 协调者发送请求,进入prepared
- 执行事务,记录undo,redo log
- 反馈事务结果,并等待最终指令(commit, abort)
- phase 3 docommit:
- 协调者发送请求
- 参与者事务提交
- 反馈结果
- 完成
- phase 0: 参与者中断或超时中断
与两阶段提交不同的是,三阶段提交有两个改动点。
- 引入超时机制。(超时提交策略,当第三阶段参与者等待协调者超时后会提交事务,解决参与者同步阻塞问题,同时能在发生单点故障时,继续达成一致)
- 3pc的propose阶段只询问,不做事务操作,因此此时不会阻塞,2pc的propose阶段包含询问和执行事务但不commit。
Paxos
拜占庭将军问题(Byzantine Generals Problem):军队分开,只有通讯员通讯,通讯员可以背叛欺骗将军,不把信息给将军。
古希腊有个Paxos小岛,使用议会通过法令,议员通过信使传递消息,议员和信使都是兼职,随时会放弃离开,信使可能重复传递消息。保证其中不会冲突。
Quarum机制
- WARO write all read one,写的时候所有服务器都成功写入才算成功,否走都会失败。因此WARO牺牲了写服务,增强了读服务。
- Quarum是一个折中方案,比如一共有5个节点,假设需要成功更新3个节点表示更新成功,那么当读取时,至少要读取3个节点。3+3>5,因此一定会读到一个正确的值。