1. 理解一致性
多份数据保持一致。
- 一份数据,存储在不同数据存储服务节点上,主从场景。
- 业务方面,涉及到多个有状态的服务。如下单需增加订单数据、扣减库存。
2. 什么情况会导致不一致?
网络分区、故障、异常导致多个操作的部分操作不能成功。
问题
- 协调者询问各参与者是否可以提交;等待所有参与者给出响应。
- 参与者执行事务操作到等待提交指令的点(这个过程中记录 redo、undo 日志)。
- 参与者响应是否准备好提交的结果给协调者,并阻塞等待协调者的下一个指令。
协调者接收所有参与者的响应,如果超时未收到响应,当 abort 处理。有一个 abort,则下一步是回滚。
P2:提交阶段
协调者向所有参与者发出提交或回滚的消息。
- 参与者执行提交/回滚,释放占用的锁等资源,并作出响应。
2PC 当协调者宕机时(网络分区时)将一直阻塞。
1. 正常操作
两个客户端分别修改两个节点状态
两个节点状态修改,并分别通知其他节点
造成集群中节点不一致
2. 添加 Leader 节点
会有一个 Leader 节点
所有的写请求发往 Leader 节点
请求会有先后顺序,假如 v1 先到达,会通知其他节点
v2 后到,再次进行广播
节点数据更新为 v2
问题
- Proposer:提议者,负责提议,提出想要达成一致的 value 提案。
- Acceptor:接收者,对提案投票,决定是否接受此 value 提案。
- Learner:学习者,不参与投票,学习投票决定的提案。
一个节点既可以是 提议者,也可以是投票者。
提案内容
- 提案编号:唯一,保证全局递增,体现提案的先后顺序。
-
操作流程,两阶段:
准备阶段(投票阶段)
- 提议者提出提案给接收者;
- 接收者如果同意该提案,做出 promise 响应,并不再 Accept 比当前提案号低的提案;
- 提议者收到超过半数的响应,则进入下一阶段;否则重新提案。
接受变更阶段(提交阶段)
同一提案,提议者 2、提议者 1 先后被批准,正常场景。
- 接收者 3 与提议者 2 失联、接收者 1 与 提议者 1 失联,异常场景。
Paxos 读流程
- 接收客户端请求的节点,向集群广播获取大家的当前值;
- 接收到过半数相同的值,则返回该值,如果本地的值不同,则更新为多数值;
- 如果得不到过半数的相同值,则读取失败。
7. 其他
- ZAB
- 具体看上一篇笔记《4.1.2-4. zk 集群》。
- RAFT:http://thesecretlivesofdata.com/raft/
- 节点有三个状态:从节点、候选、Leader。
- 第一个要做的事情就是 Leader 选举。
- 然后才是 Leader 接收写请求,协调数据的一致性。
- 保证数据一致性的过程:日志+同步。