CAP
CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能同时满足其中的2个。
| 选项 | 描述 |
|---|---|
| Consistency 一致性 | 指数据在多个副本之间能够保持一致的特性(严格的一致性) |
| Availability 可用性 | 指系统提供的服务必须一直处于可用的状态,每次请求都能获取到的响应(不保证获取的数据为最新数据) |
| Partition tolerance 分区容错性 | 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障 |
在CAP定理中,Raft和ZooKeeper都是选取了"CP"的方式。这表示他们在面临网络分区(Partition tolerance)的情况下,会选择保证数据一致性(Consistency)而牺牲部分可用性(Availability)。
- Raft:Raft是一个用于管理复制日志的一致性算法,广泛应用于分布式系统中,比如etcd。在出现网络分区时,Raft会通过选举机制确保系统的数据一致性,但在选举期间,部分节点可能无法提供服务,因此牺牲了可用性。
- ZooKeeper:ZooKeeper是一个开源的分布式应用程序协调服务,它是集群的管理者,监视所有节点的状态根据节点提交的报告对集群进行重新组织。ZooKeeper也同样选择了在网络分区时保证数据的一致性,其通过Zab协议实现数据的一致性,但在部分节点失去联系时,这部分节点无法提供服务,因此也牺牲了可用性。
Base定理
BASE 理论是分布式系统中的一种理论,用于解决系统中的一致性问题。通过允许数据在一段时间内是不一致的,来提高系统的可用性和性能。
BASE理论的内容
基本可用(Basically Available)
表示系统在遇到故障时,仍能保证提供服务
软状态(Soft State)
允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。
最终一致性(Eventually Consistent)
在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。
二段式提交
二段提交(Two-Phase Commit, 2PC)是一个在分布式系统中达成一致性的重要算法,它是一种原子提交协议。 它主要分为两个阶段:
- 准备阶段:这是第一阶段,称为“投票”阶段。在这个阶段,事务协调器(coordinator)询问所有的事务参与者(participant)是否准备好提交事务。事务协调器向所有参与者发送prepare请求,如果所有参与者都响应"Yes"(准备好提交),则进入下一个阶段;如果有任何一个参与者响应"No"(未准备好提交),则事务协调器会中止事务。
- 提交阶段:这是第二阶段,称为“提交”阶段。如果所有参与者都已准备好提交,事务协ordinator会向所有参与者发送commit请求,要求他们提交事务;如果有任何一个参与者响应了"No",则事务协调器会向所有参与者发送abort请求,要求他们回滚事务。
二段提交协议是一个同步阻塞型的协议,所有参与者在等待其他参与者响应的时候都会被阻塞。这使得二段提交协议在性能上不是非常理想。此外,它也存在单点故障问题。如果协调器在二阶段提交过程中出现故障,那么参与者可能会一直阻塞下去。
三段式提交
三阶段提交有两个改动点
- 引入超时机制。同时在协调者和参与者中都引入超时机制;
- 在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
CanCommit阶段
事务询问:协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应
响应反馈:参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No
PreCommit阶段
- 事务预提交:参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。
- 响应反馈:如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令!
DoCommit阶段
该阶段进行真正的事务提交,也可以分为以下两种情况。
执行提交
发送提交请求 协调接收到参与者发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。
- 事务提交:参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
- 响应反馈:事务提交完之后,向协调者发送Ack响应。
- 完成事务:协调者接收到所有参与者的ack响应之后,完成事务。
中断事务
协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。
- 发送中断请求:协调者向所有参与者发送abort请求
- 事务回滚:参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
- 反馈结果:参与者完成事务回滚之后,向协调者发送ACK消息
- 中断事务:协调者接收到参与者反馈的ACK消息之后,执行事务的中断