持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
理论
在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另一个必须牺牲。
一致性(Consistency)
对于某个指定的客户端来说,读操作保证能够返回最新的写操作结果。
可用性(Availability)
非故障的节点(节点本身没啥问题)在合理的时间内返回合理的响应(不是错误和超时的响应)。
分区容错性(Partition Tolerance)
当出现网络分区后,系统能够继续“履行职责”。
为啥只能是AP或CP
假设是CA,当出现网络分区时,为了保证一致性只能舍弃A。
当CP的时候只能允许部分节点不可用,当AP的时候只能允许不是一致的。
AP
如上图所示,当N1、N2发生分区时,选择了AP那么只能允许读取N2还未同步成y的x数据,满足不了一致性。
CP
如上图所示,当N1、N2发生分区时,选择了CP那么只能允许N2不可用,虽然N2本身没有故障,满足不了可用性。
细节
选择CP还是AP维度不是整个系统
CAP关注的粒度时数据,而不是整个系统。不需要整个系统都要求只能是CP或者AP。比如一些涉及金额的不允许出现不一致需要保证CP,业务本身对一致性比较容忍的比如商品图片、标题展示的可以使用AP。
假设不会出现P那么CA可以实现吗
不可以,网络有延迟、数据同步也需要时间,保证不了一致性。
选择P不代表什么都不用做,需要为分区恢复后做准备
- 比如选择了CP,但是等分区恢复了就要恢复A,可以在分区期间记录一些日志恢复后同步,比如mysql的binary log。
- 比如选择了AP,但等分区恢复了就要恢复成C,可以在分区恢复后按照规则合并数据,比如按照不同节点的时间,合并时选择最新的。