CAP定理
1.CAP
1.1 定义
以下定义来自维基。
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
- 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
- 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)
1.2 分区容错性P
1.2.1 为什么有分区容错性
在分布式服务中,如果数据只被保存在一个节点中,如果这个节点不可达(在多个节点中,总有网络问题导致节点不可达),数据就不可以访问,这就是分区没有容错性。
1.2.2 怎么解决?
其中一个办法就是复制到多个节点上。这就是分区容错性。
1.2.3 带来了什么问题?
不同的节点之间数据的一致性问题。为了保证一致性,多个节点之间同步的时间越长,可用性就会下降。
1.3 一致性C
意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
接下来,用户的读操作就会得到 v1。这就叫一致性。
为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
这样的话,用户向 G2 发起读操作,也能得到 v1。
那么我们思考一个问题,如果G1的值已经是v1,想同步给G2时,发现G1和G2之间的网络断开,为了满足一致性,那就需要锁住G2的读写操作,这段时间内,客户端不能访问G2,没有可用性。
1.3 可用性A
1.3.1 再次思考G1和G2之间的网络断开问题
当客户端将G1的数据更新成v1,G1要更新数据到G2,但是发现网络出错了,G2数据不能同步成最新。 这是客户端来读取G2的数据,为了满足可用性,就需要给客户端返回数据,尽管数据不是最新的。这就不满足一致性。 也就是说分区容错性P一定要满足,那一致性C和可用性A就只能二选一。那我们怎么选择呢?
1.4 AP和CP的选择
- AP(可用性和分区容错性):这种情况一般出现在对数据一致性要求不那么高的场景下。如日志记录,数据投递等。
- CP(一致性和分区容错性):一致性要求较高的场景,如支付、抢红包等。
1.5 一致性的再次细分
为了保证可用性,那就需要对一致性做一定的牺牲,所以一致性又有以下分类。
1.5.1 强一致
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。
1.5.2 弱一致性
系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。
1.5.3 最终一致性
弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。