Gossip协议:流言蜚语,原来也可以实现一致性

有一部分同学的业务在可用性上比较敏感,比如监控主机和业务运行的告警系统。这个时 候,相信你希望自己的系统能在极端情况下(比如集群中只有一个节点在运行)也能运行。 回忆了二阶段提交协议和 Raft 算法之后,你发现它们都需要全部节点或者大多数节点正常 运行,才能稳定运行,那么它们就不适合了。而根据 Base 理论,你需要实现最终一致性, 怎么样才能实现最终一致性呢?

在我看来,你可以通过 Gossip 协议实现这个目标。

Gossip 协议,顾名思义,就像流言蜚语一样,利用一种随机、带有传染性的方式,将信息传播到整个网络中,并在一定时间内,使得系统内的所有节点数据一致。对你来说,掌握这个协议不仅能很好地理解这种最常用的,实现最终一致性的算法,也能在后续工作中得心应手地实现数据的最终一致性。

为了帮你彻底吃透 Gossip 协议,掌握实现最终一致性的实战能力,我会先带你了解 Gossip 三板斧,因为这是 Gossip 协议的核心内容,也是实现最终一致性的常用三种方法。然后以实际系统为例,带你了解在实际系统中是如何实现反熵的。接下来,就让我们开 始今天的内容吧。

Gossip 的三板斧

Gossip 的三板斧分别是:直接邮寄(Direct Mail)反熵(Anti-entropy)和谣言传播 (Rumor mongering)。

直接邮寄

就是直接发送更新数据,当数据发送失败时,将数据缓存下来,然后重传。从图中你可以看到,节点 A 直接将更新数据发送给了节点 B、D。

在这里我想补充一点,直接邮寄虽然实现起来比较容易,数据同步也很及时,但可能会因为缓存队列满了而丢数据。也就是说,只采用直接邮寄是无法实现最终一致性的,这一点我希望你能注意到。

那如何实现最终一致性呢?答案就是反熵。本质上,反熵是一种通过异步修复实现最终一致性的方法。常见的最终一致性系统(比如 Cassandra),都实现了反熵功能。

反熵

反熵指的是集群中的节点,每隔段时间就随机选择某个其他节点,然后通过互相交换自己的所有数据来消除两者之间的差异,实现数据的最终一致性:

从图 2 中你可以看到,节点 A 通过反熵的方式,修复了节点 D 中缺失的数据。那具体怎么实现的呢?

**其实,在实现反熵的时候,主要有推、拉和推拉三种方式。**我将以修复下图中,2 个数据副本的不一致为例,具体带你了解一下。

**推方式,**就是将自己的所有副本数据,推给对方,修复对方副本中的熵:

**拉方式,**就是拉取对方的所有副本数据,修复自己副本中的熵:

理解了推和拉之后,推拉这个方式就很好理解了,这个方式就是同时修复自己副本和对方副本中的熵:

也许有很多同学,会觉得反熵是一个很奇怪的名词。其实,你可以这么来理解,反熵中的熵 是指混乱程度,反熵就是指消除不同节点中数据的差异,提升节点间数据的相似度,降低熵 值。

另外需要你注意的是,因为反熵需要节点两两交换和比对自己所有的数据,执行反熵时通讯成本会很高,所以我不建议你在实际场景中频繁执行反熵,并且可以通过引入校验和 (Checksum)等机制,降低需要对比的数据量和通讯消息等。

虽然反熵很实用,但是执行反熵时,相关的节点都是已知的,而且节点数量不能太多,如果是一个动态变化或节点数比较多的分布式环境(比如在 DevOps 环境中检测节点故障,并动态维护集群节点状态),这时反熵就不适用了。那么当你面临这个情况要怎样实现最终一致性呢?答案就是谣言传播。

谣言传播

谣言传播,广泛地散播谣言,它指的是当一个节点有了新数据后,这个节点变成活跃状态, 并周期性地联系其他节点向其发送新数据,直到所有的节点都存储了该新数据:

从图中你可以看到,节点 A 向节点 B、D 发送新数据,节点 B 收到新数据后,变成活跃节点,然后节点 B 向节点 C、D 发送新数据。其实,谣言传播非常具有传染性,它适合动态变化的分布式系统。

如何使用 Anti-entropy 实现最终一致

在分布式存储系统中,实现数据副本最终一致性,最常用的方法就是反熵了。

为了帮你彻底理解和掌握在实际环境中实现反熵的方法,我想以自研 InfluxDB 的反熵实现为例,具体带你了解一下。

在自研 InfluxDB 中,一份数据副本是由多个分片组成的,也就是实现了数据分片,三节点三副本的集群,就像下图的样子:

反熵的目标是确保每个 DATA 节点拥有元信息指定的分片,**而且不同节点上,同一分片组中的分片都没有差异。**比如说,节点 A 要拥有分片 Shard1 和 Shard2,而且,节点 A 的 Shard1 和 Shard2,与节点 B、C 中的 Shard1 和 Shard2,是一样的。

那么,在 DATA 节点上,存在哪些数据缺失的情况呢?也就说,我们需要解决哪些问题呢?

我们将数据缺失,分为这样 2 种情况。

1、缺失分片:也就是说,在某个节点上整个分片都丢失了。

2、节点之间的分片不一致:也就是说,节点上分片都存在,但里面的数据不一样,有数据丢失的情况发生。

第一种情况修复起来不复杂,我们只需要将分片数据,通过 RPC 通讯,从其他节点上拷贝过来就可以了:

你需要注意的是第二种情况,因为第二种情况修复起来要复杂一些。**我们需要设计一个闭环的流程,按照一个顺序修复,执行完流程后,也就是实现了一致性了。**具体是怎么设计的呢?

它是按照一定顺序来修复节点的数据差异,先随机选择一个节点,然后循环修复,每个节点生成自己节点有、下一个节点没有的差异数据,发送给下一个节点,进行修复(为了方便演示,假设 Shard1、Shard2 在各节点上是不一致的):

从图中你可以看到,数据修复的起始节点为节点 A,数据修复是按照顺时针顺序,循环修复的。需要你注意的是,最后节点 A 又对节点 B 的数据执行了一次数据修复操作,因为只有这样,节点 C 有、节点 B 缺失的差异数据,才会同步到节点 B 上。

学到这里你可以看到,在实现反熵时,实现细节和最初算法的约定有些不同。比如,不是一 个节点不断随机选择另一个节点,来修复副本上的熵,而是设计了一个闭环的流程,一次修复所有节点的副本数据不一致。

为什么这么设计呢?因为我们希望能在一个确定的时间范围内实现数据副本的最终一致性, 而不是基于随机性的概率,在一个不确定的时间范围内实现数据副本的最终一致性。

这样做能减少数据不一致对监控视图影响的时长。而我希望你能注意到,技术是要活学活用 的,要能根据场景特点权衡妥协,设计出最适合这个场景的系统功能。

最后需要你注意的是,因为反熵需要做一致性对比,很消耗系统性能,所以建议你将是否启用反熵功能、执行 一致性检测的时间间隔等,做成可配置的,能在不同场景中按需使用。

内容小结

了解了 Gossip 协议、如何在实际系统中 实现反熵等。我希望你明确这样几个重点:

1.作为一种异步修复、实现最终一致性的协议,反熵在存储组件中应用广泛,比如 Dynamo、InfluxDB、Cassandra,我希望你能彻底掌握反熵的实现方法,在后续工作中,需要实现最终一致性时,优先考虑反熵。

2.因为谣言传播具有传染性,一个节点传给了另一个节点,另一个节点又将充当传播者, 传染给其他节点,所以非常适合动态变化的分布式系统,比如 Cassandra 采用这种方式 动态管理集群节点状态。

在实际场景中,实现数据副本的最终一致性时,一般而言,直接邮寄的方式是一定要实现的,因为不需要做一致性对比,只是通过发送更新数据或缓存重传,来修复数据的不一致, 性能损耗低。在存储组件中,节点都是已知的,一般采用反熵修复数据副本的一致性。当集群节点是变化的,或者集群节点数比较多时,这时要采用谣言传播的方式,同步更新数据, 实现最终一致。

Gossip协议:流言蜚语,原来也可以实现一致性相关推荐

  1. gossip协议与memberlist实现

    gossip协议 gossip协议是基于流行病传播传播方式的节点或者进程之间信息交换的协议.主要在分布式系统中使用gossip协议来达到数据的最终一致性,利用一种随机的方式将信息传播到整个网络中,并在 ...

  2. Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...

    转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...

  3. 11 | Gossip协议:流言蜚语

    11 | Gossip协议:流言蜚语 原文链接 链接 redis切片集群中的gossip 详解内容 参考文档- 极客时间分布式协议

  4. Redis Cluster Gossip 协议详解

    Redis Cluster Gossip 协议 大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 ...

  5. 一万字详解 Redis Cluster Gossip 协议

    大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 对于数据存储领域,当数据量或者请求流量大到一定 ...

  6. Gossip协议详解

    起源 Gossip protocol 也叫 Epidemic Protocol (流行病协议),是基于流行病传播方式的节点或者进程之间信息交换的协议..Gossip protocol在1987年8月由 ...

  7. 从新冠疫情出发,漫谈 Gossip 协议

    众所周知周知,疫情仍然在全球各地肆虐.据最新数据统计,截至北京时间 2020-05-28,全球累计确诊 5698703 例,累计死亡 352282 例,累计治愈 2415237 例. 从上面的统计数据 ...

  8. 信息如何实现病毒式传播?一文看懂Gossip协议

    来源 | 架构之美 责编 | 寇雪芹 头图 | 下载于视觉中国 起源 Gossip protocol 也叫 Epidemic Protocol (流行病协议).Gossip protocol在1987 ...

  9. 关于Gossip协议的几个问题

    本文来说下Gossip 协议的几个问题 文章目录 概述 Gossip是什么 原理 图解 发送消息 可扩展性 失败容错 健壮性 本文小结 概述 Gossip是一种去中心化.容错并保证最终一致性的协议.它 ...

最新文章

  1. 关于编译原理的一点看法
  2. WARNING: cell0 mapping not found - not syncing cell0
  3. Vue 项目调试总结
  4. no suitable HttpMessageConverter found for request type [java.lang.Integer]
  5. Spotlight on unix 安装
  6. canvas插件_HTML系列之-HTML5新元素之Canvas详解
  7. java异常中Exception捕获不到的异常
  8. Eclipse或SVN—如何在Eclipse中安装SVN客户端插件
  9. 为什么公司宁愿花 15k 重招一个新人,也不愿加薪 5k 留住老程序员?
  10. shared_preferences本地存储操作
  11. python毕业设计题目推荐汽车销售系统
  12. ts定义数组类型_ts基本类型
  13. Ty-JDBC学习笔记
  14. wireshark抓包使用与过滤方法
  15. POI 写word,添加标题,表格,图片,自动生成目录,合并单元格
  16. 服务间歇性停顿问题优化|得物技术
  17. 爬取美女图片【绝对福利】
  18. 深入理解搜索引擎——开篇
  19. 统一操作系统UOS正式版下载地址_马立杰_新浪博客
  20. 批量删除QQ空间日志

热门文章

  1. 架设某大型网站服务器全部详细过程(郁闷少年)
  2. [RK3399电容屏ilitek2511驱动添加及使能
  3. Java之抽象类与接口
  4. 共享的excel无法删除工作簿
  5. mac shell终端命令行快捷键
  6. 怎样把python和pip加到环境变量,然后可以在cmd里面启动
  7. 旅游产品销售如何引流?旅游产品如何有效推广
  8. python中e什么意思_如何理解Python中 =是什么意思?怎么用?
  9. sysbench-0.5基本使用
  10. Windows7上安装TensorFlow的GPU版本后记