00:01
刚才我们在讲读写分离的时候呢,很多同学一定会有一个疑问,那我们知道我们从主机。向从机去复制数据的过程当中呢,它一定会有一个时间的延迟,那么如果我们将数据写入的主机,随后呢,我们立即从从机去读数据的话,因为这个时候数据很有可能还没有被完全的复制过来,所以呢就会出现数据不一致的问题,那我们明明已经写入了数据,但是读的时候呢,却读不出来,这种问题怎么处理?那实际上呢,这里面其实涉及到的是分布式系统当中的cap定理。我们来看一下。它又被称作。布鲁尔定理,因为呢,他是一个叫做埃里克布鲁尔的这么一个人,他在2000年的时候提出的一个猜想哈,对于设计分布式系统的架构师来说呢,Capp定理呢,是必须要掌握的一个理论,所以呢,我们来看一看什么叫做cap定理。
01:05
在分布式系统当中呢,当涉及到读和写的这样的一个操作的时候,我们只能够保证一致性,也就是可用性,也就是availability,还有分区容错性,也就是protection tolerance3者中的两个,那另外一个呢,是必须被牺牲的。诶什么意思呢?我们首先呢,分别来看一下他们各自的意思,首先呢,我们来看一下C一致性,也就是consistency。那什么叫做一致性呢?比如说前面咱们这两个啊服器,一个是主机,一个是从机。读操作,也就是从从当中去读数据。要能够保证。返回最新的写操作结果,也就是说这面写什么了,我这面呢就要读到什么,这就叫做一致性,那所以在这个地方我们强调的是一致啊一致,只要这面写进去数据了,我们希望呢,从这个地方能够读到这个里面写的数据,所以这个呢,就是我们所说的一致性,接下来呢,我们再来看可用性availability。
02:24
啊,我们先来把这个概念读一下哈,非故障的节点在合理的时间内返回合理的响应,什么叫做非故障节点呢?就是这个节点本身它不能是一个有故障的节点,比如说它不能宕机,然后接下来呢,它要在合理的时间返回合理的响应,什么意思呢?比如说我们系统当中可以容忍的一个返回时间呢,是五秒,但是呢,我这个系统呢,用六秒的时间才返回数据。比如说你从这个从机当中去读取数据,用了六秒的时间,这个数据呢才能够被返回,那我们说呢,这个响应是超时的,因为这个时间呢,已经超过了系统可容忍的响应数据的临界值,也就是五秒,那么还没等数据反系统呢,实际上已经给客户端反馈响应超时的结果了,所以响应超时我们也认为服务器呢是不可用的。
03:25
好,然后接下来呢,叫分区容忍性,也叫分区容错性哈,要理解这个分区容错性,我们首先必须要理解这个分区的概念,什么叫做网络分区呢?那我们知道在我们的分布式系统当中,它一定会有多台服务器,而这些多台服务器呢,它是分布在我们的互联网或者是局域网当中的,那么这些服务器之间呢,它们是有信息交换的,那网络分区的意思呢,就是在信息交换的过程当中,我的这个信息交换出现了一些问题,比如说丢包了,再比如说是两台服务器之间连接中断了,还有可能呢,就是网络拥堵了啊,它反应比较慢,这些呢,我们都叫做发生了分区现象,那么分区容错性意思呢,就是即使发生了像上面我们提到的分区现象,比如说丢包、连接中断、网络拥堵。
04:25
即使发生了这些问题,我们的系统也能够继续履行职责,什么叫继续履行职责呢?就是系统呢仍然能够继续运行,哪怕是给用户反馈一个啊,例如响应超时,请您稍后再试这样的一个超时结果,或者呢是在数据没有复制完成之前,给用户返回一个旧的数据,那么这都是在分区状况下的容错的表现啊,所以这个呢叫分区容错性。好,接下来呢,我们来看一下C的特点,那么在实际设计的过程当中呢,我们说我们的系统当中的数据,有的数据呢,它只能满足AP,有的数据呢,它只能满足CP,但是呢。
05:13
它是不可能同时满足CA架构的,为什么呢?我们来想象一下哈。比如说我们想满足这两台服务器的一个一致性,那么我们说重服务器在复制完数据之前呢,它其实就不能被访问,那这样呢,我们就没有办法保证系统的可用性,那如果你要保证系统的可用性的话。即使数据没有复制完成,你也必须给用户返回结果,这样的话呢,返回的数据呢,肯定是不一致的,这样呢就保证不了一致性,所以我们说一致性和可用性呢,他们是矛盾的,是不可能同时满足的,因此在设计的过程当中呢,我们有的数据呢,是满足AP的,是满C。
06:05
接下来呢,我们再来看两个具体的例子。那我们先来看这个CP的例子,像下面这张一样。当发生分区现象之后,分区现象前面我们已经解释过了,就是N1节点和N2节点之间丢包了,或者呢是连接中断了,或者是网络拥堵了,总之呢,这个复制的过程呢被耽搁了,那么N1节点的数据我们说呢,已经变成了Y了,也就是说这个时候呢,我们要做的其实是一个数据修改的工作,那这个原始的数据呢,是X啊,然后呢,我们在N1上已经把数据改成Y了。但是由于N1和N2之间呢,出现了一个分区现象,也就是比如说连接中断了吧,那么数据这个Y呢,就没有办法同步到N2节点上,那此时此刻呢,N2节点上的数据呢,还是X,这个时候呢,有个客户端叫client,他来访问N2节点,好,那N2呢,就要给客户端返回一个error,提示客户我们的这个系统呢出现了故障啊,或者是说系统呢出现了错误,请您稍后访问啊,这样的一个返回信息,那这种方式处理呢,实际上是违背了可用性的,我们说。
07:19
可用性它一定是返回正确的结果,并且在呃这个可容忍的时间内返回正确的结果,那现在我们给用户返回的是一个错误的结果,所以呢,它没有满足可用性啊,那么这个就是CP,他为什么要返回一个错误的结果呢?因为它一定要保证数据一致才给用户返回,现在这个数据是不一致的,所以就了保证一致性了,这个可用性啊,这是我们所说的C的个例子,所以你如果想让这个系统给只要用户访问就绝对要返回一致的数据的话,那在这种情况下,你就只能给用户返回错误信息了。
08:00
那接下来呢,我们来看AP的例子。当发生分区现象之后,也就是说这两个系统呢,出现了连接故障。现在呢,我的N1节点呢,已经更新到了这个数据Y,但是呢,N2节点呢,还是数据X啊,所以说现在还有一个客户端来问这个N2节点,如果我们要保证可用性的话,N2节点将会给我们的客户端什么呢?会返回这个数据。因为它要在有效的时间去返回数据,不能返回错误的结果。而且呢,它还可以牺牲一致性,也就是说它要保证可用性呢,它就必须牺牲一致性,那它可以牺牲一致性的前提呢,就是虽然现在这个Y这个数据没有被复制过来,但是呢,我可以给用户反馈一个X,这个呢就是牺牲了一致性,从而满足了可用性啊,所以呢,我们说我们在这个过程当中呢,满足了AP,那虽然X在这个里面呢,它不是一个正确的结果,但其实是一个合理的结果,大家一定要了解正确和合理的区别哈,为什么呢?
09:18
因为其实是旧的数据,但是它并不是一个错乱的值,它也不是一个错误的数据,只不过呢,不是最新的数据而已,那么当这个两个数据节点成功的连接上,并且呢,数据成功的复制出来之后,那么我们说其实呢,它早晚可以满足一致性,对不对?所以在这个过程当中,我们也可以理解为它其实呢是为了确保可用性。它呢最终呢是满足了最终一致性的啊,所以说那通过这种解决方案呢,我们会发现在可用性和最终一致性之间呢,我们其实是可以找到一个平衡的。
10:02
好,那下面说的呢,其实就是C理论中的这个C了,如果你把C理解为强制性的话,它是不可能完美实现的,因为在数据复制的过程当中,它一定是要有时间延迟的,那除了最终一致性这个概念之外呢,这里面还有另外两个概念,一个呢是基本可用,一个呢是软状态。什么叫基本可用呢?就是在分布式系统出现故障的时候,有的时候我们为了保证核心功能可用,其实是可以损失一部分非核心功能的,比如说有一年双11的时候,它为了保证下订单功能可用,然后淘宝上你会发现修改地址的功能呢,它就不太好使了。实际上呢,它是把流量和更多的服务器资源让给了更重要的下订单功能,那么用户在修改地址的时候呢,就会收到服务超时啊这样的一些提示。这是基本可用,然后呢软状态,软状态呢,就是允许系统存在中间状态,比如说我们在查询数据的时候,比如说我发了一个朋友圈,然后呢,发现呢,其他的人呢,是看不到我的刚发的这个朋友圈的,那隔了两分钟他才看见,那所以这个其实就叫中间状态,这个中间状态呢,它是不影响系统整体的可用性的。
11:20
这个中间状态呢,就是CP理论当中的数据不一致,那最终比如说隔了两分钟之后,那其他人呢,是可以看到我发的朋友圈了,那我们说呢,这个就是我们强调的最终一致性,那系统当中所有的数据副本经过一定时间后,最终能达到一致的状态,叫做最终一致性,所以我们绝大部分系统其实呢,是可以满足最终一致性的。那这个就是cap定理。
我来说两句