zookeeper与cap

ε祈祈猫儿з 提交于 2020-01-08 15:52:15

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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分区容错性

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

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

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

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

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

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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!