Redis Cluster一致性算法-Gossip算法

161 阅读5分钟

Gossip算法

Gossip:流言蜚语。Gossip协议顾名思义就像流言蜚语一样,利用一种随机的,带传染性的机制,讲信息传播到整个集群中。使用Gossip协议的集群,最大的特点就是组成集群的各个节点都是对等的。

Gossip协议又称epidemic协议。是一种基于流行病传播方式的节点或者进程之间进行信息交换,达到最终一致性的协议。这一协议在分布式系统中被广泛使用。

理论基础

Gossip是怎么保证整个系统能够达到最终稳定性的?答案是六度分隔理论。简单来说就是一个人通过6个人就可以认识整个世界。

其中N表示系统内节点的总数,W表示每个节点具有的与之直接相连的节点数目。根据六度分隔理论,任何消息的传播都是极为迅速的,而且在消息在系统中的传播过程中,经历的步长不会很长,就可以传遍整个系统。

原理阐述

基于六度分隔理论,Gossip协议具备了使整个系统达到最终一致的能力。在计算机领域的分布式系统中,Gossip协议通常以随机的,对等的形式实现。事实上Gossip协议的算法实现方式有数百种,我们以一种最原始的方式对其进行阐述。

  • 集群内的任一节点都可以作为种子节点发起消息
  • 种子节点周期性地广播消息
  • 被感染的节点随机选择N个邻接节点广播消息
  • 每次广播信息都选择尚未发送过的节点进行散播
  • 收到广播的节点,不回传消息

Gossip协议的信息广播和扩散,都由种子节点发起。从整个流程中我们也可以看出,一条消息从发起到在整个系统内达成一致需要经过多次传播,时效性较差。但是,虽然Gossip不保证某个时刻某个节点一定可以收到消息,理论上只要经过一定的时间,最终所有的几节点必然都会收到消息,因此它是一致性收敛的。

Gossip协议的消息传播方式分为三种:

  • Direct Mail 直接邮寄
  • Anti-Entropy 反熵传播
  • Rumor-Mongering 谣言传播
Direct Mial 直接邮寄

某个节点发生变化以后,会向所有节点发送需要更新的内容,当数据发送失败时,将数据缓存到失败队列并重试。

缺点:一旦重试的缓存队列超过了限制,就会导致一致性不能形成;同时,发送大量信息会对某个节点产生大量压力,容易造成节点下线。尤其不适合节点规模大的场景。

Anti-Entropy 反熵传播

反熵传播的过程中,

  • 所有节点都只有两种状态:Suspective(病原)、Infective(感染)
  • 每个节点周期性地、随机地选择其他节点,通过互换自己的所有数据来消除两者之间的差异(熵就是差异的意思)。

在反熵传播的方式中,每次节点间交换信息都需要传输自己所知的所有信息,这会带来较大的通信负载,同时由于消息传播途径的随机选择,会导致消息传播路径冗余,因此不会频繁使用这样的传播方式,通常只在有新的节点加入系统时使用。反熵传播不适用于节点数量巨大,节点数动态变化的环境。

Rumor-Mongering 谣言传播

谣言传播的过程中,

  • 参与消息传播的节点的状态分为:
    • Suspetive: 病原,种子节点周期性散播消息
    • Infective: 感染,信息传播已经经过的节点,随机选择邻接节点散播消息
    • Removed:治愈,当前节点及其所有邻接节点都已经知道了这个谣言消息,不再传播谣言消息
  • 每个节点以固定的频率,仅传播新到达的数据。

谣言传播中,一开始,集群处于稳定一致的状态,所有的节点在没有产生数据变更时,都是removed状态,没有任何谣言在集群内传播;当某个节点发生变化以后,它会作为种子节点向周边散播谣言消息;收到这个谣言的节点,作为被感染的节点会继续向其邻接节点散播这一谣言;直至某个节点自己及其所有邻接节点都已经知道这个谣言,它作为治愈节点,保留更新,且不再传播谣言。

谣言传播的过程,所有的消息都是以增量的形式传播,并非全量形式。

消息传播的动作类别

Gossip协议中,无论是什么样的传播算法,消息传播的动作类别有主要有三种:

  • 推 push

推的方式就是将自己的所有数据,推送给另一个节点,修复对方的熵

  • 拉 pull

拉的方式就是拉取对方的所有数据,修复自己的熵

yuque_diagram.png

  • 推拉 push-pull

推拉的方式可以同时修复自己和对方的熵

优缺点剖析

Gossip协议的优点:

  • 天然去中心化 (另可参考:Redis Cluster模式
  • 天生具有良好的容错性,任何节点的宕机和重启都不会影响集群的整个状态
  • 一致性收敛
  • 消息负载不会随着集群规模的扩大而显著增大(分散式元数据同步架构的优点)
  • 良好的扩展性
  • 实现简单

Gossip协议的缺点:

  • 时效性低。Gossip协议中,消息要经过多次随机散播,不适合对实时性较强的场景
  • 消息冗余。Gossip协议中的周期性随机性都会不可避免地导致消息的冗余,会加重分布式系统元数据同步的负载。