zookeeper与cap

编程

1. 说一说cap

一个分布式系统最多只有同事满足一致性(Consistency),可用性(Availability)和分区容错性(Partition tolearance)这三项的两项。

①. Consistency一致性

一致性分为强一致性,弱一致性,最终一致性

比如有一个系统(MySQL-a,mysql-b),MySQL-a中有一份数据初始化为1,现在有一个user,user有两个步骤:

  1. 修改mysql集群中的数据为2;(假设,修改的mysql-a,mysql-b中的更改需要同步)
  2. 读取mysql集群中的数据;(假设,读取的是mysql-b)

    如果:

    强制要求步骤2读取的时候,一定要读取的是2,不能读取到的是1,那么要求mysql之间的同步非常迅速或者在步骤2上加锁以等待数据同步完成,那么这种叫强一致性;

允许步骤2读取的时候,可以读取1,那么这叫弱一致性,其实不就是不需要要一致;

允许步骤2读取的时候,可以先读到1,过一会儿再读到2,那么这种叫最终一致性,就是可以等待一段时间才一致。

cap中的一致说的是强一致性。

②. Availability可用性

可用性指的是服务可以一直可用,而且是正常响应时间。

好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。

一个分布式系统,上下游设计很多系统负载均衡,web服务器,应用代码,数据库服务器等,任何一个节点的不稳定都可以影响可用性。

③. Partition tolearance分区容错性

分区容错性指,即分布式系统在遇到某节点或网络分区故障的时候,仍然可以对外提供满足一致性和可用性的服务。

分区容错性和扩展性紧密相关。在分布式系统应用中,可能因为一些分布式的原因导致系统无法正常运转。好的分区容错性要求能够

使应用虽然是一个分布式系统,而看上去仍然好些是一个可以正常运行的整体。比如现在的分布式系统中的某一个或者几个机器宕机了,其他剩下的机器

还能够正常运转满足系统需求,或者是机器之间有网络异常,将分布式系统分隔为独立的几个部分,各个部分还能维持分布式系统的运作,这样就具有好的分区容错性

简单点说,就是网络中断,消息丢失的情况下,系统如果还能正常工作,就是有比较好的分区容错性。

④. cap证明

来证明一下cap,上图有两个节点服务,系统a和系统b,系统a对应的数据库中有一个v0的数据,系统b对应的系统也同理。这两个节点服务之间是可以通过网路连接的。

在满足一致性的条件下:

a中的v0与b中的v0是要保证相同。

在满足可用性的条件下:

用户不管是请求a或者b,都会得到立即响应。

在满足分区容错性的条件下:

a和b有一方宕机或者,他们之间的网路不通都不会影响两个系统的正常运作。


正常情况下,用户通过a系统修改数据,数据流程图如上图所示。第一步,a系统将数据库中的v0更新到v1,第二步,b系统与a系统同步数据,b系统数据库v0更新到v1,响应b系统。

v的数据是一致的定为一致性,a和b对外能提供服务是可用性,a和b之间的网路环境是分区容错性。

作为分布式系统,和单机系统最大的区别就是网络,现在加入a和b之间的网络断开了,我们要支持这种网路异常。

a和b网路断开的情况下,a数据库中的v1不能同步到b数据库中,那么b响应给用户的就只能是v0,这样就失去的一致性,保证了可用性。

还有一种情况,我们阻塞b服务,让它不能提供对外服务,一直等待a和b之间的网络连通,b中的数据同步到v1的时候,才响应请求数据v1,这样就保证了数据的一致性,失去了可用性。

这个过程也充分证明了,分布式系统中一致性和可用性不能兼得。

2. base理论

base理论是对cap理论的延伸,核心思想是及时无法做到强一致性(Strong Consistency),但是英语可以采用合适的方式达到最终一致性。

base是指基本可用(basically available),软状态(soft state),最终一致性( Eventual Consistency)

1. 基本可用

基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用

电商大促时,为了应对访问量激增,部分用户可能会被引导降级页面,服务层也可能只提供降级服务,这就是损失部分可用性的体现

2. 软状态

软状态是指允许系统存在中间状态,而中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会用三个副本,

允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

3. 最终一致性

最终一致性是指系统中所有数据副本经过一段时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

由于base理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议:

  1. 两阶段提交
  2. 三阶段提交
  3. paxos算法
  4. zab协议

3. zookeeper是遵循cp,还是ap?

zookeeper至少满足了cp,牺牲了可用性,比如现在集群中有leader和follower两种角色,那么当其中任意一台服务器挂掉了,

都要重新进行选举,在选举的过程中,集群是不可用的,这就是牺牲的可用性。

但是,如果集群中有leader,follower,observer三种角色,那么如果挂掉的是observer,那么对于集群来说并没有什么

影响,集群还是可以用的,只是observer节点的数据不同了,从这个角度考虑,zookeeper又是牺牲了一致性满足了ap。

以上是 zookeeper与cap 的全部内容, 来源链接: utcz.com/z/512488.html

回到顶部