永久链接: https://tech.souyunku.com/?p=6302
作者:zkp_java | 出处:https://blog.csdn.net/zkp_java/article/category/8044591
分布式系统集群的特点
- 集群中所有节点维护的数据要一致
- 所有节点都可以提供相同的业务功能(不一定是在同一时刻提供)
- 集群需要保障系统的高可用,某个节点宕机不会影响服务
集群环境下如何保障数据一致性
集群环境下有三种方式可以保障数据一致性:数据复制和集中存储。
- 数据复制:先向单节点写入,再复制到其他节点,zookeeper就是这样实现的;或者多节点同时写入,但只适合多节点写入的数据不是相同数据的应用场景;在master-slave场景中,同步复制(slave从master全部复制完成才给客户端返回写入成功)可保证强一致性,但会影响可用性,异步复制(数据写入master就返回写入成功,不需要等到salve复制完成,之后master通过push向slave推送数据或者slave通过pull方式从master拉取数据)可提高可用性但会降低一致性(如果master向客户端返回写入成功但尚未开始同步数据到slave时master宕机了,客户端再从slave读取该数据时会产生数据不一致问题)。
- WNR:N代表总副本数,W代表每次写操作要保证的最少写成功的副本数,R代表每次读操作最少读取的副本数,当
W+R>N
时,可保证每次读取的数据至少有一个副本具有最新的更新(例如可以通过版本号或者时间戳判断哪个副本的数据是最新的),多个写操作的顺序难以保证,可能导致多副本间的写操作顺序不一致,Dynamo通过箱量时钟保证最终一致性。 - 集中存储:借助可靠性较高的集中存储,比如NAS存储,分布式缓存(redis)等。
分布式系统之sharding
对于业务系统来说,就是业务拆分,不同的子模块单独是一个的集群,整体业务系统是个大分布式系统。
对于数据系统(比如mongodb)来说,就是数据的拆分,如下图所示的mongodb部署架构图:
图中有四个分片(shard),每个分片是一个由若干台机器组成的副本集(replica set),每个副本集内所有机器的数据都是一样的。从每个副本集各取出一部分数据最后才能够组成一份完整的数据。
zookeeper集群
- zookeeper集群是一种对等集群,所有节点(机器)数据都一样;
- 集群节点之间靠心跳感知彼此的存在;
- 所有写操作都在主节点,其他节点只能读,虽然也可以接收写请求,但是内部会把写操作转给主节点;
- 通过选举机制选出主节点,从而保障了主节点的高可用,这样主节点就不是固定的,万一主节点宕机还可以重新选举出主节点;
- 至少需要三个节点,而且节点个数必须是基数;
- 当一半以上的数据写入成功后,则返回写入成功,是最终一致性策略;
如下图所示的zookeeper集群架构:
client发送到follow的写请求转发给leader,由leader执行完写操作后再同步到follow。
分布式系统之CAP理论
CAP的定义
C是一致性(Consistency)、A是可用性(Availability)、P是分区容忍性(Partition tolerance)。
CAP的定义:一个分布式系统不可能同时满足一致性、可用性和分区容忍性这三个要求,只能满足其中两项。
CAP的理解
- 一致性:分布式环境下,一致性主要是指数据在多个副本之间是否保持一致,即通过某个节点的写操作结果对后面通过其他节点的读操作可见,如果数据更新后并发访问情况下可立即感知该更新,称为
强一致性
,如果允许之后部分或者全部感知不到该更新,称为弱一致性
,若在之后的一段时间(通常该时间不固定)后,一定可以感知该更新,称为最终一致性
; - 可用性:是指系统提供的服务必须一直处于可用状态,对用户的请求总是能够在有限的时间内返回结果,有限的时间强调的是用户能够接受的时间,任何一个没有发生故障的节点必须在有限的时间内返回合理的结果;
- 分区容忍性:集群出现网络割裂时,集群还能继续提供一定的可用性和一致性,除非整个网络不可用,也即部分节点宕机或者无法与其他节点通信时,各分区间还可保持分布式系统的功能;
- 只能满足其中两项并不是说另外一项就完全没有,而是要求没有那么严格;
- 分区容忍性是分布式系统必须有的特性,因为网络不可靠,所以只能在C和A之间权衡;
note:可用性与常说的高可用性的可用性不是一个概念,即如果服务访问不到,不属于没有可用性。
放弃CAP定理
- 放弃分区容忍性( P ):即集群如果出现网络割裂的话,整个集群无法提供可用性和一致性服务,这种情况要么集群节点无状态(没理解????),要么是把所有数据放在一个节点上,这样就失去了扩展性,也不能叫分布式系统了,所以,单机应用因为放弃了P,得到很好的CA;
- 放弃可用性(A):放弃可用性,并不是完全没有可用性,是指允许响应超时的时间可以更长,比如报表可以运行10分钟左右,甚至在某些情况下允许超时错误;
- 放弃一致性( C ):放弃一致性是放弃数据得强一致性,而保留数据的最终一致性,即数据最终是完全一致的,但有一个时间窗口的问题,这需要根据不同的业务来定义。比如新浪微博的内容,时间窗口可以超过10分钟,而交易订单只允许几秒钟。
分布式系统之base理论
BASE是Basically Available(基本可用)、Soft State(软状态)和Eventually Consistent(最终一致性)三个短语得简写,它是对CAP中的一致性和可用性权衡的结果。
BASE的核心思想是即使无法做到强一致性,但是每个应用可以根据自身的业务特点,采取适当的方式达到最终一致性,同时获取到系统可用性。
BASE之基本可用体现在两个方面:
- 响应时间上的损失:比如有些请求1秒内给出响应,有些请求可能会在5秒内给出响应;
- 功能上的损失:例如对于电商系统来说,某些区域可能不能购买某些商品,又或者大促时,部分消费者被引流到降级页面;
BASE之弱状态:
- 也称为软状态,是指允许系统中的数据存在中间状态,并认为该状态不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间存在一定的延时;例如在双11在淘宝购物时,但系统提示还是待付款;
BASE之最终一致性:
- 系统中的数据副本在经过一段时间同步后,最终能够达到一个一致的状态。