RedisCluster集群中的插槽为什么是16384个?

RedisCluster集群中的插槽为什么是16384个?

CRC16的算法原理。

  • 1.根据CRC16的标准选择初值CRCIn的值
  • 2.将数据的第一个字节与CRCIn高8位异或
  • 3.判断最高位,若该位为0左移一位,若为1左移一位再与多项式Hex码异或
  • 4.重复3至9位全部移位计算结束
  • 5.重复将所有输入数据操作完成以上步骤,所得16位数即16位CRC校验码

CRC16算法最大值。

CRC16算法,产生的哈希值有16bit位,可以产生65535(2^16)个值,也就是说值分布在0~65535之间,这个时候疑问就来了,槽位总数为什么是16384?65536不可以吗?
作者问题回答链接
在这里插入图片描述

Antirez(Redis作者)大神做了回复,归纳起来就是:

  • 1.正常的心跳数据包携带节点携带节点的完整配置,它能以幂等方式来更新配置,如果采用16384个插槽,占用空间为2KB(16384 / 8 / 1024 = 2KB),如果采用65536个插槽,占用空间8KB(65536 / 8 / 1024=8KB)
  • 2.Redis Cluster不太可能扩展到超过1000个主节点,太多可能导致网络拥堵
  • 3.16384个插槽范围比较合适,当集群扩展到1000个节点时,也能确保每个master节点有足够的插槽

8KB的心跳包看似不大,但是这个是心跳包每秒都要将本节点的信息同步给其他集群节点。
比起16384个插槽,头大小增加了4倍,ping消息的消息头太大了,浪费带宽。

Redis主节点的哈希槽配置信息是通过bitmap来保存的,也就是位数组,元素的值为0或1.在传输过程中,会对bigmap进行压缩,bitmap的填充率越低,压缩率越高。bitmap填充率 = slots / N(N表示节点数)
所以插槽数偏低的话,填充率就会降低,压缩率会升高
综合下来,从心跳包的大小、网络带宽、心跳并发、压缩率等维度考虑,16384个插槽更有优势且能满足业务需求

为什么bitmap填充率越低,压缩率就越高?

在这里插入图片描述

在Redis中,对bit数组进行压缩时,压缩率与填充的数(或者说是1的数量)的关系是成反比的,因为在压缩过程中,Redis使用的是基于运行长度编码(Run-Length-Encoding,RLE)的压缩算法。RLE是一种基本的压缩算法,它通过识别重复出现的连续数据来减少存储空间。如果数据中存在
大量的连续重复字符,RLE算法的随机效果会非常好,反之,如果数据中的字符分布较为随机,没有出现太多连续的重复字符,那么RLE的压缩效果就不明显,甚至可能使数据变大

RLE示例

RLE算法示例。

AAABBBCCDDEEEEEFF

按照RLE算法进行压缩:
1.扫描到连续的3个A,记录为(A,3)
2.接下来是连续的3个B,记录为(B,3)
3.然后是2个C,记录为(C,2)
4.接着是2个D,记录为(D,2)
5.然后是4个E,记录为(E,4)
6.最后是3个F,记录为(F,4)

压缩后的数据为:

(A,3)(B,3)(C,2)(D,2)(E,4)(F,3)

master节点间心跳数据包格式

在这里插入图片描述

消息格式分为:消息头+消息体。消息头包含发送节点自身状态数据,接收节点根据消息头就可以获取到发送节点的相关数据相关代码在src/cluster.h文件中以5.0版本为例,如代码所示,消息头中有一个myslots的char类型数组

unsinged char myslots[CLUSTER_SLOTES/8]

数组长度为16384/8=2048.底层存储其实是一个
bitmap,每一位代表一个插槽,如果该位为1,表示这个插槽是属于这个节点的。消息体中,会携带一定数量的其他节点信息用于交换,约为集群总节点数量的1/10,节点数量越多,消息体内容越大。10个节点的消息体大小约为1kb,char 在C语言中占用一个字节

typedef struct {char sig[4];        // 信号的标识uint32_t totlen;    // 信号的长度uint16_t ver;       // 版本信息uint16_t port;      // tcp端口信息uint16_t type;      // 消息类型,用于区分meet,ping,ponguint16_t count;     // 消息体包含的节点数量,meet,ping,ponguint64_t currentEpoch;  // 当前发送节点的配置纪元uint64_t configEpoch;   // 从节点的主节点配置纪元uint64_t offset;    // 复制的偏移量unsigned char myslots[CLUSTER_SLOTS/8]; // 发送节点负责的插槽信息char slaveof[CLUSTER_NAMELEN]; // 如果发骚那个节点是从节点,记录对应主节点的nodeIdchar myip[NET_IP_STR_LEN];    /* Sender IP, if not all zeroed. */char notused1[34];  /* 34 bytes reserved for future usage. */uint16_t cport;      /* Sender TCP cluster bus port */uint16_t flags;      // 发送节点标识,区分主从是否下线unsigned char state; // 发送系欸但所处的集群状态unsigned char mflags[3]; /* Message flags: CLUSTERMSG_FLAG[012]_... */union clusterMsgData data;
} clusterMsg;

Master通信

master节点间心跳通讯。
Redis集群采用Gossip(流言)协议,Gossip协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,类似流言传播

具体规则如下:

  • 1.每秒会随机选取5个节点,找出最久没有通信的节点发送ping消息
  • 2.每隔100ms都会扫描本地节点列表,如果发现节点最近一次接收pong消息的时间大于
cluster-node-timeout/2

则立即发送ping消息
集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致的状态。当节点出现故障、新节点加入、主从角色变化、插槽信息变更等事件发生时,通过不断地ping/pong消息通信,经过一段时间后所有节点都会知道整个集群 全部节点地最新状态,从而达到集群状态同步的目的

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

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

相关文章

1.通过AD组策略如何做封禁高危端口的策略?AD域控如何给加域的电脑做指定端口号封禁呢?

目录 (1)高危端口简介 1. 高危端口TCP和UDP类型 2.为什么要做AD组策略封禁加域计算机的一些高危的端口?好处是什么? (2)实战步骤过程 实验环境 第一步:新建计算机策略-编辑 第二步:将策略应用到OU

基于SpringCache实现数据缓存

SpringCache SpringCache是一个框架实现了基本注解的缓存功能,只需要简单的添加一个EnableCaching 注解就能实现缓存功能 SpringCache框架只是提供了一层抽象,底层可以切换CacheManager接口的不同实现类即使用不同的缓存技术,默认的实现是ConcurrentMapCacheManagerConcurren…

面试经典-6-删除有序数组中的重复项 II

题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示…

【性能优化】SpringBoot 中 Redis 第一次访问慢

🤷 背景:项目中使用 Redis 时发现,第一次访问 Redis 总是比较慢。 👉 版本 JDK 17SpringBoot 3.2.1😎 小目标:让第一次访问也一样快! 测试用例 准备了一个测试用例,来模拟下多次访问 Redis: 第 1 次访问:607 ms第 2 次访问:31ms第 3 次访问:64ms/*** 测试 Red…

JUNIT5+Mockito单元测试

文章目录 1、前言2、Maven依赖2.1 JDK21SpringBoot版本基于3.1.02.2 JDK17SpringBoot版本基于2.2.5.RELEASE 3、业务代码4、单元测试 1、前言 之前写过一篇使用testMe自动生成单元测试用例,使用的是junit4来编写的单元测试用例,目前很多新项目都已经使用…

20240313寻找集成联调交付的具体方式

集成联调交付(Integrated Joint Debugging and Delivery)是软件开发过程中的一个阶段,主要涉及将不同的软件模块或组件整合在一起,并进行联合调试和测试,以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…

工程师日常:六大茶类--红茶

工程师日常:六大茶类–红茶 中国是世界上最早生产和饮用红茶的国家,作为一种氧化型发酵茶类,红茶的起源可以追溯到中国的明清时候,到18世纪中叶,其制作生产技术传到了印度、斯里兰卡等国。如今红茶已经成为国际茶叶市…

云仓酒庄北京朝阳区旗舰店发布活动盛况:红酒品鉴沙龙共筑美好

原标题:云仓酒庄北京朝阳区旗舰店活动盛况:红酒品鉴沙龙与招商交流共筑美好未来 在繁忙的都市中,有一片静谧的天地,那便是云仓酒庄北京朝阳区旗舰店。这里不仅是红酒爱好者的聚集地,更是商业交流的新平台。近日&#…

C编程基础四十分笔记

都是一些基础的C语言 一 输入一个整数,计算这个整数有几位二 编写程序计算一个分布函数三 输入一个字符串,再随便输入一个字母,判断这个字母出现几次四 求 1到10的阶乘之和五 求一个球体体积六 写一个链表,存1,2&#…

PlayFab 中的匹配功能

在这篇文章中,我将介绍 PlayFab 的匹配流程。 什么是匹配? 匹配允许玩家或玩家组找到彼此并通过连接到公共服务器来开始多人游戏。你可以在 PlayFab 文档中找到精彩的描述。我将向你展示端到端的过程。 PlayFab 中的匹配流程 在我之前的文章中,我解释了如何使用 Unity 和 …

BUGKU-WEB never_give_up

题目描述 题目截图如下: 进入场景看看: 解题思路 F12查看请求和响应,查找线索 相关工具 base64解码URL解码Burp Suit抓包 解题步骤 F12查看请求和响应,发现一行注释包含一个文件名称【1p.html】,这应该就是提…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列一:R-CNN图文详解

学习视频:Faster-RCNN理论合集 概念辨析 在目标检测中,proposals和anchors都是用于生成候选区域的概念,但它们在实现上有些许不同。 Anchors(锚框): 锚框是在图像中预定义的一组框,它们通常以…

方案设计开发——小型充气泵方案

小型充气泵由以前的大而宽不方便携带在方案设计的优化下也变成了一个盒子大小的精巧小型充气泵,方便携带和使用。 小型充气泵方案是一个由压力传感器、SOC芯片及电机设计的PCBA方案,具有小体积、智能数显、预设胎压、动态测量等功能。 其方案设计原理是利…

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )

目录 概述 1 认识EMQX 1.1 EMQX 简介 1.2 EMQX 版本类型 2 Ubuntu搭建EMQX 平台 2.1 下载和安装 2.1.1 下载 2.1.2 安装 2.2 查看运行端口 3 运行Dashboard 管理控制台 3.1 查看Ubuntu上的防火墙 3.2 运行Dashboard 管理控制台 概述 本文主要介绍EMQX 的一些内容&a…

背包问题大合集--算法模板

背包问题模板 01背包完全背包多重背包01背包加强版二进制优化版 二维费用背包分组背包总结 01背包 一维数组优化状态转移方程 #include<bits/stdc.h> using namespace std; const int N 1010; int a[N], n, V, w, v; int main(){cin >> n >> V;//物品数量…

【零基础学习05】嵌入式linux驱动中platform与设备树基本实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天主要学习一下,基于总线、设备和驱动进行匹配的平台驱动模型,这次将采用设备树的platform设备与驱动的编写方法,目前绝大多数的Linux内核已经支持设备树,这次主要来…

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…

c语言中const的一些使用细节

在C语言中&#xff0c;这三个指针声明具有不同的含义&#xff1a; const char *p; p 是一个指针&#xff0c;指向一个常量字符。你不能通过 p 来修改这个字符的值&#xff0c;但是可以修改 p 来指向另一个字符。 char const *p; 这与 const char *p; 完全相同。它同样表示 …

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…

【STL】string各种函数的应用

1.string 基本赋值操作 string assign&#xff08;string str&#xff0c;int n&#xff09; string assign&#xff08;string str,int pos,int n&#xff09; 2.string存取字符操作 (at()) 注意&#xff1a;[ ]越界不会抛出异常&#xff0c;at越界会抛出异常 3.string拼接…