- 关于cap,我就觉得不用纠结的太细节,如同《DDIA》中所述:它提供的是一个选择,即:“在网络分区的情况下,是选择一致性还是可用性”。因为网络分区是一种故障,不管你是否喜欢,它都是会发生的。类似传输数据时,是选择同步还是异步的方式
cap分别是指什么
- C: DDIA中,说是线性一致性
- A:非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)
- P:当出现网络分区后,系统能够继续“履行职责”
- 网络分区:
- 网络分区是指因为网络故障导致网络不连通,不同节点分布在不同的子网络中,各个子网络内网络正常。节点之间的网络通讯出现了消息丢失、高延迟的问题。
- 可能是丢包,也可能是连接中断,还可能是拥塞。
- 网络分区:
概述 | 例子 | 业务选择 | |
---|---|---|---|
ca | 需要非常严格的全体一致的协议,不能容忍网络错误或节点错误,一旦出现这样的问题,整个系统就会拒绝写请求 | 单个节点的数据库 | 单机 |
cp | 系统里大多数人的一致性协议,比如:Paxos 算法(Quorum 类的算法)。这样的系统只需要保证大多数结点数据一致,而少数的结点会在没有同步到最新版本的数据时变成不可用的状态。 | ZooKeeper出现分区,然后选举leader的时候,不能读写,因此不符合A | 对一致性要求高的,例如银行或金融 |
ap | 系统在分区时不能达成一致性,给出数据会有冲突,选择的是最终一致性 | Cassandra 、DynamoDB、CoachDB等 | 对性能要求高,响应要求快的场景 |
补充
关于ca, 还有一个例子kafka replication,在同一个数据中心的系统,使用2pc,且需要全体一致协议,将要出现分区的时候,直接将该broke从集群中剔除,确保整个集群不会出现P现象。详细看这个极客时间的例子