分布式存储高可用方案探究

为避免单点瓶颈,提高存储的可用性及负载能力,系统通常部署多个节点。但此时会出现一些问题:

  • 客户端写入数据成功,系统各内节点的数据是否也都写入成功
  • 如果系统内一个节点挂掉,系统是否仍旧可用
  • 如果系统内由于网络故障发生分区,系统是否仍旧可用

这些问题是多节点的分布式存储系统必须面对并解决的问题,即保证系统的数据一致,可用和分区容忍。

系统的高可用有两种策略:

  • 主从模式:分主从节点,主节点挂了从节点自动选主切换为主节点。只有主节点可进行写操作,从节点复制主节点数据,只可读以减轻负担。如:zookeeper,redis sentinel
  • 复制模式:节点角色平等,互相通信交换信息,一个节点挂掉会被踢出集群,不影响系统的使用。如:Eureka,redis cluster(数据分片,元信息通过gossip保证一致)

我们希望所有节点最终均保存完整的数据,以便客户端可从任意节点读取数据,提高读取性能。系统某一节点挂掉后也能恢复数据。

为提高存储服务的写入性能,会对数据继续分片,每个分片服务要做到高可用,一般为主从部署。如Redis cluster,es,kafka。客户端读取或写入数据时,先路由到相应节点再读取或写入。三者不同的是,读取redis cluster需要客户端找到指定分片节点,如果cluster发现数据不在客户端请求的分片(slot发生迁移),会返回客户端正确的分片地址,客户端再次发起请求。es不用客户端找到指定分片,它会在内部进行路由,客户端请求一次即可得到数据。

分布式一致性协议讨论了多个节点的数据如何达成一致,即不同节点如何交换数据,包括:

  • 如何写入数据,数据如何同步到其他节点
  • 主/从节点挂了如何切换至从节点并使其他节点知道
  • 集群状态感知,如新节点加入其他节点如何知道或者不需要知道

按节点间的关系可分为两大类:

  • 有主节点,即主从模式:raft zab paxos。集群的节点分主从,主节点负责写操作,然后同步到从节点,从节点负责读操作。当主节点挂了,一个从节点被选举提升为主节点。
  • 无主节点,即复制模式:Gossip协议。节点的角色相同,无主从之分,任何节点都可进行读写。如果一个节点写入数据,会随机同步至n个节点,这n个节点继续随机向n个节点同步,最终集群所有节点状态相同。

几个理论:
CAP:分布式系统的特性,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。是NOSQL数据库的基石。

  • Consistency(一致性):分布式系统中各节点在同一时刻,同一key的value相同
  • Availability(可用性):集群中某一节点挂掉后仍然可用
  • Partition tolerance(分区容错性):集群内如果网络分区,一些节点的数据不会被分区外的客户端访问到,因此要求数据保存在所有的节点。

Base:是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,BASE是对CAP中一致性和可用性权衡的结果。其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

  • Basically Available(基本可用):假设系统,出现了不可预知的故障,但还是能用,相比较正常的系统而言:

    • 响应时间上的损失:正常情况下的搜索引擎 0.5 秒即返回给用户结果,而基本可用的搜索引擎可以在 1 秒作用返回结果。
    • 功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订单,但是到了大促期间,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。
  • Soft state(软状态):相对于原子性而言,要求多个节点的数据副本都是一致的,这是一种 “硬状态”。 软状态指的是:允许系统中的数据存在中间状态,最终并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。如设置key为1,其中在A节点的值已设为1,但在B节点仍为2,但最终会为1.。允许一些节点的值不为1
  • Eventually consistent(最终一致性):不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性。从而达到数据的最终一致性。这个时间期限取决于网络延时,系统负载,数据复制方案设计等等因素。系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值。

Acid:atomic原子性,consistence一致性,isolation隔离性,duration持久性,保证事务的强一致性

分布式系统不会是一个完美的系统,即数据写入时所有节点会立即更新最新的数据且一直提供服务,如果系统内某个节点挂掉,不影响读写操作整个系统像是一个单体应用,满足acid。
因为数据同步到各个节点需要一定时间,在客户端收到写入成功的响应后,所有节点是否完成数据的变更,此时再请求,是否会得到最新数据。如果一个节点挂掉,系统是否会响应客户端请求。多节点的存在使得它受CAP原理的限制。满足CP:ZK,AP:eureka

你可能感兴趣的