Gossip协议:分布式系统中的“八卦”传播艺术

news2025/4/1 22:35:33

在这里插入图片描述

目录

    • 一、 什么是Gossip协议?
    • 二、 Gossip协议的应用 💡
    • 三、 Gossip协议消息传播模式详解 📚
    • 四、 Gossip协议的优缺点
    • 五、 总结:

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 Raft 算法 请看 : Raft 算法详解,比 Paxos 更简单

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

一、 什么是Gossip协议?

想象一下:

  • 场景: 你在一个大型聚会上,想告诉所有人一个重要消息,比如“明天放假!🎉”
  • 传统方式: 你挨个走到每个人面前,告诉他们“明天放假!🎉” (效率太低,人越多越慢 🐌)
  • Gossip方式: 你随机找到几个人,告诉他们“明天放假!🎉” 然后,这些人再随机告诉他们认识的其他人。 这样,消息就像流言蜚语一样,慢慢地在整个聚会上传播开来。

Gossip协议,也叫流言协议,就是模仿这种流言传播的方式。 它是一种去中心化的通信协议,没有中心节点,每个节点都平等地与其他节点通信,最终将信息传播到整个网络。 🌐

正式定义:

Gossip协议是一种基于节点随机选择的通信协议,用于在分布式系统中传播信息。每个节点周期性地选择一些其他节点,并与它们交换信息。通过这种方式,信息可以在整个网络中快速、可靠地传播。 🚀

二、 Gossip协议的应用 💡

Gossip协议非常适合用于构建大规模、去中心化、容错性强的分布式系统。 常见的应用场景包括:

  1. 成员管理(Membership Management):

    • 场景: 一个集群中有成百上千个节点,需要知道哪些节点是活着的,哪些节点挂了。 🧑‍🤝‍🧑
    • Gossip应用: 每个节点定期向其他节点“八卦”自己还活着的消息(心跳)。 如果一个节点长时间没有收到某个节点的心跳,就认为该节点已经失效。 💔
    • 例子: Apache Cassandra、Consul等。
  2. 数据同步(Data Synchronization):

    • 场景: 多个节点存储相同的数据副本,需要保证数据的一致性。 🗄️
    • Gossip应用: 当一个节点的数据发生变化时,它会向其他节点“八卦”这个变化。 其他节点收到消息后,会更新自己的数据。 🔄
    • 例子: Amazon DynamoDB、Redis Cluster等。
  3. 故障检测(Failure Detection):

    • 场景: 快速发现集群中的故障节点。 🚨
    • Gossip应用: 节点之间互相“八卦”其他节点的状态。 如果一个节点被多个节点报告为故障,那么它就被认为是真的故障。 ❌
  4. 路由信息传播(Routing Information Propagation):

    • 场景: 在P2P网络中,节点需要知道如何找到其他节点。 🗺️
    • Gossip应用: 节点之间互相“八卦”自己知道的路由信息。
  5. 配置信息同步(Configuration Synchronization):

    • 场景: 多个节点需要保持配置信息的一致性。 ⚙️
    • Gossip应用: 当配置信息发生变化时,一个节点会向其他节点“八卦”这个变化。

三、 Gossip协议消息传播模式详解 📚

Gossip协议的核心在于消息的传播方式。不同的传播模式在效率、可靠性、资源消耗等方面各有侧重。以下是几种常见的Gossip协议消息传播模式的详细解释:

  1. Anti-Entropy (反熵) 🔄
  • 原理:
    • 两个节点(比如A和B)定期进行数据交换,交换彼此拥有的所有数据。 🤝
    • A和B比较各自的数据,找出对方没有的数据,然后互相更新。 🔍
    • 这个过程就像两个房间互相交换垃圾,然后各自清理,最终达到干净的状态。 🧹
  • 流程:
    1. 节点A选择节点B进行通信。
    2. A和B交换各自的数据集(例如,所有键值对)。
    3. A比较自己的数据集和B的数据集,找出B缺少的数据,然后将这些数据发送给B。
    4. B比较自己的数据集和A的数据集,找出A缺少的数据,然后将这些数据发送给A。
    5. A和B各自更新自己的数据集,使其与对方保持一致。
  • 特点:
    • 保证最终一致性: 确保所有节点最终拥有相同的数据。 ✅
    • 数据量大: 每次交换的数据量很大,因为需要交换所有的数据。 📦
    • 效率低: 由于数据量大,交换过程比较耗时。 🐌
    • 简单可靠: 实现简单,可靠性高,因为会完整地同步数据。 👍
  • 适用场景:
    • 数据量较小,一致性要求高的场景。
    • 例如,小型配置信息的同步。
  • 举例:
    • 假设节点A有数据{key1: value1, key2: value2},节点B有数据{key2: value2, key3: value3}。
    • A和B交换数据后,A会发现B缺少key1,B会发现A缺少key3。
    • A将key1: value1发送给B,B将key3: value3发送给A。
    • 最终,A和B都拥有{key1: value1, key2: value2, key3: value3}。
  1. Rumor Mongering (谣言传播) 🗣️
  • 原理:
    • 一个节点(比如A)随机选择其他节点(比如B),将消息(谣言)发送给B。 📢
    • B收到消息后,如果之前没有收到过,就将消息标记为已收到,并继续随机选择其他节点传播。 ➡️
    • 如果B已经收到过该消息,就停止传播,但会以一定的概率(称为“传播概率”)继续传播。 🤔
    • 当消息传播的次数达到一定阈值(称为“停止阈值”)时,节点就会停止传播该消息。 🛑
  • 流程:
    1. 节点A产生一个新消息。
    2. A随机选择节点B,将消息发送给B。
    3. B收到消息后,检查是否已经收到过该消息:
      • 如果未收到过,则将消息标记为已收到,并随机选择其他节点继续传播。
      • 如果已收到过,则以一定的概率继续传播,否则停止传播。
    4. 重复步骤2和3,直到消息传播的次数达到停止阈值。
  • 特点:
    • 传播速度快: 消息可以迅速传播到整个网络。 ⚡
    • 可能存在消息丢失: 由于节点可能停止传播消息,因此不能保证所有节点都能收到消息。 ⚠️
    • 资源消耗较低: 每个节点只需要传播有限次数的消息。 💰
    • 需要设置合适的传播概率和停止阈值: 这两个参数会影响消息传播的速度和可靠性。 ⚙️
  • 适用场景:
    • 对实时性要求高,允许一定概率的消息丢失的场景。
    • 例如,故障检测、路由信息传播。
  • 举例:
    • 假设节点A产生一个新消息“明天放假!🎉”。
    • A随机选择节点B,将消息发送给B。
    • B收到消息后,如果之前没有收到过,就将消息标记为已收到,并随机选择节点C继续传播。
    • C收到消息后,如果已经收到过,就以一定的概率(比如50%)继续传播,否则停止传播。
    • 当消息传播的次数达到停止阈值(比如10次)时,节点就会停止传播该消息。
  1. Aggregation (聚合) ➕
  • 原理:
    • 节点在传播消息的同时,对消息进行聚合处理,例如求和、平均值等。 📊
    • 每个节点将自己的数据与收到的数据进行聚合,然后继续传播。 ➡️
    • 最终,所有节点都会收到聚合后的数据。 ✅
  • 流程:
    1. 每个节点都有自己的数据。
    2. 节点A随机选择节点B,将自己的数据发送给B。
    3. B收到A的数据后,将自己的数据与A的数据进行聚合(例如,求和),然后随机选择其他节点继续传播。
    4. 重复步骤2和3,直到所有节点都收到了聚合后的数据。
  • 特点:
    • 减少消息传播的数据量: 通过聚合,可以减少消息传播的数据量,提高效率。 📉
    • 适用于数据统计分析: 可以方便地进行数据统计分析。 📈
    • 需要选择合适的聚合函数: 聚合函数的选择会影响最终结果的准确性。 🧮
  • 适用场景:
    • 需要对数据进行统计分析的场景。
    • 例如,计算集群的平均负载、总请求数等。
  • 举例:
    • 假设有三个节点A、B、C,分别有数据1、2、3。
    • A将自己的数据1发送给B。
    • B收到A的数据后,将自己的数据2与A的数据1进行求和,得到3,然后将3发送给C。
    • C收到B的数据后,将自己的数据3与B的数据3进行求和,得到6。
    • 最终,所有节点都收到了聚合后的数据6。
  1. Push-Pull 🤝
  • 原理:
    • 结合了Push和Pull两种方式。 ➡️⬅️
    • 节点既可以主动推送消息给其他节点(Push),也可以从其他节点拉取消息(Pull)。 📤📥
    • Push方式用于快速传播新消息,Pull方式用于修复消息丢失。 🚑
  • 流程:
    1. 节点A产生一个新消息。
    2. A随机选择节点B,将消息推送给B(Push)。
    3. B收到消息后,检查是否已经收到过该消息:
      • 如果未收到过,则将消息标记为已收到。
      • 如果已收到过,则忽略该消息。
    4. 节点定期从其他节点拉取消息(Pull),以修复消息丢失。
  • 特点:
    • 提高了消息传播的效率和可靠性: Push方式可以快速传播新消息,Pull方式可以修复消息丢失。 🚀✅
    • 需要设置合适的Push和Pull频率: 这两个参数会影响消息传播的速度和可靠性。 ⚙️
  • 适用场景:
    • 适用于各种场景,是比较常用的Gossip协议变种。
    • 例如,成员管理、数据同步。
  • 举例:
    • 假设节点A产生一个新消息“节点C加入集群!🎉”。
    • A随机选择节点B,将消息推送给B(Push)。
    • B收到消息后,如果之前没有收到过,则将消息标记为已收到。
    • 每个节点定期从其他节点拉取消息(Pull),以确保自己拥有最新的集群成员信息。

四、 Gossip协议的优缺点

优点:👍

  1. 去中心化: 没有中心节点,避免了单点故障,提高了系统的可用性。 🛡️
  2. 容错性强: 即使部分节点失效,消息仍然可以通过其他节点传播。 💪
  3. 可扩展性好: 可以很容易地添加新的节点,而不会影响整个系统的性能。 ➕
  4. 最终一致性: 最终所有节点都会收到消息,保证数据的一致性。 ✅
  5. 简单易实现: 协议本身比较简单,容易实现和部署。 👨‍💻

缺点:

  1. 最终一致性: 不能保证实时一致性,存在一定的延迟。 ⏳
  2. 消息冗余: 消息可能会被重复传播,浪费网络带宽。 ♻️
  3. 收敛速度: 消息传播的速度可能较慢,取决于节点的数量和网络拓扑。 🐌
  4. 安全性: 容易受到恶意节点的攻击,例如传播虚假消息。 😈

五、 总结:

Gossip协议是一种非常强大的分布式通信协议,适用于构建大规模、去中心化、容错性强的系统。 虽然存在一些缺点,但可以通过一些优化手段来改善,例如:

  • 控制消息传播的范围: 限制每个节点传播消息的次数。 🎯
  • 使用加密技术: 防止恶意节点传播虚假消息。 🔒
  • 优化网络拓扑: 选择合适的节点进行通信,提高消息传播的速度。 🗺️

希望这篇文章能够帮助你理解Gossip协议! 记住,Gossip协议就像流言蜚语一样,通过节点之间的随机通信,最终将信息传播到整个网络。 🌐 祝你学习愉快! 😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle初识:登录方法、导入dmp文件

目录 一、登录方法 以sys系统管理员的身份登录 ,无需账户和密码 以账户密码的用户身份登录 二、导入dmp文件 方法一:PLSQL导入dmp文件 一、登录方法 Oracle的登录方法有两种。 以sys系统管理员的身份登录 ,无需账户和密码 sqlplus / a…

微服务架构中的精妙设计:环境和工程搭建

一.前期准备 1.1开发环境安装 Oracle从JDK9开始每半年发布⼀个新版本, 新版本发布后, ⽼版本就不再进⾏维护. 但是会有⼏个⻓期维护的版本. ⽬前⻓期维护的版本有: JDK8, JDK11, JDK17, JDK21 在 JDK版本的选择上,尽量选择⻓期维护的版本. 为什么选择JDK17? S…

【Yolov8部署】 VS2019+opencv-dnn CPU环境下部署目标检测模型

文章目录 前言一、导出yolov8模型为onnx文件二、VS2019配置及opencv环境配置三、opencv部署总结 前言 本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c环境下,将yolov8已训练好的检测…

3.30学习总结 Java包装类+高精度算法+查找算法

包装类: 基本数据类型对应的引用数据类型。 基本数据类型:在内存中记录的是真实的值。 八种包装类的父类都是Object类。 对象之间不能直接进行计算。 JDK5之后可以把int和integer看成一个东西,因为会进行内部优化。自动装箱和自动拆箱。 …

3月30号

// 1.toString 返回对象的字符串表示形式Object objnew Object();String str1obj.toString();System.out.println(str1);//java.lang.Objectb4c966a// 核心逻辑: // 当我们打印一个对象的时候,底层会调用对象的toString方法,把对象变成字符串 // 然…

Java——输入,循环,BigInteger,拷贝,排序

读取输入 打印输出到“ 标准输出流”(即控制台窗口)是一件非常容易的事情,只要 调用System.out.println 即可。然而,读取“ 标准输人流” System.in就没有那么简单了。要想通 过控制台进行输人,首先需要构造一个Scann…

Elasticsearch客户端工具初探--kibana

1 Kibana简介 Kibana是Elastic Stack(ELK)中的可视化工具,用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面,支持日志分析、业务监控、数据探索等功能,广泛应用于运维监控、安全分析…

ollama在win10安装、使用、卸载

目录 前置: 1 下载ollama 2 安装 3 配置环境变量,设置模型存储位置 4 使用 5 卸载 前置: 1 在打算安装ollama之前,需要先检查电脑当前状态是否能使用ollama。确认条件满足再进行安装操作。 2 https://github.com/ollama/…

查看iphone手机的使用记录-克魔实战

如何查看 iOS 设备近期的详细使用数据 在日常使用手机时,了解设备的运行状态和各项硬件的使用情况可以帮助分析耗电情况、优化应用使用方式。iOS 设备提供了一些数据记录,能够显示应用的启动和关闭时间、后台运行情况,以及应用在使用过程中调…

[Lc5_dfs+floodfill] 简介 | 图像渲染 | 岛屿数量

目录 0.floodfill算法简介 1.图像渲染 题解 2.岛屿数量 题解 之前我们在 bfs 中有介绍过[Lc15_bfsfloodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域,现在我们来看看 dfs 又是如何解决的呢 0.floodfill算法简介 floodfill算法又叫洪水灌溉或者…

AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务

环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…

Qwen最新多模态大模型:Qwen2.5-Omni介绍与快速入门

一、模型技术突破:重新定义多模态交互 近日,Qwen2.5-Omni正式发布了! 这是Qwen系列中全新的旗舰级端到端多模态大模型,专为全面的多模式感知设计,无缝处理包括文本、图像、音频和视频在内的各种输入,同时…

【Golang】第十一弹------反射

🎁个人主页:星云爱编程 🔍所属专栏:【Go】 🎉欢迎大家点赞👍评论📝收藏⭐文章 长风破浪会有时,直挂云帆济沧海 目录 1.反射基本介绍 2.反射重要的函数和概念 3.反射应用场景 4.反…

C#里使用libxl的对齐/边框/颜色

一份好的EXCEL文件,通道会有不同的颜色和边框来表示。 以便表示一些重要的信息,这样才能让人们一眼就看到需要关注的信息。 如下面所示: 要显示上面的内容,需要使用下面的例子: private void button12_Click(object sender, EventArgs e){var book = new ExcelBook();if…

软考中级-软件设计师信息安全模块考点解析

一、防火墙技术 内部网络是 安全的可信赖的外部网络是不安全的不可信赖的外部网络和内部网络之间有一个DMZ隔离区, 可以在DMZ隔离区中搭建服务:例如:WEB服务器 安全排序:内网>DMZ>外网 三个发展阶段: 包过滤防…

【蓝桥杯】每日练习 Day 16,17

前言 接下来是这两天的题目(昨天主播打完模拟赛感觉身体被掏空所以没有写题目的总结),只有三道题。 一道并查集,一道单调栈和一道单调队列。 奶酪 分析 这是一道模板题(连通块),只讲思路。 …

Linux驱动开发--IIC子系统

1.1 简介 I2C 是很常见的一种总线协议, I2C 是 NXP 公司设计的, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 …

如何应对硬件测试覆盖率不足导致量产故障

硬件测试覆盖率不足导致的量产故障是硬件制造领域的一大痛点。要有效应对,必须从提高测试覆盖率、优化测试方案、引入风险管理机制三个方面入手。其中,优化测试方案尤为关键,应从产品设计阶段开始,通过精确的测试用例规划、详细的…

Centos7 安装 TDengine

Centos7 安装 TDengine 1、简介 官网: https://www.taosdata.com TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB), 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓…

Kafka 多线程开发消费者实例

目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构,那实在是有点暴殄天物了。不过,Kafka …