一、一致性介绍
要实现redis与mysql的双写一致性,那先来搞清楚什么是一致性、为何用要做到一致性、一致性的实现种类
1、什么是一致性C(Consistency)?
一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。
2、为何要做到数据一致?
以微博为例,分布式系统的服务器遍布各个地域,你在任何一个地域的服务器上发布的微博,我在其他地域的服务器上都应该可以看到才行(以你发完后,我何时可以看到作为评判标准,我们对一致性做了如下分类)
3、一致性的实现种类
- 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大
- 弱一致性:弱一致性并没有明确定义何时系统会变得一致。在弱一致性模型中,系统在满足一些特定的条件后可以达到一致的状态,但这些条件是非常宽泛和模糊的,例如某操作完成,或者过了一段时间等。
- 最终一致性:最终一致性是弱一致性的一个特例,最终一致性相比于弱一致性,提供了更强的一致性保证。它进一步定义了系统达到一致性的条件:最终一致性承诺,在没有新的更新操作的情况下,经过一段可能很长的时间后,所有的数据副本都将达到一致的状态。简单来说,就是“最终”所有的数据副本都能达到一致,也就是所有的读操作都能返回最后的写操作结果。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型
强调:
对于架构一个分布式系统来说,一致性并非是我们唯一追求的目标,事实上我们需要根据自己特定的业务场景,在一致性、可用性、分区容忍性之间做出权衡,这就是所谓的CAP理论
二、CAP理论
假设你正在使用一个全球分布式的社交媒体网络,它在全世界各地都部署了服务器
1、C(Consistency)一致性:全世界各地的服务器节点上的数据保持一致,任一台更新,另外一台会保持一致
例如:你朋友在美国的服务器节点上发了自己的朋友圈状态,你在澳大利亚的服务器上刷新页面可以立即看到这个新状态
2、A(Availability)可用性:整个系统提供的服务必须一直处于可用状态,对于任何请求,都能在有限的时间内返回结果,不能让用户等待超时
例如:不论你背后是在做什么,如果访问者的请求长时间得不到结果,那对于访问者来说,你就是不可用的
3、P(Partition tolerance)分区容忍性:
什么是分区?
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
例如:我们这个全球分布式社交媒体网络,在全世界各地都部署了服务器,有中国地区的服务器集群、有美国地区的服务器集群
有英国地区的服务器集群,大家本来都属于一个整体,但因为一些网络故障,导致彼此无法连同,于是中国区变成了一个割裂的、单独的区、美国区也是一样、英国区也是 一样
什么是分区容忍性?
分区容忍性指的是即便分布式系统因为故障而四分五裂成了多个割裂的区,但每个区接入的用户都能与自己的区的集群服务器正常通信
CAP理论指的是在一个分布式系统里,你无法同时满足c、a、p三点,最多只能满足其中两点
总的来说就是:数据存在的全世界各地的服务器节点越多,分区容忍性P越高,但要复制更新的数据就越多,一致性C就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性A就会降低。
而在一个高可用的分布式系统分区容错性P是一定要满足的,也就是说在此基础上,你只能在可用性A与一致性C之间二选一
通常我们会选择优先保证A,而牺牲掉C,或者说降低对C的期待-》数据不要求立刻一致(强一致性),只要最终能一致就行(弱一致性)
因为,大多数分布式系统中,强一致性的实现往往难度较大,且付出的代价可能是可用性降低或者性能降低。因此,应用通常会根据自身业务特点,采用适当的方式来使系统达到最终一致性即可