分布式系统架构理论,定义了三种指标,理论说我们最多只能满足两个。
首先我们这个理论所说的分布式系统,是指系统内会共享数据,互相有连接有交互,才能完成系统功能的的分布式系统。而这个理论的关注点是数据的读写。
Consistency 一致性:
这里的一致性是针对于分布式读写的。对于一个分布式系统,当一条数据写成功,那么无论我怎么使用这个系统,我都应当能马上读取到这条最新的数据。
不一致性的例子:我更新了一条微博,而我的关注者还不能看到。
Avalilability 可用性:
是指系统应当随时可用,在reasonable的时间内返回reasonable的结果。
一个反例:我更新了一条微博,我的关注者在刷我微博的时候显示对方正在更新微博,请稍后再试,或者显示一直在读取中。
Partition Toleranc 分区容忍性:
分布式环境中数据必然会被划分成多个区分到不同的机器上,不同的机器之间会有数据交换。
而机器一多某台机器发生发生故障的概率就会比较高,而且机器间数据的交换依赖于网络,网络也很有可能会有延时、丢包之类的问题。
分区容忍性就要求在分布式系统要考虑到分布式环境的复杂性的前提下能正常提供服务。
(原版cap中的p其实指的是网络分区现象[参考Wiki network partition] ,只由于网络设备的影响,分布式集群被划分成多个子网,但这样理解我始终想不通,可能这样解释更合理)
CAP-P:
首先我们来看分区容忍性,由于我们讨论的就是分布式环境,我们的系统肯定不能被这网络环境机器环境所影响,分区容忍性就是个公认的前提,要么你就是很多个单机提供服务,但那不是分布式。为了实现分区容忍性,就需要我们设计多个数据副本,多个副本还不能在同一台机器上,甚至要在多个机房、多个地区存放副本。如果有必要机器之间的网络也需要多个通道,防止网络通路出现问题。
CAP-CA:
image.png
前提环境保证了,我们就来讨论下读写功能。系统的功能无外乎输出输出,也就是读写操作咯。对于读写操作我们需要再一致性和可用性之间有所取舍,当然并不是完全舍去另一方,而是我们不能完美的同时实现C和A。
为啥呢,前提P已经说了我们需要多副本分布在多机器上,这副本之间同步数据是会有延时,其次如何保证在写的同时(副本未同步完成)我的读操作可能会发生在各个副本上,那我应该如何返回正确的数据。所以C和A只能完美保证一个。
舍C保A(AP)的例子:
比如刚刚的微博这个例子,我们更新了一条微博,不是所有的人都能马上刷出来的,对于哪些还只能刷出旧的微博数据的人来说数据就和我真实的操作不一致了。然而这种业务也不需要要求我们强一致性,没有刷出我的最新微博,也不是什么大事,大不了认为我没有更新而已,对业务影响很小。但是呢也不能一直都不一致是吧,所以C还是不能丢的,可以迟到。
舍A保C(CP)的例子:
比如银行账户的例子,大家生活中也许也已经注意到了,银行转账需要几个小时甚至几天,都会显示正在转账中。这时就是视作一种丢失可用性的状态。当然这是业务决定的。
舍P保C又保A的场景:
不是分布式的场景的话,我们可以选择CA,比如我是个小银行,我的转账功能可以设计为多地账户不互通,只能本地转账,只在一台服务器上操作,保证可用性和一致性。但整体来看可用性和一致性都丢失了。
通用的关系型数据库设计理论,需要满足四种指标:
Atomicity 原子性:
Consistency 一致性:
Isolation 独立性:
Durability 持久性:
作者:曾二爷耶
链接:https://www.jianshu.com/p/f3f50ab1222b