Redis中的集群(九)

集群

消息

集群中的各个节点通过发送和接收消息(message)来进行通信,我们称发送消息的节点为发送者(sender),接收消息
的节点成为接收者,如图所示。节点发送的消息主要有以下五种:

  • 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时,发送者会向接收者发送MEET消息,请求接收者加入到发送者当前所处的集群里面
  • 2.PING消息:集群里每个节点默认每隔一秒钟就会从已知节点列表中随机选出五个节点,然后对这五个节点中最长时间没有发送过PING消息的节点发送PING消息,以此来检测被选中的节点是否在线。除此之外,如果节点A最后一次收到节点B发送的PONG消息的时间,距离当前时间已经超过了节点A的cluster-node-timeout选项设置时长的一般,那么节点A也会向节点B发送PING消息,这可以防止节点A因为长事件没有随机选中节点B作为PING消息的发送对象而导致对象节点B的信息更新滞后
  • 3.PONG消息,当接收者收到发送者发来的MEET消息或者PING消息时,为了向发送者确认这条MEET消息或者PING消息已经到达,接收者会向发送者返回一条PONG消息。另外,一个节点也可以通过向集群广播自己的PONG消息来让集群中的其他节点立即刷新关于这个节点的认识,例如当一次故障转移操作成功执行之后,新的主节点会向集群广播一条PONG消息,以此来让集群中的其他节点立即知道这个节点已经变成了主节点,并且接管了已下线节点负责的槽
  • 4.FAIL消息:当一个主节点A判断另一个主节点B已经进入FAIL状态时,节点A会向集群广播一条关于节点B的FAIL消息,所有收到这条消息的节点都会立即将节点B标记为已下线
  • 5.PUBLISH消息:当节点接收到一个PUBLISH命令时,节点会执行这个命令,并向集群广播一条PUBLISH消息,所有接收到这条PUBLISH消息的节点都会执行相同的PUBLISH命令
    在这里插入图片描述

一条消息由消息头(header)和消息正文(data)组成

消息头

节点发送的所有消息都由一个消息头包裹,消息头除了包含消息正文之外,还记录了消息发送者自身的一些信息,因为这些信息也会被消息接收者用到,所以严格来讲,可以认为消息头本身也是消息的一部分。
每个消息头都由一个cluster.h/clusterMsg结构表示clusterMsg.data属性指向联合cluster.h/clusterMsgData,这个联合就是消息的正文:
clusterMsg结构的currentEpoch、sender、myslots等属性记录了发送者自身的节点信息,接收者会根据这些信息在自己的clusterState.nodes字典里找到发送者对应的clusterNode结构,并对结构进行更新

例子
  • 举个例子,通过对比接收者为发送者记录的槽指派信息,以及发送者在消息头的myslots属性记录的槽指派信息,接收者可以知道发送者的槽指派信息是否发生了变化,又或者说,通过对比接收者为发送者记录的标识值,以及发送者在消息头的flags属性记录的标识值,接收者可以知道发送者的状态和角色是否发生了变化,例如节点状态由原来的在线变成了下线,或者由主节点变成了从节点等等
clusterMsg结构表示
typedef struct {
// 消息的长度(包括这个消息头的长度和消息正文的长度)
uint32_t totlen;// 消息的类型
uint16_t type;// 消息正文包含的节点信息数量
// 只在发送MEET、PING、PONG这三种Gossip协议信息时使用
uint16_t count;// 发送者所处的纪元
uint64_t currentEpoch;// 如果发送者是一个主节点,那么这里记录的是发送者的配置纪元
// 如果发送者是一个从节点,那么这里记录的是发送者正在复制的主节点的配置纪元
uint64_t configEpoch;// 发送者的名字(id)
char sender[REDIS_CLUSTER_NAMELEN];// 发送者目前的槽指派信息
unsigned char myslots[REDIS_CLUSTER_SLOTS/8];
// 如果发送者是一个从节点,那么这里记录的是发送者正在复制的主节点的名字
// 如果发送者是一个主节点,那么这里记录的是REDIS_NODE_NULL_NAME
char slaveof[REDIS_CLUSTER_NAMELEN];
// 发送者的端口号
uint16_t port;
// 发送者的标识值
uint16_t flags;// 发送者所处集群的状态
unsigned char state;
// 消息的正文(或者说,内容)
unio clusterMsgData data;
}clusterMsg;
clusterMsgData表示
union clusterMsgData {
struct {
// MEET、PING、PONG消息都包含两个clusterMsgDataGossip结构
clusterMsgDataGossip gossip[1];
} ping;// FAIL消息的正文
struct {
clusterMsgDataFail abount;
}fail;// PUBLISH消息的正文
struct {
clusterMsgDataPublish msg;
}publish;// 其他消息正文...
}

MEET、PING、PONG消息的实现

Redis集群中的各个节点通过Gossip协议来交换各自不同节点的状态信息,其中Gossip协议由MEET、PING、PONG三种消息实现,这三种消息的正文都由两个cluster.h/clusterMsgDataGossip结构组成:

union clusterMsgData {
// ...
// MEET、PING和PONG消息的正文
struct {
// 每条MEET、PING、PONG消息都包含两个
// clusterMsgDataGossip结构
clusterMsgDataGossip gossip[1];
}ping
};

因为MEET、PING、PONG三种消息都由相同的消息正文,所以节点通过消息头的type属性来判断一条消息是MEET消息、PING消息和PONG消息。每次发送MEET、PING、PONG消息时,发送者都从自己的已知节点列表中随机选出两个节点(可以是这个主节点或者从节点),并将这两个被选中节点的信息分别保存到两个clusterMsgDataGossip结构里面。
clusterMsgDataGossip结构记录了被选中节点的名字,发送者与被选中节点最后一次发送和接收PING消息和PONG消息的时间戳,被选中节点的IP地址和端口号,以及被选中节点的标识值:

typedef struct {
// 节点的名字
char nodename[REDIS_CLUSTER_NAMELEN];
// 最后一次向该节点发送PING消息的时间戳
uint32_t ping_sent;
// 最后一次从该节点接收到PONG消息的时间戳
uint32_t pong_received;// 节点的IP地址
char ip[16];
// 节点的端口号
uint16_t port;
// 节点的标识值
uint16_t flags;
}clsterMsgDataGossip

当接收者收到MEET、PING、PONG消息时,接收者会访问消息正文中的两个clusterMsgDataGossip结构,并根据自己是否认识clusterMsgDataGossip结构中记录的被选中节点来选择进行哪种操作:

  • 1.如果被选中节点不存在于接收者的已知节点列表,那么说明接收者是第一次接触到被选中节点,接收者将根据结构中记录的IP地址和端口号等信息,与被选中节点进行握手.
  • 2.如果被选中节点已经存在与接收者的已知节点列表,那么说明接收者之前已经被选中节点进行过接触,接收者将根据clusterMsgDataGossip
    结构记录的信息,对被选中节点所对应的clusterNode结构进行更新
例子
  • 举个发送PING消息和返回PONG消息的例子,假设在一个包含A、B、C、D、E、F六个节点的集群里:
    1.节点A向节点D发送PING消息,并且消息里面包含了节点B和节点C信息,当节点D接收到这条信息,它将更新自己对节点B和节点C的认知
    2.之后,节点D将向节点A返回一条PONG消息,并且消息里面包含了节点E和节点F的消息,当节点A接收到这条PONG消息时,它将更新自己对节点E和节点F的认知。
    在这里插入图片描述

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

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

相关文章

LabVIEW电信号傅里叶分解合成实验

LabVIEW电信号傅里叶分解合成实验 电信号的分析与处理在科研和工业领域中起着越来越重要的作用。系统以LabVIEW软件为基础,开发了一个集电信号的傅里叶分解、合成、频率响应及频谱分析功能于一体的虚拟仿真实验系统。系统不仅能够模拟实际电路实验箱的全部功能&…

再谈Makefile和C的2种变量和3个空间和2种if的工程实践中的常见用法的模板

提笔简要记录方法 快速回忆要点 2个变量:makefile变量(命令行和文件中)与C宏定义变量 3个空间:命令行空间、Makefile文件中、C文件中 2种if:ifeq、if defined 命令行 make CONFIG_FEATURE_An Makefile中 CONFIG_…

docker和宿主机的关系

Docker 与宿主机的关系可以通过以下几个方面来描述: 1. 依赖宿主机的内核 Docker 容器在宿主机上运行时,共享宿主机的内核。这意味着,容器不需要一个完整的操作系统来运行,它们依赖宿主机上的内核,并使用宿主机的操作…

ExpressLRS硬件实测性能分析

ExpressLRS硬件实测性能分析 1. 源由2. 远航测试3. 实验室测试3.1 芯片RSSI与实测功率差异3.2 SNR信噪比稳定3.3 140db衰减器衰减,40个频点信号稳定 4. 外场测试4.1 无屏蔽样品4.2 有屏蔽样品4.3 有屏蔽vs无屏蔽样品 5. 估算6. 总结7. 补充说明 -- 50mW视频 1. 源由…

蓝桥云课 数的拆分(数论)

题目链接 觉得这个题挺好的,留个档,至于题解在题目上已经有讲的很好的了。 思路: 数学思维题。 对一个数 x x x,根据唯一分解定理可以拆成 x p 1 k 1 ∗ p 2 k 2 ∗ p 3 k 3 ∗ ⋯ ∗ p s k s xp_1^{k_1}*p_2^{k_2}*p_3^{k_…

降额的秘密——不要挑战datasheet!

原文来自微信公众号:工程师看海,与我联系:chunhou0820 看海原创视频教程:《运放秘籍》 大家好,我是工程师看海。 什么是降额设计?我们为什么要降额? 额指的是额定工作状态,降额就是…

【蓝桥杯】第十五届填空题a.握手问题

题解: 根据问题描述,总共有 50 人参加会议,每个人除了与自己以外的其他所有人握手一次。但有 7 个人彼此之间没有进行握手,而与其他所有人都进行了握手。 首先,计算所有人进行握手的总次数: 总人数为 50 …

多种实现异步编程的方法

文章目录 一、线程Thread二、Future异步三、 CompletableFuture实现异步四、Spring的Async异步五、Spring ApplicationEvent事件实现异步六、消息队列七、ThreadUtil异步工具类八、Guava异步 一、线程Thread public class AsyncThread extends Thread {Overridepublic void ru…

Day19-【Java SE进阶】网络编程

一、网络编程 1.概述 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。java.net,*包下提供了网络编程的解决方案! 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。 网络通信的…

拓展企业发展新天地:低代码开发平台的策略价值

一、什么是低代码开发? 低代码开发平台:一个号称在几分钟内就能构建出一套企业内部适用的系统开发工具。低代码开发平台可以从降低开发者技术门槛、减少企业人力成本、协同共享资源、灵活搭建组件、减少bug率、按需收费等多个方面降低企业开发成本。 曾…

MVC设计模式的思想

MVC模式(Model-View-Controller) 是一种软件设计模式,它将应用程序分为三个部分:模型、视图和控制器。这个模式的目的是将应用程序的表示(视图)与处理(控制器)分开,以及将应用程序的数据和业务逻…

排序1——C语言

排序 1. 复杂度2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 直接选择排序3.2 堆排序 排序在生活中很常见,比如在网购时,按价格排序,按好评数排序,点餐时,按评分排序等等。而排序有快和慢,快的…

洛谷 P3834 可持久化线段树 2 题解

【模板】可持久化线段树 2 题目描述 如题,给定 n n n 个整数构成的序列 a a a,将对于指定的闭区间 [ l , r ] [l, r] [l,r] 查询其区间内的第 k k k 小值。 输入格式 第一行包含两个整数,分别表示序列的长度 n n n 和查询的个数 m …

【磁盘清理】/var/lib/docker/overlay2 占用空间过大

找到对应的容器 1.查看目前的容器占用的空间(可略过) https://blog.csdn.net/weixin_43944305/article/details/106152976 进行简单的清理 docker system df docker system df -v docker system prune2. 查看overlay2的占用空间, 找到对应的容器 https://blog.c…

Navicat Premium 16 for Mac/Win:数据库管理的全能之选

在数字化时代,数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件,无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统,无论是MySQL、Postgre…

编程新手必看,Python3编程第一步语句学习(15)

介绍: 在开始编写Python 3程序之前,有一些基本步骤和概念需要了解。以下是开始Python 3编程之旅的第一步介绍: 安装Python: 访问Python官方网站 python.org 下载适合您操作系统的Python版本(确保选择Python 3而非Pytho…

硕士毕业论文评审老师的评审标准

硕士毕业论文评审老师的评审标准通常涉及以下几个方面: 工作态度与努力:评审老师会考察学生在毕业论文工作期间是否表现出刻苦努力、态度认真的精神,并且是否遵守了各项相关纪律。 任务完成情况:学生是否能按时、全面、独立地完成…

JS - BOM(浏览器对象模型)

BOM 浏览器对象模型 BOM可以使我们通过JS来操作浏览器 在BOM中为我们提供了一组对象,用来完成对浏览器的操作 BOM对象 BOM(Browser Object Model)是指浏览器对象模型,它提供了与浏览器窗口进行交互的对象和方法。BOM包括一些核…

Linux系统——Zookeeper集群

目录 一、Zookeeper概述 1.Zookeeper简介 2.Zookeeper工作机制 3.Zookeeper数据结构 4.Zookeeper应用场景 4.1统一命名服务 4.2统一配置管理 4.3统一集群管理 4.4服务器动态上下线 4.5软负载均衡 5.Zookeeper选举机制 5.1第一次启动选举机制 5.2非第一次启动选举机…

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具,并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据,当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level:音量大小&a…