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

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消息通信,经过一段时间后所有节点都会知道整个集群 全部节点地最新状态,从而达到集群状态同步的目的

相关文章:

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

RedisCluster集群中的插槽为什么是16384个? CRC16的算法原理。 1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位,若该位为0左移一位,若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5…...

一直出现问题,发现服务器磁盘空间已满导致,腾出服务器磁盘空间命令

要解决服务器磁盘空间已满的问题,你可以按照以下步骤操作: 查看磁盘使用情况:使用df -h, du -s -h ./*命令来查看服务器的磁盘空间使用情况。查找大文件:使用du -a | sort -rn | head -5命令来找出占用空间最大的前5个…...

吴恩达机器学习笔记 二十三 倾斜数据集的误差指标 精确率 召回率 精确率与召回率的平衡 F1分数

如果数据集的正例和反例的比例非常倾斜,常用的错误指标如 准确率(accuracy) 并不好用。此时可以用精确率和召回率。 精确率(precision):真阳的样本数/预测为阳的样本数真阳数/(真阳假阳) 召回率(recall):…...

无人游艇的研发和开发对于多个领域具有重要

无人游艇的研发和开发对于多个领域具有重要性。 首先,无人游艇可以在海上进行各种任务,如海洋科学研究、资源勘探和监测、海洋环境保护等。相比传统的人工操作船只,无人游艇可以长时间在海上工作,可以自动化执行任务,…...

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…...

JETSON 配置并跑通 NanoDet

JETSON 配置 NanoDet 文章目录 JETSON 配置 NanoDetNanoDet 介绍源码环境搭建及测试配置 NanoDet 的环境环境配置过程中遇到的问题:环境配置完毕验证 NanoDet NanoDet 介绍 可以参考这个博客:NanoDet:这是个小于4M超轻量目标检测模型 源码 …...

突破编程_C++_C++11新特性(unordered_multimap)

1 概述 std::unordered_multimap 是一个哈希表实现的无序容器,它存储的元素是键值对,并且允许键的重复。这意味着同一个键可以关联多个值。在 std::unordered_multimap 中,元素的插入顺序是不确定的,并且不会因为元素的插入、删除…...

15.WEB渗透测试--Kali Linux(三)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:14.WEB渗透测试--Kali Linux(二)-CSDN博客 Kali工具使用 3389远…...

Android-Framework pm list packages和pm install返回指定应用信息

一、环境 高通 Android 13 注:Android10 和Android13有些差异,代码位置不变,参照修改即可 二、pm简单介绍 pm工具为包管理(package manager)的简称 可以使用pm工具来执行应用的安装和查询应用宝的信息、系统权限、…...

CSS

什么是CSS? CSS是一门语言,用于控制网页表现 CSS(Cascading Style Sheet):层叠样式表 W3C标准:网页主要由三部分组成 结构:HTML表现:CSS行为:JavaScript CSS导入方式…...

算法详解——选择排序和冒泡排序

一、选择排序 选择排序算法的执行过程是这样的:首先,算法遍历整个列表以确定最小的元素,接着,这个最小的元素被置换到列表的开头,确保它被放置在其应有的有序位置上。接下来,从列表的第二个元素开始&#x…...

图论(蓝桥杯 C++ 题目 代码 注解)

目录 迪杰斯特拉模板(用来求一个点出发到其它点的最短距离): 克鲁斯卡尔模板(用来求最小生成树): 题目一(蓝桥王国): 题目二(随机数据下的最短路径&#…...

矩阵起源新一年喜报连连!

新春伊始 矩阵起源向大家分享 一连串好消息 首先,公司创始人兼CEO王龙先生获评“2023深圳创新突出贡献人物“。这一荣誉是对其在推动数据库行业技术创新和产品开发方面所做出的卓越贡献的认可。他的领导力和创新精神不仅引领我司取得了显著的成就,也为…...

牛客——紫魔法师(并查集)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 “サーヴァント、キャスター、Medea。”--紫魔法师 给出一棵仙人掌(每条边最多被包含于一个环,无自环,无重边,保证连通),要求用最少的…...

最新WooCommerce教程指南-如何搭建B2C外贸独立站

WooCommerce是全球最受欢迎的开源电子商务平台之一。它基于WordPress建站,只需一键安装即可使用。该平台提供了丰富的功能,包括产品发布、库存管理、支付网关和运输发货等,可以帮助搭建各种类型的电子商务网站。相比其他竞争对手,…...

一文教会你SpringBoot是如何启动的

SpringBoot启动流程分析 流程图 源码剖析 运行Application.run()方法 我们在创建好一个 SpringBoot 程序之后,肯定会包含一个类:xxxApplication,我们也是通过这个类来启动我们的程序的(梦开始的地方),而…...

车载测试面试:各大车企面试题汇总

本博主可协助大家成功进军车载测试行业 TBOX 深圳 涉及过T-BOX测试吗Ota升级涉及的台架环境是什么样的?上车实测之前有没有一个仿真环境台架环境都什么零部件T-BOX了解多少Linux和shell有接触吗 单片机uds诊断是在实车上座的吗 uds在实车上插的那口 诊断仪器是哪…...

Qt散文一

Qt的事件分为普通事件和系统事件,普通事件比如用户按下键盘,系统事件比如定时器事件。事件循环的开始是从main函数的QApplication,然后调用exec()开始的,在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件…...

MySQL学习Day32——数据库备份与恢复

在任何数据库环境中,总会有不确定的意外情况发生,比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的,这些情况可能会导致数据的丢失、 服务器瘫痪等严重的后果。存在多个服务器时,会出现主从服…...

阅读基础知识

一 网络 1. 三次握手四次挥手 三次握手:为了建立长链接进行交互即建立一个会话,使用 http/https 协议 ① 客户端产生初始化序列号 Seqx ,向服务端发送建立连接的请求报文,将 SYN1 同步序列号; ② 服务端接收建立连接…...

libvirt 有哪些命令

除了 virsh 外,还有很多有意思的命令。virt-manager 用于打开 libvirt 交互的界面除了连接本地电脑,也可以访问远程电脑的 libvirtd 服务virt-clone 快速克隆一个虚拟机。在 virt-manager 界面上也集成了这个功能。如下图,就是这么简单快捷&a…...

OpenClaw夜间任务优化:Qwen3-32B+RTX4090D镜像低负载模式配置

OpenClaw夜间任务优化:Qwen3-32BRTX4090D镜像低负载模式配置 1. 问题背景与优化动机 去年12月,我开始用OpenClawQwen3-32B模型搭建个人自动化工作流。最初配置的定时备份任务每晚11点准时运行,但很快发现两个问题: 电费异常&am…...

Electron-builder打包Windows应用,我踩过的三个坑(附详细解决方案)

Electron-builder打包Windows应用:三个典型问题的深度解析与实战解决方案 第一次使用electron-builder打包Windows应用时,那种期待与焦虑交织的感觉至今记忆犹新。作为一个从Web前端转向桌面应用开发的程序员,我本以为有了Electron这个跨平台…...

告别目标跟丢!手把手教你用BoT-SORT和OpenCV GMC搞定复杂场景下的多目标跟踪

告别目标跟丢!手把手教你用BoT-SORT和OpenCV GMC搞定复杂场景下的多目标跟踪 在智能监控和自动驾驶等实际应用中,多目标跟踪(MOT)技术常常面临动态相机和目标快速移动带来的挑战。传统算法在目标遮挡、镜头晃动等复杂场景下容易出…...

嵌入式多线程与多进程技术详解

嵌入式软件编程之多线程与多进程技术解析1. 操作系统任务调度基础1.1 时间片轮转调度机制现代操作系统(如Windows、Linux)普遍采用时间片轮转的抢占式调度方式。在这种机制下:每个任务执行固定长度的时间片后被强制暂停被暂停的任务进入就绪状…...

CBoard自研多维引擎揭秘:轻量级架构如何撬动大数据分析

CBoard自研多维引擎揭秘:轻量级架构如何撬动大数据分析 【免费下载链接】CBoard CBoard - 这是一个基于 Node.js 的开源面板,用于管理 Kubernetes 集群和应用程序。适用于 Kubernetes 集群管理、容器编排、持续集成等场景。 项目地址: https://gitcode…...

Pi0大模型环境配置详解:Python 3.11+PyTorch 2.7+lerobot依赖安装

Pi0大模型环境配置详解:Python 3.11PyTorch 2.7lerobot依赖安装 1. 项目概述 Pi0是一个创新的视觉-语言-动作流模型,专门设计用于通用机器人控制任务。这个项目最大的亮点是提供了一个直观的Web演示界面,让用户能够通过简单的操作体验先进的…...

小爱音箱改造AUX输入/输出全攻略:一个“几乎成功”的故事

前言很多朋友都想给小爱音箱增加AUX输入和输出功能,实现外接电视、电脑等音源,同时将音箱的声音输出到更大的外置音响系统。网上有很多改造教程,但普遍存在一个严重问题:只实现了单声道输入,浪费了硬件本身的立体声能力…...

gte-base-zh Docker Compose部署:一键编排Xinference+gte-base-zh+WebUI服务栈

gte-base-zh Docker Compose部署:一键编排Xinferencegte-base-zhWebUI服务栈 1. 引言:为什么需要一键部署文本嵌入服务? 如果你正在做智能客服、文档检索或者内容推荐系统,肯定遇到过一个问题:怎么让计算机真正“理解…...

DeepSeek-R1-Distill-Qwen-7B效果展示:复杂问题推理实测

DeepSeek-R1-Distill-Qwen-7B效果展示:复杂问题推理实测 1. 模型能力概览 DeepSeek-R1-Distill-Qwen-7B是DeepSeek团队基于Qwen架构开发的7B参数推理模型,通过强化学习训练和知识蒸馏技术优化,在数学推理、代码生成和逻辑分析任务上展现出卓…...