跳至主要內容

CAP理论与PACELC模型

gqzclGolang后端事务后端分布式大约 4 分钟

CAP理论与PACELC模型

什么是CAP

CAP是说一个分布式系统最多只能同时满足一致性(Consistency),可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

在满足P的情况下,选择是优先保证一致性还是优先保证可用性。如果要保证一致性,就选择CP,如果要保证可用性,就选择AP。

一致性

一致性指所有节点在同一时间的数据完全一致,根据不同的业务场景,还可以灵活选择最终一致性方案和强一致性方案。

一致性方案一般包括:

  • 2PC,两阶段提交
  • 3PC,三阶段提交
  • Paxos,Paxos 是很细致的一致性协议,但是一般实现过于复杂仅仅是理论
  • Raft,Raft 是能够实现分布式系统强一致性的算法,TiDB 的一致性协议就是基于 Raft
  • ZAB,Zookeeper 的一致性协议,基于 Paxos 简化
  • NWR,上面提到的 dynamo 理论基础的协议,将 PACELC 均衡交给用户

最终一致性

最终一致性在理论上保证,假如数据未进行任何新的更新,则对数据执行的所有读取操作将返回最后更新的值。即一段时间后节点间的数据是一致的。

强一致性(实时一致性)

系统中某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值,即任意时刻所有节点中的数据都是一样的。

可用性

可用性指在服务正常响应期间一直可用,可用性一般与分布式数据冗余和负载均衡有着很大的关联。

分区容错性

分区容错性指分布式系统中某个节点故障或出现网络分区时,仍能提供满足一致性或可用性的服务。

"网络分区"[1]

例子

假设有这样一个分布式系统A,和一个副本A1,一般情况下,客户端向系统A中写入数据后,接下来数据会同步到A1,然后返回成功信息给客户端。

这时候如果读取数据,无论从A还是A1中都会读取到最新值,满足一致性,而且A和A1都是可用的,但是如果A和A1之间的连接断开,数据无法同步到A1,

这就出现了网络分区,

PACELC模型

PACELC模型是在出现网络分区错误的情况下,取前半部分PAC,其内容和PAC基本一致,当没有网络分区错误的情况下,则取LC,即延迟(Latency)和一致性(Consistency)

BASE理论

BASE 是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个单词的简写,作用是保证系统的可用性,然后通过最终一致性来代替强一致性,它是目前分布式系统设计中最具指导意义的经验总结。

软状态和最终一致性指的是允许系统中的数据存在中间状态,这同样是为了系统可用性而牺牲一段时间窗内的数据一致性,从而保证最终的数据一致性的做法。

目前这种处理数据的方式几乎成了互联网的标配设计模式,最经典的例子是在用户下单的时候不需要真正地扣减库存,而是仅在前台计个数,然后通过异步任务在后台批量处理。


  1. 网络分区

    定义

    WIKI给的定义是: 网络分区指由于网络设备的failure,造成网络分裂为多个独立的组

    Gilbert和Lynch在论文中定义分区容忍性的: 网络允许丢失一个节点发给另一个节点的任意多的消息

    分区原因

    • 网络设备failure:比如网线断了,交换机故障了。
    • 节点failure:节点的软件或者硬件坏了,节点成为故障节点。当故障的节点非常多,故障节点和正常节点就不在1个分区,如果正常的节点数量达不到quorum,分布式系统无法正常运作。

    网络分区的检测

    • 同步网络下,橘黄色节点和青色节点间的通信中断,就当网线断裂好了,节点向对方发送的消息如果在超时时间内没有收到响应,就可以认为消息丢失,形成了网络分区。
    • 异步网络下,通信差是一种常态,消息的传递是非常不可靠的,消息无限延时,也可能丢失,根本无法确认消息是否到达对方节点,所以也无法确认/检测是否形成分区。
    ↩︎