【Redis进阶】集群

1. 集群分片算法

1.1 集群概述

首先对于"集群"这个概念是存在不同理解的:

  • 广义的"集群":表示由多台主机构成的分布式系统,称为"集群"
  • 狭义的"集群":指的是redis提供的一种集群模式,用来解决存储空间不足的问题(拓展存储空间)

前面我们介绍的哨兵、主从模式都是为了保障系统的可用性,但是目前为止,无论是主节点还是从节点都需要完整的保存数据的全集,但是当前是一个"大数据时代",我们希望能够保证高效的同时,存储空间足够,因此引入了"集群模式"

1.2 分片算法

那么我们如何将数据分成多份,保存在不同的节点中呢?此时的每一份数据被称为一个"分片"(sharding)
常见的分片算法有如下三种:

  1. 哈希求余算法
  2. 一致性哈希算法
  3. 哈希槽分区算法

1.2.1 哈希求余算法

该算法本质借鉴了哈希表这种数据结构的思想:借助哈希函数将一个key映射为一个整数,然后对数组的长度进行取余操作得到对应数组下标,即保存位置。同理,哈希求余算法也是一样,比如一共分为三个分片,标记为0,1,2。然后就将redis中的key使用一种哈希算法(比如md5)计算结果得到hash值,然后对分片总数3进行取余操作得到对应的分片下标

示例:假设hash(key) % 3 == 0 => 计算得出保存的分片编号为0,于是将数据保存在0号分片上;当需要获取数据的时候也是通过同样的key以及同样的hash算法,经过计算hash(key) % 3 ==0 得到分片位置,取出数据

值得一提的是md5算法就是常见的哈希算法,内部经过一系列的数学运算能够将一个字符串转换为整数值,其特点如下:

  1. md5的计算结果是定长的,比如使用md5-16算法,无论原始字符串是怎样的,最终的计算结果都是一个16位的16进制数字
  2. md5计算结果是分散的,意味着即使两个输入字符串大部分内容相同,只有少部分不同,得到的计算结果也是大相径庭的
  3. md5是不可逆的(也用于加密算法),表示给定一个输入字符串可以轻易计算出结果,但是给定结果却无法还原出输入内容

哈希求余缺点:
当前哈希求余算法存在一定的缺点,比如当前为3个分片,哈希函数为hash(key) = key,再对3取余得到当前的分片结果为:0:102,105,108,1:103,106,109,2:104,107,110,但是此时需要进行扩容:重新哈希后分片结果为:0:104:108,1:105,109,2:102,106,110,3:103,107,不难发现,扩容之后大部分数据都需要进行迁移搬运。
总结:
因此当前扩容过程开销是很大的,是万万不能在生产环境上执行的,只能通过"替换"等曲线救国方式来实现扩容,成本更高、操作步骤也更为复杂了。

1.2.2 一致性哈希算法

为了降低上述的搬运开销,业界又提出了"一致性哈希算法",从key映射到分片序号的过程就不再是简单求余了,而是改成了以下过程:
Step1:将0 - 2^32 - 1这个数据空间,映射到一个圆环上,数据按照顺时针方向增长

Step2:假设当前存在3个分片,就把分片指针放到对应的位置:

Step3:假设有一个key,计算得到hash值为H,那么应该分配到哪个分片上呢?规则很简单,就是找到对应的位置然后顺时针找到的第一个分片就是其从属的分片位置

Step4:如果此时需要扩容,分片数由3 -> 4应该如何操作呢?、

我们随机在圆盘上找一个位置插入3号分片,此时只需要将2号分片的部分数据搬运到3号分片上就完成了搬运操作,上述过程虽然仍存在一定的搬运开销,但是相比较于哈希求余算法,就要少的多了,但是一致性哈希算法也存在着一个重要缺点:
一致性哈希缺点:
那就是存在"数据倾斜"问题,当前如果平均将0-2^32-1数据空间划分为0,1,2三个分片,一旦进行扩容,就会导致每个分片的数据量不均衡

1.2.3 哈希槽分区算法

这是redis真正采取的算法,其哈希槽计算公式为hash_slot = crc16(key) % 16384
该种算法实质上是将哈希求余算法和一致性哈希算法结合了起来,下面给出了一种分配方式
假设当前有三个分片:

  • 0号分片:[0, 5641]共5642个槽位号
  • 1号分片:[5642,10923]共5642个槽位号
  • 2号分片:[10924,16383]共5460个槽位号

虽然不是严格意义上的平均分配,但是差异非常小,可以近似看做是均匀分配了,并且每个分片还会使用位图这样的数据结构表示当前具有槽位号,16384个比特位 => 2KB存储空间

注意:这里只是其中一种分配方式,事实上分配方式是非常灵活的,每个分片持有的槽位号可以是连续的,也可以是不连续的

问题一:Redis集群是最多有16384个分片么?
如果redis集群有16384个分片,此时按照平均划分每个分片分配到一个槽位号(很难),因为我们的key是先映射到槽位号,然后再映射到分片上的,此时就很难保证各个分片的均衡性。
实际上redis的作者建议集群分片数不应该超过1000
问题二:为什么是16384个槽位号?
这个问题有人在github上询问了,作者给出的答复是:由于我们redis集群节点之间后续需要通过频繁传递心跳包检测是否存活,而心跳包中包含了某个分片含有哪些槽位号等信息,16384个槽位号可以用2KB存储,但是65535就需要8KB了,16384能保证通信可用性的同时尽可能节省网络带宽等资源

2. 集群故障恢复

集群故障:如果当前集群中有节点挂了,应该怎么办?这里需要分情况讨论:

  • case1:如果挂了的是从节点,那就没事
  • case2:如果挂了的是主节点,那就需要进行故障转移操作

2.1 故障判定

该步骤主要用于确定集群中哪个节点挂了,主要流程如下:

  1. 节点之间通过心跳包进行通信:比如节点A给节点B发送ping包,节点B需要给节点A返回pong包(这两个数据包只有message type字段不同,其余内容相同)心跳包中包含集群的配置信息,比如节点id、节点从属于哪个分片、是主节点还是从节点、持有哪些slots的位图
  2. 每个节点每秒钟都会给随机一些节点发送ping包,不是全发一遍(避免节点很多时洪泛发送心跳包)
  3. 当节点A给节点B发送ping包,B不能如期回应时,A就会尝试重置和B的TCP连接,如果仍连接失败,就会把B标记为PFAIL状态(主观下线)
  4. A判定B为PFAIL之后,就会通过redis内部Gossip协议与其他节点通信,确认B的状态(每个节点会维护一个主观下线列表)
  5. 如果超过半数节点认为B主观下线,那么A就会把B标记为FAIL状态(客观下线),并将此消息同步给其他节点

2.2 故障迁移

该步骤主要用于保障集群可用性,假设节点B被标记为FAIL客观下线,存在两种情况:

  • 如果是主节点,则将由B的从节点来触发故障转移
  • 如果是从节点,则不会触发故障转移操作

故障转移流程:

  1. 从节点判定自身是否有资格参与选举,如果主从之间太久没有通信,时间超过阈值,则没有资格参与选举
  2. 具有资格的从节点比如C和D,就会休眠上一段时间(500ms基础时间 + [0,500]ms随机时间 + 排名 * 1000ms),其中offset同步值越大,排名靠前(越小)
  3. 比如C的休眠时间到了,C就会给集群中其他节点发送请求,申请拉票(只有主节点才有资格投票
  4. 当节点C的得票数超过半数主节点之后,C就会晋升成为主节点(自己执行slaveof no one)并让D执行slaveof C
  5. 同时C还会把自己晋升为主节点的事,同步给集群中其余节点,大家就会更新保存的集群结构信息

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

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

相关文章

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册,并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片,点击x号后要删除掉当前的图片,那么我们设计的时候如果我们代码写成如下的格式 …

谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集

文章目录 一,拖拽后结点的parentCid的更新二,拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三,拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(2)登录,注册功能实现

技术支持:JAVA、JSP 服务器:TOMCAT 7.0.86 编程软件:IntelliJ IDEA 2021.1.3 x64 登陆页面如下 在这个页面中我们实现了一个登录页面和一个注册页面的Jsp文件,和两个java 的服务层文件 分别是web包下的denglu.jsp和zhuce.jsp以…

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障,主要涉及微软视窗(Windows)操作系统及其相关应用和服务。 以下是对该事件的详细解析: 一、事件概述 发生时间:2024年7月19日事件影响:全球多个…

2023河南萌新联赛第(二)场 南阳理工学院

A. 国际旅行Ⅰ 题目&#xff1a; 思路&#xff1a; 因为题意上每个国家可以相互到达&#xff0c;所以只需要排序&#xff0c;输出第k小的值就可以了。 AC代码&#xff1a; #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…

基于k8s快速搭建docker镜像服务的demo

基于k8s快速搭建docker镜像服务的demo 一、环境准备 如标题&#xff0c;你需要环境中有和2个平台&#xff0c;并且服务器上也已经安装好docker服务 接下来我来构建一个docker镜像&#xff0c;然后使用harbork8s来快速部署服务demo 二、部署概述 使用docker构建镜像&#x…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

zyx青岛实训day14 7/25

Git 一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更 一&#xff0e;Git的主要功能&#xff1a; 二&#xff0e;准备git机器 修改静态ip&#xff0c;主机名 三&#xff0e;git仓库的建立&#xff1a; 1.安装git [rootgit ~]# yum -y install git 2.创建一个…

ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案

0 前言 室内机器人需要具备适应性和灵活性&#xff0c;以便在狭窄的空间中进行安全、高效的导航。本文提供一些让机器人在狭窄区域安全通过的思路&#xff0c;希望帮助读者根据实际开发适当调整和扩展 1 Voronoi图 Voronoi图&#xff1a;根据给定的一组“种子点”&#xff0…

在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具。在 2023 年国际机器学习会议 (ICML) 上&#xff0c;MILA 和英特尔实验室联合发布了ProtST模型&#xff0c;该模型是个可基于文本提示设计蛋白质的多模态模型。此后&#xff0…

项目一缓存商品

文章目录 概要整体架构流程技术细节小结 概要 因为商品是经常被浏览的,所以数据库的访问量就问大大增加,造成负载过大影响性能,所以我们需要把商品缓存到redis当中,因为redis是存在内存中的,所以效率会比MySQL的快. 整体架构流程 技术细节 我们在缓存时需要保持数据的一致性所…

如何实现Web服务只允许特定客户端访问

如何实现Web服务只允许特定客户端访问 需求来源 为了满足B/S系统给客户演示的需要&#xff0c;需要部署一套系统允许公网能够访问&#xff0c;便于业务人员到客户哪里进行系统演示&#xff0c;但是目前网络安全非常重要&#xff0c;希望能防止暴力破解或者端口扫描等黑客攻击…

C#/WinFrom TCP通信+ 网线插拔检测+客服端异常掉线检测

Winfor Tcp通信(服务端) 今天给大家讲一下C# 关于Tcp 通信部分&#xff0c;这一块的教程网上一大堆&#xff0c;不过关于掉网&#xff0c;异常断开连接的这部分到是到是没有多少说明&#xff0c;有方法 不过基本上最多的两种方式&#xff08;1.设置一个超时时间&#xff0c;2.…

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…

第二讲:NJ网络配置

Ethernet/IP网络拓扑结构 一. NJ EtherNet/IP 1、网络端口位置 NJ的CPU上面有两个RJ45的网络接口,其中一个是EtherNet/IP网络端口(另一个是EtherCAT的网络端口) 2、网络作用 如图所示,EtherNet/IP网络既可以做控制器与控制器之间的通信,也可以实现与上位机系统的对接通…

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令

在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…

《华为数据之道》读书笔记六---面向自助消费的数据服务建设

七、从结果管理到过程管理&#xff0c; 从能“看”到能“管” 1、数据赋能业务运营 数字化运营旨在利用数字化技术获取、管理和分析数据&#xff0c;从而为企业的战略决策与业务运营提供可量化的、科学的支撑。 数字化运营归根结底是运营&#xff0c;旨在推动运营效率与能力的…

我在百科荣创企业实践——简易函数信号发生器(5)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

python+vue3+onlyoffice在线文档系统实战20240725笔记,首页开发

解决遗留问题 内容区域的高度没有生效&#xff0c;会随着菜单的高度自动变化。 解决方案&#xff1a;给侧边加上一个最小高度。 首页设计 另一种设计&#xff1a; 进来以后&#xff0c;是所有的文件夹和最近的文件。 有一张表格&#xff0c;类似于Windows目录详情&…