当前位置: 首页 > news >正文

Redis 7.x 系列【27】集群原理之通信机制

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2 节点和节点
      • 2.1 集群拓扑
      • 2.2 集群总线协议
      • 2.3 流言协议
      • 2.4 心跳机制
      • 2.5 节点握手
    • 3. 客户端和节点
      • 3.1 RESP 协议
      • 3.2 重定向
        • 3.2.1 MOVED
        • 3.2.2 ASK
        • 3.2.3 客户端重定向处理

1. 概述

官方文档

Redis 集群中,节点负责存储数据,并管理集群的状态,包括将键映射到正确的节点。集群节点还能够自动发现其他节点,检测非工作节点,并在需要时提升副本节点为主节点,以便在发生故障时继续运行。

节点和节点之间,节点和客户端之间,都需要高效安全的通信机制,确保整个集群能如期正常运行。

2 节点和节点

所有集群节点之间都是互相连接的,并使用以下协议进行通信:

  • 集群总线协议:节点之间的连接协议
  • 流言协议(‌Gossip Protocol)‌:传播集群信息,以便发现新节点、发送 Ping 数据包
  • 发布/订阅(Pub/Sub):

2.1 集群拓扑

Redis 集群是一个网状结构,其中每个节点通过 TCP 连接与其他每个节点连接,类似于网络中的网状拓扑结构:

在这里插入图片描述

在一个包含 N 个节点的集群中,每个节点有 N-1 个出站连接和 N-1 个入站连接。这些 TCP 连接始终保持活动状态,不是按需创建的。当一个节点在集群总线上期待收到对 Pong 回复时,在等待足够长时间标记节点为不可达之前,会尝试通过从头重新连接来刷新与节点的连接。

网状拓扑结构具有较高的可靠性,但其结构复杂,实现起来费用较高,不易管理和维护。但是 Redis 节点在正常情况下使用 Gossip 协议和配置更新机制,以避免在节点之间交换过多的消息,因此交换的消息数量不会呈指数增长。

2.2 集群总线协议

节点之间的通信完全通过集群总线集群总线协议进行,集群总线协议是一种二进制协议,仅用于内部集群通信,目前没有相关说明,需要在源码中了解。

该协议需要使用集群总线端口进行连接。每个 Redis 集群节点除了监听 6379 运行端口外,还会开放一个额外的 TCP 端口,用于接收来自其他 Redis 集群节点的连接,该端口的计算方式是将运行端口号加上 10000

例如,如果一个 Redis 节点在 6379 端口上监听客户端连接,并且在 redis.conf 中未添加 cluster-port 参数,那么集群总线端口 16379 将会被打开。

可以通过配置文件中的 cluster-port 参数指定集群总线端口:

cluster-port 20000

在安装集群时,需要注意节点默认使用 6379、16379 两个端口

2.3 流言协议

Gossip Protocol(流言协议)是一种高效的分布式信息交换协议,通过模拟流行病传播的方式,实现了节点间信息的快速传播和同步。其去中心化、可扩展性和容错性强的特点,广泛应用于多个分布式系统。

Redis 集群中的节点,会周期性地随机选择一些节点,通过 Ping 将当前节点的信息传递过去。收到信息的节点,也会使用同样的方式传播自己的节点信息。这个过程会持续进行,直到信息被传播到集群中的每一个节点,每个节点都会保存所有其他节点的信息。

2.4 心跳机制

Redis Cluster 会通过心跳检测迅速感知到节点故障,并且在节点故障时自动进行恢复,以确保数据在集群中的可用性。

Redis 集群节点不断地交换 PingPong 数据包,用于检测其他节点的存活状态。这两种数据包总称为心跳数据包,它们具有相同的结构,并且都携带重要的配置信息。

集群节点发送心跳的几种触发方式:

  • 每秒钟向几个随机节点发送 Ping
  • 尝试重新建立与其他节点的 TCP 连接,以确保节点不会因为当前的 TCP 连接问题而被认为是不可达的
  • 向在 NODE_TIMEOUT 时间内没有发送过 Ping 的节点进行发送

心跳数据包 包含了一些通用的内容信息:

  • 节点 ID : 节点创建时分配的全局唯一标识
  • 当前时期(currentEpoch)和配置时期(configEpoch): 发送节点的当前时期和配置时期字段,用于解决配置冲突和故障转移
  • 节点标识: 标识节点是从节点、主节点或其他节点。
  • 哈希槽位图: 发送节点服务的哈希槽位图,或者如果节点是副本,则为其主节点服务的槽位图。
  • 发送者 TCP 数据端口: Redis 用于接受客户端命令的基本端口(6379)。
  • 集群总线端口: Redis 节点间通信使用的端口。
  • 发送者视角下的集群状态: 表示发送节点对集群状态的视角,可以是“down”或“ok”。

新加如节点时,心跳数据包 还包含一些 Gossip 信息:

  • 新节点 ID
  • 新节点的 IP 地址和端口。
  • 新节点标识。

2.5 节点握手

集群节点之间,始终通过集群总线端口保持连接,新节点加入 Redis Cluster 时,需要与集群中的其他节点进行握手,以获取集群的拓扑信息和状态。节点之间会交换握手消息,确认自身角色(主节点、从节点或未分配节点)和负责的槽分配情况。

节点握手的整个流程如下:

  • 任意主节点(例如 A )上执行 CLUSTER MEET 命令,新节点的 IP 地址(例如 X )和端口号作为参数。
  • AX 进行握手操作,以确认彼此的存在和状态。
  • 其他节点通过 Gossip 发现 X 节点,并完成握手
  • 随着时间的推移,集群中的所有节点都会通过 Gossip 协议知道新节点的存在,并将其纳入集群的元数据中。

Redis Cluster 网状拓扑中加入节点,集群能够自动发现其他节点,最终会自动形成一个完整的链路。这种机制使集群更加健壮,并确保了集群的灵活性和可扩展性。

3. 客户端和节点

3.1 RESP 协议

官方文档

Redis 客户端和服务端之间,通过 RESPRedis Serialization Protocol )协议进行通信,它是一个简单的二进制安全协议。Redis 1.2 引入了 RESP 协议的第一个版本。客户端通过创建到服务器端口的 TCP 连接(默认端口为 6379)连接到 Redis 服务端。

RESP 具有以下优点:

  • 易于实现:协议的设计简洁明了,便于开发者实现。
  • 快速解析:协议格式高效,可以迅速被解析,减少通信延迟。
  • 人类可读:尽管主要用于机器通信,但协议格式也便于人类阅读和理解。

RESP 能够序列化不同的数据类型,包括整数、字符串和数组,并且还具有一个专门用于错误的类型。客户端向 Redis 服务器发送请求时,请求以字符串数组的形式发送,数组的内容包括要执行的命令及其参数。服务器的回复类型取决于具体的命令。

RESP 是二进制安全的,并使用前缀长度来传输大量数据,因此它不需要处理从一个进程传输到另一个进程的大量数据。这种设计使得数据传输更加高效和安全。

RESP仅用于客户端与服务器之间的通信,集群使用不同的二进制协议在节点之间交换消息

3.2 重定向

由于集群节点不能代理请求,因此客户端可能会使用重定向错误( -MOVED-ASK )被重定向到其他节点。

理论上,客户端可以自由地向集群中的所有节点发送请求,并在需要时进行重定向,因此客户端不需要持有集群的状态。但是,缓存键和节点之间映射的客户端可以显著提高性能。

3.2.1 MOVED

集群节点会自动分配哈希槽,节点内部也会维护其他所有节点和哈希槽的映射关系,例如,以下三个主节点:
在这里插入图片描述
Redis 客户端可以随意的向集群中的任意一个节点发送查询命令,例如,在 192.168.56.101:6379 节点上执行插入、查询操作,当前 key 的哈希槽编号为 1180

[root@localhost ~]# redis-cli -a cluster123456 -p 6379
127.0.0.1:6379> set aa bb
127.0.0.1:6379> cluster keyslot aa
(integer) 1180
127.0.0.1:6379> get aa 
bb 

如果在 192.168.56.103:6379 节点上执行查询操作,由于该节点的哈希槽为 5461 - 10922 ,节点检查内部映射表时,发现哈希槽编号为 1180key 不属于该节点管理,会向客户端回复一个 MOVED 错误:

127.0.0.1:6379> get aa 
(error) MOVED 1180 192.168.56.101:6379

MOVED 错误中,包含了 key 的哈希槽编号,以及能够处理该查询的集群节点,客户端需要将查询重新发送到指定的节点。

一般客户端,会自动进行重定向,而且不会单独去请求某一个节点,而是维护了所有节点,并在内部维护了一个哈希槽到节点的映射,对于开发者来说,MOVED 重定向是无感知的。

注意:这里需要使用 redis-cli 工具进行测试,其他工具可能会自动重定向

此外,还可以使用 redis-cli -c 设置自动重定向:

[root@localhost ~]# redis-cli -a cluster123456 -p 6379 -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get aa
-> Redirected to slot [1180] located at 192.168.56.101:6379
"bb"
3.2.2 ASK

Redis 集群进行伸缩(扩容 / 缩容)时,会进行哈希槽的迁移,当访问目标节点时,数据可能已经迁移到新的节点中,这时会产生 ASK 重定向。

在哈希槽的迁移过程中,槽中对应的多个 Key 是分批次进行移动的,而不是一次性的整体迁移,因此迁移槽中的 Key 一部分在老的服务节点,一部分在新的服务节点。当访问的 Key 正在发生迁移时,ASK 仅指示将下一个查询重定下到指定节点。

MOVED 的区别:

  • MOVED :适用于哈希槽永久由另一个节点服务,接下来的查询应该尝试指定的节点。
  • ASK :适用于哈希槽正在迁移,指示仅将下一个查询发送到指定节点。
3.2.3 客户端重定向处理

为了保持高效处理能力,Redis Cluster客户端会在本地维护当前哈希槽映射表,但是这个映射表需要保持是最新的,当客户端连接到错误的节点导致重定向时,客户端可更新本地的哈希槽映射表。

客户端通常需要在以下两种情况下进行更新:

  • 在启动时初始化映射表
  • 收到 MOVED 重定向

推荐重新获取完整的映射表,而不是更新变动的某一条数据,这样更简单高效。客户端可以通过发出CLUSTER SLOTS命令来获取一个包含哈希槽范围及其对应节点的数组。

示例:

127.0.0.1:7000> cluster slots
1) 1) (integer) 5461 # 哈希槽范围的开始2) (integer) 10922 # 哈希槽范围的结束3) 1) "127.0.0.1"  # 主节点地址端口2) (integer) 70014) 1) "127.0.0.1" # 从节点地址端口2) (integer) 7004
2) 1) (integer) 02) (integer) 54603) 1) "127.0.0.1"2) (integer) 70004) 1) "127.0.0.1"2) (integer) 7003
3) 1) (integer) 109232) (integer) 163833) 1) "127.0.0.1"2) (integer) 70024) 1) "127.0.0.1"2) (integer) 7005

相关文章:

Redis 7.x 系列【27】集群原理之通信机制

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 节点和节点2.1 集群拓扑2.2 集群总线协议2.3 流言协议2.4 心跳机制2.5 节点握…...

【五】MySql8基于m2芯片arm架构Ubuntu24虚拟机安装

文章目录 1. 更新系统包列表2. 安装 MySQL APT Repository3. 更新系统包列表4. 安装 MySQL Server5. 运行安全安装脚本6. 验证 MySQL 安装7. 配置远程连接7.1 首先要确认 MySQL 配置允许远程连接:7.2 重启 MySQL 服务:7.3 检查 MySQL 用户权限&#xff1…...

【Hot100】LeetCode—279. 完全平方数

目录 题目1- 思路2- 实现⭐完全平方数——题解思路 3- ACM 实现 题目 原题连接:279. 完全平方数 1- 思路 思路 动规五部曲 2- 实现 ⭐完全平方数——题解思路 class Solution {public int numSquares(int n) {// 1. 定义 dpint[] dp new int[n1];//2. 递推公式…...

腾讯云开发者《中国数据库前世今生》有奖创作季

在数字化潮流席卷全球的今天,数据库作为IT技术领域的“活化石”,已成为数字经济时代不可或缺的基础设施。那么,中国的数据库技术发展经历了怎样的历程?我们是如何在信息技术的洪流中逐步建立起自己的数据管理帝国的呢?…...

redis:清除缓存的最简单命令示例

清除redis缓存命令(执行命令列表见截图) 1.打开cmd窗口,并cd进入redis所在目录 2.登录redis redis-cli 3.查询指定队列当前的记录数 llen 队列名称 4.清除指定队列所有记录 ltrim 队列名称 1 0 5.再次查询,确认队列的记录数是否已清除...

基于深度学习算法,支持再学习功能,不断提升系统精准度的智慧地产开源了。

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。通过计算机视觉和…...

Cmake生成的Xcode工程相对路径与绝对路径的问题

Cmake生成的Xcode工程相对路径与绝对路径的问题 文章目录 Cmake生成的Xcode工程相对路径与绝对路径的问题前言修改.pbxproj文件验证工程小结 前言 由于Cmake的跨平台的自动化构建的方便性以及他广泛应用于编译过程的管理,在开发过程中难免用到Cmake。我也使用Cmake…...

“机器说人话”-AI 时代的物联网

万物互联的物联网愿景已经提了许多年了,但是实际效果并不理想,除了某些厂商自己的产品生态中的产品实现了互联之外,就连手机控制空调,电视机和调光灯都没有实现。感觉小米做的好一点,而华为的鸿蒙的全场景,…...

C#高级:数据库中使用SQL作分组处理3(ROW_NUMBER() 关键字)

一、分组后找出指定序号的数据 【需求】查出每个班级第三个注册入学的学生信息 【表和字段】Student: ID Class Name Registrationtime 【实现SQL】 WITH RankedStudents AS (SELECT ID,Class,Name,Registrationtime,ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Registra…...

光明乳业:以科技赋能品质,引领乳业绿色新未来

近日,光明乳业再次成为行业焦点,其在科技创新与绿色发展方面的卓越表现赢得了广泛赞誉。作为中国乳制品行业的领军企业,光明乳业始终坚守品质至上的原则,不断探索科技创新之路,致力于为消费者提供更高品质、更健康的乳…...

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链,正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链,Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…...

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO,基本上现在在目标检测领域发论文,COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…...

MYSQL(2) 高级查询

文章目录 概述高级查询基础查询条件查询范围查询判空查询模糊查询分页查询查询后排序分组查询 小结 概述 接上篇,上篇写到增删改查。这篇继续。 高级查询 基础查询 -- 全部查询 select * from student; -- 只查询部分字段 select sname, class_id from student;…...

小程序的运营方法:从入门到精通

随着科技的快速发展,小程序已成为我们日常生活和工作中不可或缺的一部分。小程序无需下载安装,即用即走的特点深受用户喜爱。那么,如何运营好一个小程序呢?下面就为大家分享一些小程序的运营方法。 一、明确目标用户 在运营小程序…...

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下,天气气温的变化已经对人们的生活各方面都产生了影响,人们在外出时大多都会在手机上看看天气如何,根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…...

掌握 Symfony 路由系统:配置与管理

掌握 Symfony 路由系统:配置与管理 Symfony 是一个非常流行的 PHP 框架,而路由系统是 Symfony 框架的核心组件之一。通过理解和掌握 Symfony 的路由系统,开发者可以更高效地配置和管理应用程序的 URL 结构,从而更好地控制应用程序…...

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…...

气膜足球馆:经济高效的室内足球场馆解决方案—轻空间

如果你有一片足球场,想要建一个室内的足球馆,为什么不考虑一下气膜建筑呢?气膜建筑以其独特的优势和高性价比,成为现代体育场馆建设中的一匹黑马。它不仅具有传统建筑无法比拟的经济效益和快速施工优势,还在智能控制、…...

Vue3二次封装axios

官网: https://www.axios-http.cn/docs/interceptors steps1: 安装 npm install axios -ssteps2: /src/api/request.js 文件 >>> 拦截器 import axios from axios // 如果没用element-plus就不引入 import { ElMessage } from element-plusconst service axios.cre…...

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...