【数据一致性】理解分布式系统中的一致性
首先,什么是一致性?
一致性是指分布式系统中多个节点为达到某一数值而达成的协议。
具体来说,可以分为强一致性和弱一致性。
- 强一致性:所有节点的数据在任何时候都是相同的。同时,您应该得到节点A中的key1值和节点B中的key1值。
- 弱一致性:无法保证所有节点在任何时候都拥有相同的数据,并且存在许多不同的实现。最广泛实现的是最终的一致性。所谓最终一致性,是指任何节点上的相同数据在任何时间都是相同的,但随着时间的推移,不同节点上的相同数据总是朝着收敛的方向变化。也可以简单理解为,经过一段时间后,节点之间的数据最终会达到一致状态。
分布式和一致的应用场景:
多节点提供读写服务,确保高可用性和可扩展性(ZooKeeper, DNS, redis集群)
分布式系统面临的问题:
- 消息异步(asynchronous):真实的网络不是一个可靠的通道,存在消息延迟、丢失,以及节点间消息不能同步(synchronous)
- node-fail-stop:节点继续崩溃并且无法恢复
- 节点宕机恢复(fail- recovery):节点经过一段时间后恢复,在分布式系统中最为常见
- 网络分区:网络链接有问题,将N个节点分成多个部分
- 拜占庭故障(拜占庭故障)[2]:节点或宕机或逻辑故障,即使没有卡抛出干扰分辨信息
需要满足一致性的分布式系统设计的一般前提是不存在拜占庭一般问题(内部网可信)
本文介绍了分布式系统的基本理论FLP定理,即当只有节点宕机时,系统的可用性和强一致性不能同时满足。另一种观点是CAP理论,即强一致性、可用性和分区容错,其中只有两种可以保证。
有许多协议确保一致性,包括2PC, 3PC, Paxos, raft和PacificA。
2PC:
两阶段锁提交协议,保证多个数据片上操作的原子性。(分布式事务)
将节点分为协调者和参与者(participat),并将执行分为两个阶段。
- 阶段1:协调器发起一个建议,询问是否接受每个参与者。参与执行事务操作,将撤销和重做信息写入事务日志,并向协调器回复是或否。
- 阶段2:协调器根据参与者的反馈提交或终止事务。如果参与者的回答都是yes,则提交,只要参与者的回答是no。根据协调器的提交/回滚信息正式提交或终止事务,释放占用的资源并返回ack。
- 优点:原理简单,易于实现
- 缺点:同步阻塞,单点问题,数据不一致(协调员崩溃之前发送提交请求或网络原因共识不收到提交的一部分,那么参与者不能提交事务的一部分),过于保守(如果参与者在协调)如果有失败在沟通、协调器只能依靠超时机制来确定事务需要打断。
3PC:
3级锁提交协议,保证多个数据片上操作的原子性。(分布式事务)
相对于2PC,分为查询、预提交、提交3个阶段(解决阻塞,但仍有数据不一致的可能)
流程:在收到参与者的反馈(投票)后,协调器进入阶段2,并向每个参与者发送准备提交命令。参与者可以在收到提交指令后锁定资源,但要求回滚相关操作。在收到应答(ACK)后,协调器进入第三阶段并提交/中止。3PC的第三阶段与2PC的第二阶段没有什么不同。3PC也采用协调看门狗和状态记录。
Paxos算法(求解单点问题)
Paxos算法是目前最重要的一致性算法,所有的一致性算法都是Paxos或Paxos的简化版本。
Paxos算法会解析相同数据的多个值,以达成一个值的一致。证明正确性的理论基础:任何两个合法集合(包含超过一半节点的集合)的交集都不是空的。
性格:
在投票过程的提案中有三个作用:
- Proposer:可能有多于一个提案人,并负责提出建议。
- Acceptor:必须有多个收件人。他们对特定的提案进行投票,同意接受提案,或不同意。
- Learner:学习者,收集各Acceptor接受的提案,按照少数多数的原则形成最终提案。
事实上,分布式系统中的一个组件可以对应一个或多个角色。
算法描述:
*第一阶段(准备阶段)
申请人:
- 选择提案编号n,向大多数接受人发送编号n的准备请求。
受体:
- 如果提案号n大于已经收到的提案号,提案人承诺不接受编号小于n的提案号。如果之前已经接受过提案号,则以已接受提案号中编号最高的提案号为已发送提案号。
- 如果收到的提案号n小于它收到的提案号的最大数目。
*第二阶段(接受阶段)
申请人:
- 首先,依次接收响应:
- 如果收到拒绝,将不处理。
- 如果你收到了“同意”,同时也收到了“接受人”已经接受的建议书,记下建议书和编号。
- 处理完回应后,计算拒绝和同意的数量:
- 如果大多数人拒绝,为下一个提案做准备。
- 如果大多数人同意,从这些Acceptors接受的提案中选择提案号最大的提案作为提案,不使用自己的提案,逐个向Acceptor发送Accept消息。
受体:
- 如果收到的提案编号n小于它收到的最大提案编号。
- 如果收到的提案编号n等于它收到的最大提案编号,该提案将被接受。
- 如果接收到的提案号n大于它接收到的最大提案号。
- 形成共识(与准备和接受阶段平行)
受体:
- 每当一个提案被接受,提案和编号就会被发送给学习者。
学习者:
- 记录每个接受人当前接受的提案。如果Acceptor连续发送多个提案,则保留数量最大的提案。
- 计算接受每个提案的接受人数。如果有一半以上的人被接受,就会形成共识。
原文:https://medium.com/@mena.meseha/understanding-of-consistency-in-distributed-systems-27da174cc05a
本文:http://jiagoushi.pro/node/1385
讨论:请加入知识星球【首席架构师圈】或者小号【jiagoushi_pro】或者QQ群【11107777】
- 80 次浏览