Gossip协议那些事

简介: Gossip协议那些事

对于分布式系统而言,由于状态分散在集群中的各个节点上,集群的状态同步面临着集中式系统所不具备的问题:

  • 其中的每一个节点如何较快的得知集群状态全集的某些特征?
  • 如何避免多个节点就某个状态发生分歧,使得集群的状态实时或最终一致?

分布式系统中的各个节点通过一定的交互方式(分布式协议)解决上述问题。

Gossip就是一种去中心化思路的分布式协议,解决状态在集群中的传播和状态一致性的保证两个问题。因为其实现简单,具备较高的容错性和性能,成为了分布式系统最广泛使用的状态同步协议之一。


1. 状态的传播

以Gossip协议同步状态的思路类似于流言的传播,如图2-25所示。


微信图片_20220121170348.jpg


图2-25 流言传播

A节点率先知道了某个流言(msg),它首先将此信息传播到集群中的部分节点(比如相邻的两个节点)B和C,后者再将其传递到它们所选择的“部分”节点,例如B选择了D和E,C选择了将流言传播到B和F。以此类推,最终来自于A的这条流言在3轮交互后被传播到了集群中的所有节点。


在分布式系统的实践中,这个“流言”可能是:某个节点所感知到的关于其它节点是否宕机的认识;也可能是数据水平拆分的缓存集群中,关于哪些hash桶分布在哪些节点上的信息。每个节点起初只掌握部分状态信息,不断地从其它节点收到gossip信息,每个节点逐渐地掌握到了整个集群的状态信息。因此解决了状态同步的第一个问题:全集状态的获取。


对于集群中出现的部分网络分割,消息也能通过别的路径传播到整个集群。如图2-26所示:


微信图片_20220121170405.jpg


图2-26 网络分割示意


2. 状态的一致

状态同步的第二个问题:对于同一条状态信息,不同的节点可能掌握的值不同,也能通过基于gossip通信思路构建的协议包版本得到解决。例如水平拆分的redis缓存集群,初始状态下hash桶在各个节点的分布如图2-27所示:


微信图片_20220121170427.jpg


图2-27 状态一致案例


此时各个节点预先通过某种协议(比如Gossip)得知了集群的状态全集,此时新加入了节点D,如图2-28所示:


微信图片_20220121170442.jpg


图2-28 加入节点D的变化


D分担了C的某个hash桶,此时C/D和集群中其它节点就C所拥有哪些hash这件事发生了分歧:A/B认为C目前有6/7/8个hash桶。此时通过为gossip消息体引入版本号,使得关于C的最新状态信息(只有6/7两个桶了)在全集群达到一致。例如B收到来自A和C的gossip消息时会将版本号更新的消息(来自C的v2)更新到自己的本地副本中。


各个节点的本地副本保存的集群全量状态也可能用来表示各个节点的存活状态。对于部分网络分割的情况如图2-29所示:


微信图片_20220121170457.jpg


图2-29 网络分割下的状态


例如A和C的网络断开,但A和C本身都正常运行,此时A和C互相无法通信,C会将A标记为不可用状态。对于中心化思路的协议,如果C恰好是中心节点,那么A不可用的信息将会同步到集群的所有节点上,使得这些节点将其实可用的A也标记为宕机。而基于gossip这类去中心化的协议进行接收到消息后的实现逻辑扩展(例如只有当接收到大多数的节点关于A已经宕机的消息时,才更新A的状态),最终保证A不被误判为宕机。


3. 特性总结

Gossip的核心是在去中心化结构下,通过的信息部分传递,达到全集群的状态信息传播,传播的时间收敛在O(Log(N))以内,其中N是节点的数量。同时基于gossip协议,可以构建出状态一致的各种解决方案。



相关文章
|
存储 NoSQL 搜索推荐
若依框架----源码分析(@RateLimiter)
若依框架----源码分析(@RateLimiter)
1041 0
|
消息中间件 存储 缓存
Kafka【基础知识 01】消息队列介绍+Kafka架构及核心概念(图片来源于网络)
【2月更文挑战第20天】Kafka【基础知识 01】消息队列介绍+Kafka架构及核心概念(图片来源于网络)
814 2
|
开发工具 Android开发
Appium之获取app的package和activity以及UI界面定位方法
一、获取APP的package(包名)和activity 在使用android自动化测试工具monkeyrunner和appium中启动应用时,需要填写被测程序的包名和启动的Activity,以下有几种查看应用包名package和入口activity名称的方法: 1.
3272 0
|
算法
虚拟内存的页面置换算法有哪些?
【10月更文挑战第25天】不同的页面置换算法各有优缺点,在实际应用中,操作系统会根据不同的应用场景和系统需求选择合适的页面置换算法,或者对算法进行适当的改进和优化,以平衡系统的性能、开销和资源利用率等因素。
738 141
|
人工智能
三文带你轻松上手鸿蒙的AI语音03-文本合成声音
三文带你轻松上手鸿蒙的AI语音03-文本合成声音
483 1
三文带你轻松上手鸿蒙的AI语音03-文本合成声音
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。
|
JSON 监控 Java
Elasticsearch 入门:搭建高性能搜索集群
【9月更文第2天】Elasticsearch 是一个分布式的、RESTful 风格的搜索和分析引擎,基于 Apache Lucene 构建。它能够处理大量的数据,提供快速的搜索响应。本教程将指导你如何从零开始搭建一个基本的 Elasticsearch 集群,并演示如何进行简单的索引和查询操作。
698 3
|
安全 关系型数据库 MySQL
CentOS 8 中安装与配置 MySQL
CentOS 8 中安装与配置 MySQL
1609 3
|
关系型数据库 MySQL Docker
阿里云容器镜像加速器
使用容器时一般需要首先下载一个容器镜像,例如Docker Hub官方提供的MySQL、WordPress等容器镜像。然而由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。为此,阿里云容器镜像服务ACR提供了官方的镜像站点,从而加速官方镜像的下载。 ## 获取镜像加速器地址 ACR会为每一个账号(阿里云账号或RAM用户)生成一个镜像加速器地址,配置镜像加速器前,您需要获取镜像加速器地址。
|
存储 Java 数据库
【JavaSE专栏75】字节输出流OutputStream,用于将字节数据写入到输出目标的流
【JavaSE专栏75】字节输出流OutputStream,用于将字节数据写入到输出目标的流
438 0