一、概述

分布式一致性,简单的说就是在一个或多个进程提议了一个值后,使系统中所有进程对这个值达成一致。

为了就某个值达成一致,每个进程都可以提出自己的提议,最终通过分布式一致性算法,所有正确运行的进程学习到相同的值。

工业界对分布式一致性的应用,都是为了构建多副本状态机模型(Replicated State Machine),实现高可用和强一致。

分布式一致性使多台机器具有相同的状态,运行相同的确定性状态机,在少数机器故障时整体仍能正常工作。

分布式系统的设计目标,一般包括如下几个方面:

  • 可用性:可用性是分布式系统的核心需求,其用于衡量一个分布式系统持续对外提供服务的能力。
  • 可扩展性:增加机器后不会改变或极少改变系统行为,并且能获得近似线性的性能提升。
  • 容错性:系统发生错误时,具有对错误进行规避以及从错误中恢复的能力。
  • 性能:对外服务的响应延时和吞吐率要能满足用户的需求。

二、理论

1、ACID

数据库系统中为保证事务是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。

  • 原子性(atomicity):一个事务(transaction)中的所有操作要么全部成功,要么全部回滚。
  • 一致性(consistency):一个事务在执行前后,数据库都必须处于正确的状态,满足完整性约束
  • 隔离性(isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。

2、CAP理论

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,最多只能满足一下两点,不可能同时满足以下三点:

  • 一致性(Consistency) :等同于所有节点访问同一份最新的数据副本。
  • 可用性(Availability): 每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据。
  • 分区容错性(Partition tolerance): 分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

分布式系统必然会出现网络问题,所以必须保证分区容错,因此只能在 C 和 A 直接寻找平衡。

3、BASE理论

BASE 理论是 eBay 的架构师 Dan Pritchett 提出的,它的核心思想是:“即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性” 。

BASE 理论有三项指标:

  • 基本可用(Basically Available):是指分布式系统在出现不可预知故障的时候,允许损失部分可用性:比如响应时间、功能降级等;
  • 软状态( Soft State):也称为弱状态,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点之间进行数据同步的过程存在延时;
  • 最终一致性( Eventual Consistency):强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达成一致的状态。最终一致性是一种特殊的弱一致性

BASE 理论面向的是大型高可用、可扩展的分布式系统。BASE 通过牺牲强一致性来获得可用性,并允许数据短时间内的不一致,但是最终达到一致状态。

三、分布式一致性

注意分布式系统下的一致性和单机维度的一致性是不一样的。

分布式系统中的一致性(strong consistency)按照对一致性要求的不同,主要分为:强一致性,弱一致性。

1、强一致性

分布式系统中某个节点数据发生改变,后续任何对该数据访问都能获得更新后的值,简而言之,在任意时刻,所有节点访问的数据是一样的。

常见的强一致性算法(共识算法): PaxosRaftZab

2、弱一致性

也叫最终一致性,是指系统并不保证后续访问都会返回最新的数据,但随着时间的推移,最终的数据是一致的。

常见的弱一致性算法: Gossipdistro

对于非持久化数据,如需要客户端上报心跳进行服务实例续约,可以采用最终一致性共识算法,可以更多保障服务的可用性,常见Nacos服务注册采用的distro

对于持久化数据,如分布式数据库,强一致性的共识算法保证了数据的正确性,不可避免的损失可用性,在系统数据同步期间是不能对外提供服务的,如Zookeeper的 Zab协议 。

四、一致性算法

强一致性共识算法大致都差不多,采用选举投票机制。常见的有 PaxosRaftZab

具体可以参考Zookeeper

最终一致性算法常见的有 DNS系统、Gossip协议distro是在Gossip协议的基础上改进的 。

Gossip协议是基于六度分隔理论(Six Degrees of Separation)哲学的体现,简单的来说,一个人通过6个中间人可以认识世界任何人。

实现过程:

Gossip协议实现过程就是通过种子节点周期性的散播消息,每次随机散播给系统中的其他未发生过的节点,并且消息不回传散播,最终所有节点都会收到消息。

img

整个传播过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议

参考