Redis进阶底层原理-Cluster集群底层

news2024/12/24 22:06:08

Redis实现高可用的方案有很多中,先了解下高可用和分区的概念:

高可用是指系统在面对硬件故障、网络故障、软件错误等意外问题时,仍能给客户端提供正常的服务,尽量的减少服务的阻塞、终端现象。在高可用的方案中一般会采用冗余备份、故障转移、和自动切换技术,来保障系统的可用性和稳定性。
比如Redis中高可用的架构体现:

1、主从复制(replication)

将一个主节点设置多个从节点,从节点会有数据备份的功能,当主节点故障了可以通过人工进行故障转移,将从节点接替主节点

2、哨兵模式(sentinel)

Redis哨兵模式,可以用来监控集群中主从节点状态信息,当发生主节点故障时,会进行自动故障转移工作。

3、Redis集群(cluster)

Cluster是Redis官方提供的分布式解决方式,它可以实现数据分区 和 自动故障转移。保障了稳定性和可用性。

4、第三方解决方案

     除了 Redis 官方提供的高可用方案,还有一些第三方解决方案,如 Twemproxy、Codis 等。这些解决方案可 以在 Redis 前面作为代理,提供负载均衡和故障转移的功能,增强 Redis 的可用性和扩展性。
分区集群
     分区集群是指将数组分割成多个分区,每个分区只负责一小部分数据的存储和处理,目的是通过数据分割和负载,减少当个服务器的压力,从而使系统能处理更大规模的数据和请求,并具有良好的水平拓展性。提高了系统的性能和吞吐量。
 

 Redis集群 Cluster

集群Cluster使Redis官方提供的一直分布式高可用分区集群解决方案。它实现了数据分片、故障转移、以及方便客户端的路由功能,保障了高可用性和扩展能力。
Redis Cluster使用了分区槽(slots)概念来管理数据分片和迁移的功能。

特性:

1、数据分区:Cluster将数据分割成16384个槽位,每个槽位可以映射一对key-value,这些数据将被不同的Redis节点管理。

2、自动的分区和迁移:Cluster根据Redis节点平均分配不同的槽位范围,数据通过hash算法,确定映射在哪个分区,从而确定由哪个Redis实例存储和处理。当完成故障转移工作,会自动的完成从节点的数据槽位迁移工作。

3、故障转移高可用性:Cluster实现了类似于Sentinel的故障转移功能,当主节点发生故障时,会进行故障转移操作,将从节点顶替主节点,实现了高可用性。

4、gossip协议:Cluster不像Sentinel是一个独立的redis实例去监控和故障转移,主从节点会被以Cluster模式启动,集群节点之前通过流言协议(gossip)进行交互、信息交换和监控,比如当发现主节点出现故障时,各个节点通过流言协议判断并进行故障转移操作。

5、客户端路由:用户客户端和集群的交互是通过集群客户端进行的,集群客户端会通过key的hash值来判断并转发到指定的redis实例上。实现了方便客户端的路由功能。

数据分区:

Redis集群没有使用到一致性Hash,而是引入了Hash槽的概念:

Redis集群一共拥有16384个槽位,每个key通过crc16hash算法校验后对16384取模来决定放入哪个槽,集群的每个Redis节点负责一部分槽位,如下:
比如有3个redis节点,
那么:

  • 节点 A 包含 0 到 5500号哈希槽.
  • 节点 B 包含5501 到 11000 号哈希槽.
  • 节点 C 包含11001 到 16384号哈希槽.

这样的结构很容进行删除和新增操作,比如新增一个节点D,只需要将A,B,C三个节点中部分节点迁移到D节点中;如果想删除一个节点A,则将A节点的槽位分摊到B,C节点上即可。在整个槽位迁移过程中,不能导致服务停止状态,所以不会造成集群不可用。但是涉及到迁移的节点会有短暂的不可用窗口,一般会提示客户端 数据在迁移过程中:

面对这种问题,可以通过一些手段将影响降到最低:
1、确保迁移速度,比如加大带宽的硬件配置,提高迁移速度,减少不可用时间。
2、逐步迁移:将被迁移的数据进行分批处理,减少不可用窗口。
3、监控和控制:可以做好一些监控措施,当返现服务不可用时,进行响应的对应措施,降低影响。

故障转移 :

上面了解到,Redis集群中节点之间会通过流言协议进行通信当多个节点都认定某个节点ping失败时,就认定其发生故障Fail,并开始从其从节点中选举一个适合从节点来进行故障转移,如果没有可用的从节点来替换,则集群将被置为错误状态,并停止客户端使用。详细过程如下:

 

 MOVED重定向

集群中会存在多个节点负责管理不同槽位的数据,但是对于客户端来说,只会连接到其中一个节点,当客户端请求的数据key不再当前连接的
Redis实例时,当前节点会返回 -MOVED 8888 127.0.0.1:6381 信息,其中包括了当前key所在的槽位和IP地址

ASK重定向 

Ask重定向发生于集群伸缩是,集群伸缩会导致槽位的迁移,当我们去源节点访问时,此时数据可能已经迁移到了昕的目标节点了,此时会ASK重定向来解决此种情况。

 什么情况会导致集群down

1、主节点发生故障时,且没有可用的从节点。

2、启动集群时,因为某些原因,导致存在槽位没有正常分配除去

3、集群启动时,存在主节点没有正常启动等

集群down时,问题定位

问题描述:启动集群节点后,进入7379主中进行set请求,报错:(error) CLUSTERDOWN The cluster is down

查看集群拓扑信息,返现有槽位没有分配完

 进入到7379节点中,查看槽位信息, 发现槽位分配中存在0~1999槽位分配给了未知redis实例

 通过nodes-7379.conf 配置文件查看,确实发现了存在位置IP的实例和0~2000槽位

解决办法:将未知实例删除 ,可以直接删除配置中的记录。同时手动修改槽位分配信息(当然可以通过指令操作)

原图地址:

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

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

相关文章

《洛谷深浅》第五章---数组与数据批量存储

文章目录 前言一、小鱼比可爱二、小鱼的数字游戏三、冰雹猜想四、校门外的树五、旗鼓相当的对手六、旗鼓相当的对手总结 前言 本节主要学习一维数组 和 多维数组 后边的知识我觉得 可以试着了解并不要求你掌握这么难的题目 因为ACM更多都是思维题目 所以这里把重要的题目掌握就…

【多线程系列-03】深入理解java中线程的生命周期,任务调度

多线程系列整体栏目 内容链接地址【一】深入理解进程、线程和CPU之间的关系https://blog.csdn.net/zhenghuishengq/article/details/131714191【二】java创建线程的方式到底有几种?(详解)https://blog.csdn.net/zhenghuishengq/article/details/127968166【三】深入…

基于树莓派实现的IO-Link 项目

IO-Link 协议 (IEC 61131-9) 是从传感器或执行器到 IO-Link 主站的串行半双工点对点连接。目前IO-Link 的硬应已经越来越普及。国外产品以巴鲁夫为代表。如何开发IO-link 产品?可以参考国外的一些开源项目。 国外有人开发了开发一个IO-Link主…

soundfile torchaudio 读取音频文件

soundfile 和 torchaudio 读取音频文件后的数据格式不同,前者是numpy,后者是tensor。前者读取后可以直接用于一些python的基础函数输入,后者用于pytorch的一些函数的应用。两者互换用途时候需要进行格式转换。 import soundfile as sf impor…

智能指针使用及详细解析

文章目录 智能指针概念为什么使用智能指针智能指针使用智能指针的常用函数get() 获取智能指针托管的指针地址.reset() 重置智能指针托管的内存地址,如果地址不一致,原来的会被析构掉 auto_ptrunique_ptrshared_ptr**shared_ptr的原理**引用计数的使用构造…

Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等…

STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库…

Spring Batch之读数据库——JdbcCursorItemReader之自定义RowMapper(三十七)

一、自定义RowMapper 详情参考我的另一篇博客: Spring Batch之读数据库——JdbcCursorItemReader(三十五)_人……杰的博客-CSDN博客 二、项目实例 1.项目框架 2.代码实现 BatchMain.java: package com.xj.demo28;import org.springfram…

代码随想录第27天 | 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

455.分发饼干 /*** param {number[]} g* param {number[]} s* return {number}*/ var findContentChildren function(g, s) {let a0let b0let count0g.sort((a,b)>a-b)s.sort((a,b)>a-b)while(a<g.length&&b<s.length){if(s[b]>g[a]){countba}else{b}…

STM32(HAL库)软件IIC驱动OLED

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 OLED驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机&#xff08;HAL库&#xff09;通过软件IIC方式…

java linux服务器环境搭建

安装 jdk 下载jdk: wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24http%3A%2F%2Fwww.oracle.com%2F; oraclelicenseaccept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f…

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…

Ubuntu18.04 安装vscode 配置C#编译器

环境&#xff1a; ubuntu 18.04 依赖库&#xff1a; SDK .net-7 安装对象&#xff1a; vscode 在终端&#xff1a; ./dotnet-install.sh --channel 7.0 遇见如下提示&#xff1a; dotnet&#xff1a;未找到命令 如下操作&#xff1a; 下载–解压–安装 wget https://pa…

Python 自学 day04 函数为参数传递, 匿名函数, 文件操作

1. 函数作为参数传递 &#xff08;类似C 函数指针&#xff09; def func(x):mm x(1,2);#print(f"mm的值是{mm}")return mmdef add(x,y): #加法return xy def reduce(x,y): # 减法return x-ydef ride(x,y): # 乘法return x*ydef divide(x,y): #带有小数点除法…

详解DDPG算法:解决对大量的超参数、随机重启、任务环境敏感问题,完成月球着陆器,双足机器人demo、以及超参数调优教学

0.demo展示 当我复现强化学习算法 DDPG 时,我发现论文中缺少必要的实现细节,例如:Gamma、噪声方差、最大训练步数等参数的取值。此外,在我调整参数,成功完成某次训练后,当我对随机种子进行修改,发现训练时长有很大变化,甚至有时候无法完成训练。更别提把在某个任务上 w…

1、linux中安装tomcat

1、创建目录 cd /opt ls mkdir tomcat 2、将文件拖入tomcat目录中 3、解压安装包 cd /opt/tomcat ls tar -zxvf apache-tomcat-8.5.59.tar.gz 4、启动tomcat cd /opt/tomcat/apache-tomcat-8.5.59/bin ./startup.sh 5、在linux中访问 http://localhost:8080/ 6、开放端口 …

为什么选择孟德尔随机化来写文章

为什么选择孟德尔随机化来写文章

【日常BUG】批量插入数据时报错: There is no setter for proerty named uptByd‘ in ‘class ...

前提&#xff1a;定义了自动填充策略&#xff0c;使用mybatis-plus 配置了属性自动注入 实体类上也定义了需要自动填充的字段。 但是在使用批量插入数据时报错&#xff1a; There is no setter for proerty named uptByd’ in class …&#xff0c; 排查过后发现是实体类中没…

QT QTableView添加CheckBox

需求&#xff1a;QTableView中指定列所有Item均为CheckBox项&#xff0c;要求CheckBox居中显示 显示效果如下&#xff1a;三种表现效果 实现方式&#xff1a; 系统控件QCheckBox 自绘制CheckBox CheckBox的图片 实现代码&#xff1a;(原理&#xff1a;利用委托自绘的方式)…

FasterViT实战:使用FasterViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译&#xff1a;https://blog.csdn.net/m0_47867638/article/details/131542132 官方源码&#xff1a;https://github.com/NVlabs/FasterViT 这是一篇来自英伟…