【分布式算法】Gossip协议详解

2023-12-19

一、为什么需要 Gossip 协议?

为了实现 BASE 理论中的“最终一致性原则”。两阶段提交协议和 Raft 算法需要满足“大多数服务节点正常运行”原则,如果希望系统在少数服务节点正常运行的情况下,仍能对外提供稳定服务,这时就需要实现最终一致性。

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

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

二、如何实现最终一致性?

在介绍Gossip协议的具体实现前,我们先来看看实现最终一致性有哪些方法。

  • 读时修复: 在读取数据时,检测数据的不一致,进行修复。比如 Cassandra 的 Read Repair 实现,具体来说,在向 Cassandra 系统查询数据的时候,如果检测到不同节点的副本数据不一致,系统就自动修复数据。

  • 写时修复: 在写入数据,检测数据的不一致时,进行修复。比如 Cassandra 的 Hinted Handoff 实现。具体来说,Cassandra 集群的节点之间远程写数据的时候,如果写失败就将数据缓存下来,然后定时重传,修复数据的不一致性。

  • 异步修复: 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。

三、Gossip 协议是如何实现最终一致性的?

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

3.1、直接邮寄(Direct Mail)

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

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

那如何实现最终一致性呢?答案就是反熵。本质上,反熵是一种通过异步修复实现最终一致性的方法。

3.2、反熵(Anti-entropy)

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

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

其实,在实现反 的时候,主要有推、拉和推拉三种方式。

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

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

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

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

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

可以借鉴通信原理中数据校验方法,如奇偶校验、CRC校验和格雷码校验等方式,但是这些方式只能检测出错误,但是无法纠错,可以通过重传的方式进行纠错。

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

3.3、谣言传播(Rumor mongering)

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

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

四、总结

gossip协议是很多开源中间件和区块链实现的一种底层通信机制,掌握它的原理和细节能更好的理解中间件和区块链的一些行为和分布式特性。

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

优势:

  • 学习成本:实现简单

  • 扩展性:允许节点的任意增加和减少,新增节点的状态 最终会与其他节点一致。

  • 容错:任意节点的宕机和重启都不会影响 Gossip 消息的传播,具有天然的分布式系统容错特性。可以在一定程度上避免网络分割带来的问题。

  • 去中心化:无需中心节点,所有节点都是对等的,任意节点无需知道整个网络状况,只要网络连通,任意节点可把消息散播到全网。

  • 性能:指数级一致性收敛。消息会以“一传十的指数级速度”在网络中传播,因此系统状态的不一致可以在很快的时间内收敛到一致。消息传播速度达到了 logN。 Gossip协议的最大的好处是,即使集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。如Consul管理的集群规模能横向扩展到数千个节点。

劣势:

  • 消息延迟:节点随机向少数几个节点发送消息,消息最终是通过多个轮次的散播而到达全网;不可避免的造成消息延迟。

  • 消息冗余:节点定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤;不可避免的引起同一节点消息多次接收,增加消息处理压力。

五、参考资料

  • 京东云|数据同步gossip协议原理与应用场景介绍

  • 聊聊分布式Gossip协议

  • 分布式一致性协议——Gossip

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【分布式算法】Gossip协议详解 的相关文章

随机推荐

  • 【华为数据之道学习笔记】5-10标签设计

    标签是根据业务场景的需求 通过对目标对象 含静态 动态特 性 运用抽象 归纳 推理等算法得到的高度精练的特征标识 用于差异化管理与决策 标签由标签和标签值组成 打在目标对象上 标签由互联网领域逐步推广到其他领域 打标签的对象也由用 户 产品
  • Kafka基础—3、Kafka 消费者API

    一 Kafka消费者API 1 消息消费 当我们谈论 Kafka 消费者 API 中的消息消费时 我们指的是消费者如何从 Kafka 主题中拉取消息 并对这些消息进行处理的过程 消费者是 Kafka 中的消息接收端 它从指定的主题中获取消息
  • 分数规划+费用流:LibreOJ - 2003

    https vj imken moe contest 598718 problem H 一坨分数的东西 显然二分 然后移一下项 可得 c i a i k b
  • table边框

    table边框 大家好 我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3 0的小编 也是冬天不穿秋裤 天冷也要风度的程序猿 探索Web设计的一角 Table边框的细节与魅力 在网页设计中 表格 Table 是一个常见且功能强大的元素 而表
  • 基于Java EE架构的汽车车辆管理系统设计与实现-计算机毕业设计源码68424

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • 解决adb传文件中文名问题

    echo off setlocal enabledelayedexpansion REM 路径后面记得不要加斜杠 set 目标路径 sdcard 01tmp echo 目标路径 目标路径 echo set 有连接 False for F t
  • Python Faker库:生成大量测试数据的强大工具

    在软件开发过程中 测试数据扮演着重要的角色 它不仅可以帮助开发者验证代码的正确性 还可以帮助测试人员进行压力测试和性能测试 然而 手动生成大量的测试数据是一项繁琐且耗时的任务 幸运的是 Python的Faker库提供了一种简单而高效的方法来
  • Redis设计与实现之慢查询日志

    目录 一 慢查询日志 1 相关数据结构 2 慢查询日志的记录 3 慢查询日志的操作 4 如何设置慢查询的阈值 5 如何查看慢查询日志的内容 6 如何分析慢查询日志以找出性能瓶颈 7 如何优化慢查询以提高Redis的性能 8 慢查询日志对Re
  • 华为OD机试 C++【最大载货量】

    描述 在火车站旁的货运站 小明负责调度2K辆中转车 其中K辆用于干货 K辆用于湿货 每批到站的货物来自不同的供货商 需要按照顺序装入中转车 注意 一个供货商的货物只能装在一辆车上 不能分开 但是 一辆车可以放多个供货商的货物 问题是 要让所
  • C++图形输出(慧通教育题库、一本通启蒙题库)

    第10关 课程F 二重循环应用1 1002 星号矩阵 课程F 登录 1003 星号三角形 课程F 登录 1004 星号三角形2 课程F 登录 1005 星号正方形 课程F 登录 1006 星号金字塔 课程F 登录 1007 星号平行四边形
  • 基于springboot+vue的奶茶店在线管理系统

    博主介绍 全网个人号和企业号 粉丝40W 每年辅导几千名大学生较好的完成毕业设计 专注计算机软件领域的项目研发 不断的进行新技术的项目实战 热门专栏 推荐订阅 订阅收藏起来 防止下次找不到 千套JAVA项目实战持续更新中 百套小程序APP项
  • Linux: sysctl: network: ip_no_pmtu_disc,容易搞混的参数名称

    这个参数的迷惑性在于双重否定 字面意思是关闭PMTU发现的功能 如果设置为1 代表关闭 如果是0 代表不关闭pmtu发现的功能 所以说明里 有disable enable 就容易搞混 所以要甄别网上的某些博客的说明 不要被误导 ip no
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 测试进程监控:确保产品质量的关键

    引言 在软件开发过程中 测试是确保产品质量的重要环节 为了提高测试效率和准确性 测试进程监控成为了不可或缺的工具 本文将介绍测试进程监控的各个方面 包括产品风险度量 缺陷度量源 测试用例 或规程 度量 测试覆盖率度量 风险覆盖率以及度量的使
  • U-Net 算法详解

    目录 1 任务概述 2 编码器 解码器 3 跳跃连接 4 实现细节 5 损失函数 6 上采样方法 不填充还是填充 7 U Net 的运作方式 8 结论 1 任务概述 U Net 是为语义分割任务开发的 当神经网络接受图像作为输入时 我们可以
  • 【map】【单调栈 】LeetCode768: 最多能完成排序的块 II

    作者推荐 贪心算法 中位贪心 执行操作使频率分数最大 涉及知识点 单调栈 排序 map 区间合并 题目 给你一个整数数组 arr 将 arr 分割成若干 块 并将这些块分别进行排序 之后再连接起来 使得连接的结果和按升序排序后的原数组相同
  • 【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

    论文标题 Open X Embodiment Robotic Learning Datasets and RT X Models 论文作者 论文原文 https arxiv org abs 2310 08864 论文出处 论文被引 12 1
  • SpringBoot中华非遗传承网站 毕业设计-附源码48408

    SpringbootSpringboot中华非遗传承网站 摘 要 非物质文化遗产是人类智慧活动的结晶 具有极高的文化价值 是一个民族历史文化的时间遗迹 我国拥有三千多年的历史文明 在非物质文化遗产的数量和质量上 在世界当中都是首屈一指的 根
  • springboot高校基础类课程公告答疑平台 计算机毕设源码32747

    目 录 摘要 1 绪论 1 1研究背景 1 2国内外研究慨况 1
  • 【分布式算法】Gossip协议详解

    一 为什么需要 Gossip 协议 为了实现 BASE 理论中的 最终一致性原则 两阶段提交协议和 Raft 算法需要满足 大多数服务节点正常运行 原则 如果希望系统在少数服务节点正常运行的情况下 仍能对外提供稳定服务 这时就需要实现最终一