Redis Cluster 扩容实战

news2024/11/17 15:55:23

Redis Cluster 扩容

接着上一篇Redis Cluster 单机集群部署,今天学习下Redis Cluster 架构在实际应用中如何面对各种复杂的场景,如:

  • 扩容 - 增加节点
  • 缩减 - 删除节点
  • 宕机 - 主节点服务异常

增加节点

随着集群需求的变化,系统人员可能需要通过修改Redis Cluster中shard的数量来提高性能,或者降低成本,由此产生Redis Cluster 集群扩展的需求。 对Redis Cluster 集群进行缩减、扩容的条件包含:

  • 内存压力 - 集群节点内存占用过高 需要更多的资源来存储数据
  • CPU瓶颈 - 单机CPU负载过高 请求处理延迟 需要新增节点 分散CPU 计算瓶颈
  • 网络瓶颈 - 大并发场景 网络带宽存在上限限制 需要新增节点 分散网络流量瓶颈
  • 集群规模过大 - 需要缩小进群规模 以降低服务器成本

Redis Cluster 支持两种方式对集群进行扩展

  • 横向扩展 - 水平横向扩展允许通过添加、删除节点数量,对数据进行重新分配
  • 纵向扩展 - 通过增加主节点的副本数 达到高可用的架构设计目标

横向扩展 - 增加节点

在之前已经搭建好的三主三从的的Cluster 架构中新增一个主节点 node_6006.

# 127.0.0.1:6006 表示新加入的节点
# 127.0.0.1:6000 表示当前存在的主节点
redis-cli --cluster add-node 127.0.0.1:6006 127.0.0.1:6000

集群信息

# 使用命令查看集群状态 确认节点已经加入进来
redis-cli -p 6000 cluster nodes

在这里插入图片描述

纵向扩展 - 增加副本

启动6007节点,将他加入集群中,并作为6007的从节点,同步数据

redis-cli --cluster add-node 127.0.0.1:6007 127.0.0.1:6000 --cluster-slave --cluster-master-id 3785af3f1f395e28a66a06e9c73305cbde59f1ba

在这里插入图片描述

已经在集群的基础上正确的添加了2个节点,一主一从。此时整个Redis Cluster 集群共有8个节点,四主四从。但是从上图红线处可知,新增的6006主节点并没有分配Hash槽,也就是实际上它并不能分担整个集群的数据存储功能。

# 使用一下命令 查看Cluster 集群 slot信息
redis-cli -p 6000 cluster slots

在这里插入图片描述

从slot的信息中也看出来6006节点并没有体现,也进一步验证了之前的判断。

数据分配

在对集群数据进行重新分配之前,需要思考以下问题:

  • 新节点分配多少数据 - 目前有4个节点,Redis Cluster总共有16384个hash槽,简单粗暴的进行过平均计算,那么每个节点有4096个hash槽。

  • 数据往哪里分发 - Redis Cluster 集群需要知道节点具体的节点ID 来接收4096个hash 槽数据

    # 通过命令获取 新增节点的ID
    redis-cli -p 6006 cluster myid
    # 3785af3f1f395e28a66a06e9c73305cbde59f1ba
    

可以使用reshard命令对数据进行重新分配

# reshard 后面 可以接集群中的任意节点
redis-cli  -p 6000  --cluster reshard 127.0.0.1:6000

img

此时输入之前计算的数值 4096

在这里插入图片描述

接下来输入Node ID信息 3785af3f1f395e28a66a06e9c73305cbde59f1ba

在这里插入图片描述

数据从all节点进行分配,输入 all

在这里插入图片描述

如上 可以从日志看出数据分配的过程. 但是整个分配过程 是将16384个hash槽重新分配个已有的节点,相当于整个数据库的迁移工作,数据量大的情况下,可能会非常耗时,在生产环境中需要慎用

验证测试

# 重新输入命令 查看slot分配结果
redis-cli -p 6000 cluster slots
127.0.0.1:6001> set x2 world
-> Redirected to slot [6113] located at 127.0.0.1:6006

127.0.0.1:6001> get x2
-> Redirected to slot [6113] located at 127.0.0.1:6006
"world"

设置的key 已经被分配到新的6006节点上了。

删除节点

Redis Cluster 集群删除节点要求该节点的数据必须为空,否则不允许删除。

[ERR] Node 127.0.0.1:6006 is not empty! Reshard data away and try again.

因此,在删除节点之前必须转移数据,将待删除节点的数据迁移到其他节点中去

数据迁移

数据迁移的过程,其实也是reshard,只不过只需要指定特定的节点进行 数据转移,跟新增节点的数据分配过程差不多

# 输入reshard命令
redis-cli -p 6006 --cluster reshard 127.0.0.1:6006

在这里插入图片描述

数据转移到6001节点上去,接下来指定待删除的节点ID - 6006,可以指定多个来源,输入done结束

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: f39bed78c36a901e703072df16b857f96939db2d
Source node #2: done

删除节点

redis-cli --cluster del-node 127.0.0.1:6000 f39bed78c36a901e703072df16b857f96939db2d
AndydeMacBook-Pro:node_6007 andy$ redis-cli --cluster del-node 127.0.0.1:6000 f39bed78c36a901e703072df16b857f96939db2d
>>> Removing node f39bed78c36a901e703072df16b857f96939db2d from cluster 127.0.0.1:6000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

验证测试

节点的验证工作主要包含两方面:

  • 节点的Key是否还存在

    AndydeMacBook-Pro:node_6007 andy$ redis-cli -c -p 6000
    127.0.0.1:6000> get x2
    -> Redirected to slot [6113] located at 127.0.0.1:6001
    "world"
    # 之前在6006节点设置的 x2 被成功的迁移到6001端口
    
  • 查看集群状态

    # 主节点删除后,6007从节点自动变成 1e160d4caa2f13ff7f9297861dc7303f9636f4a0 的副本,1e160d4caa2f13ff7f9297861dc7303f9636f4a0 为6001节点的Node id
    AndydeMacBook-Pro:node_6007 andy$ redis-cli --cluster check 127.0.0.1:6000
    127.0.0.1:6000 (41f2d826...) -> 1 keys | 4096 slots | 1 slaves.
    127.0.0.1:6001 (1e160d4c...) -> 2 keys | 8192 slots | 2 slaves.
    127.0.0.1:6002 (b3065915...) -> 0 keys | 4096 slots | 1 slaves.
    

节点宕机

为了触发故障转移,验证Redis Cluster架构下的主从切换。我们可以把主节点的进程杀死,看从节点是否能正常切换。其次当节点重启后看其是否能正常加入集群。

数据现场

在这里插入图片描述

如上图,6003节点有2个从节点,分别为6000、6007

# x3 的 键值对 也存储在6003 节点上
AndydeMacBook-Pro:node_6007 andy$ redis-cli -c -p 6001
127.0.0.1:6001> get x3
-> Redirected to slot [1984] located at 127.0.0.1:6003
"world"

节点异常

# 人工杀掉 6003节点的进程ID
AndydeMacBook-Pro:redis-5.0.5 andy$ ps -ef | grep redis | grep 6003
  501  6994     1   0 10:29上午 ??         0:24.31 redis-server *:6003 [cluster] 
AndydeMacBook-Pro:redis-5.0.5 andy$ kill -9 6994

验证检查

在这里插入图片描述

从上图看出6007节点升级为主节点,6000节点未副本节点。

# x3 数据也正常从6007节点查询
AndydeMacBook-Pro:node_6007 andy$ redis-cli -c -p 6001
127.0.0.1:6001> get x3
-> Redirected to slot [1984] located at 127.0.0.1:6007
"world"

重启6003Redis服务, 正常加入到Redis Cluster 集群

在这里插入图片描述

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

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

相关文章

smart-doc 文档生成器实战

文章目录一、部署二、代码演示1.类、方法注解2.执行、生成html 或 markdown文档三、参考文档一、部署 1.基于SprinBoot项目&#xff0c;加入pom.xml加入依赖<build><plugins><!-- 打包跳过测试 --><plugin><groupId>org.springframework.boot&l…

[附源码]计算机毕业设计高校学生宿舍管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

若依微服务版登录流程源码分析2

接上篇&#xff0c;后端接收到“/code”请求并将其转发至ValidateCodeHandler处理 生成验证码 进入ValidateCodeServiceImpl#createCaptcha 这块代码比较简单&#xff0c;就不多赘述 /** * 生成验证码 */ Override public AjaxResult createCaptcha() throws IOException, C…

VM 找不到虚拟磁盘 000001.vmdk 一种排查思路

报错内容“ 找不到文件: E:\win10\Windows 10 x64-000001.vmdk 开启此虚拟机需要用到此文件。如果移动了此文件&#xff0c;请提供它的新位置。 ” 它明明就在哪里&#xff0c;却提示找不到&#xff01;气死 这个时候可以打开“vmware.log” 查看报错内容。 比如我的核心报…

从零开始学Java之Java到底是个啥?

全文大约 【 5000】 字&#xff0c;不说废话&#xff0c;只讲可以让你学到技术、明白原理的纯干货&#xff01;文章带有丰富案例及配图、视频&#xff0c;只为让你更好的理解和运用文中的技术概念&#xff0c;给你带来具有足够启迪的教程...... -----------------------------…

基础数据结构链表

链表是一种常见的基础数据结构&#xff0c;结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配&#xff0c;也就是说&#xff0c;链表是一个功能极为强大的数组&#xff0c;他可以在节点中定义多种数据类型&#xff0c;还可以根据需要随意增添&#xff0c;删除&…

论文速递:带重力约束的点云配准(Gravity-constrained point cloud registration)

标题&#xff1a;Gravity-constrained point cloud registration 作者&#xff1a;Vladim ́ır Kubelka, Maxime Vaidis and Franc ̧ois Pomerleau&#xff0c;加拿大拉瓦尔大学 来源&#xff1a;IROS 2022 摘要 视觉和激光SLAM算法从IMU中获益良多。高频率的IMU数据弥补了…

嵌入式:ARM的流水线技术

三级流水线ARM的组织 ARM的3级流水线介绍 到ARM7为止的ARM处理器使用的简单3级流水线分别为 取指级 &#xff1a;读取指令。译码级 &#xff1a;对指令进行译码。占有“译码逻辑”&#xff0c;不占有“数据路径”。执行级 &#xff1a;指令占有“数据路径”&#xff0c;寄存…

拼搏别样的未来,中国社科院与美国杜兰大学金融管理硕士项目助力你的人生旅程

你憧憬中的未来是什么样子呢&#xff1f;我们的人生路程充满了众多可能性&#xff0c;只要努力就会收获自己的别样人生。我们的人生不是单一的色彩&#xff0c;它是五彩斑斓、精彩纷呈的。在每一个阶段的我们所拥有当时的状态并不能代表永远&#xff0c;随着我们的拼搏与奋斗&a…

2022全年度空调十大热门品牌销量榜单

今年空调的销售得到明显改善&#xff0c;尤其是今年夏天全国多地最高气温同比明显提升&#xff0c;且高温的强度和持续时间还具有一定的极端性。随着气温的骤升&#xff0c;空调市场也迅速升温&#xff0c;各终端销售量出现明显增长。 根据鲸参谋数据统计&#xff0c;今年京东平…

“美亚杯”第五届中国电子数据取证大赛答案解析(个人赛)

A C D 分区5为系统分区 A 1073741824*458.29492085140520.96 E A A E D B 无答案 C 搜索各选项&#xff0c;C项搜不到 B C E 使用火绒剑查看进程调用的动态链接库 C 仿真得 B 内存大小为3G&#xff0c;在系统盘根目录过滤大小在2-8G之间的文件 D Win10时间线信息存放的数…

代码随想录算法训练营第六天| 哈希表理论基础 ,242.有效的字母异位词 , 349. 两个数组的交集 ,202. 快乐数,1. 两数之和

代码随想录算法训练营第六天| 哈希表理论基础 &#xff0c;242.有效的字母异位词 &#xff0c; 349. 两个数组的交集 &#xff0c;202. 快乐数&#xff0c;1. 两数之和 哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰…

PAT 乙级 1078字符串压缩与解压 python

题目 思路&#xff1a; 生成两个函数&#xff1a;压缩与解压 在压缩中利用flag保留前一个字符串 再利用count统计重复出现字母的个数 如果目前遍历到的字母和flag相同&#xff0c;则count1 反之&#xff0c;说明重复结束 在解压中&#xff0c;如果遇到数字&#xff0c;表示需…

一文带你了解 K8s 是如何部署应用的

通过部署一个 Nginx 服务/实例来简单介绍 K8s 部署一个应用的流程。 1、创建 deployment 资源 kubectl create deployment nginx --imagenginx kubectl expose deployment nginx --port80 --typeNodePort2、查看 deployment 资源 kubectl get deployment3、查看节点上的 pod…

安全需求分析

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机 过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统 工程师站 A 操作员站 A 实时数据库A 操作员…

【菜鸡读论文】Margin-Mix: Semi-Supervised Learning for Face Expression Recognition

【菜鸡读论文】Margin-Mix: Semi-Supervised Learning for Face Expression Recognition 感觉最近的每天都在见证历史&#xff0c;上海现在也开始全面放开了&#xff0c;很多高校都已经开始遣返了。小伙伴们都回到家了吗&#xff1f; 上周周末太懒了&#xff0c;就没有更新论…

一文教你在SpringBoot中使用Thymeleaf

一文教你在SpringBoot中使用Thymeleaf1.快速使用Thymeleaf2.Thymeleaf快速入门案例3.Thymeleaf基本语法each遍历其他语法1.快速使用Thymeleaf 首先导入Maven依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thym…

怎么在图片加文字边框?这些方法值得你收藏

当我们在拍完照片以后&#xff0c;一般都会为它进行后期的编辑修图&#xff0c;因此在图片上面添加一些文字信息和边框是必不可少的&#xff0c;这样不仅能使图片变得更加精致&#xff0c;还可以增加它的信息量。那你们知道怎么给图片加上边框和文字吗&#xff1f;别着急&#…

uniapp实战仿写网易云音乐(一)—底部工具栏以及首页轮播图swiper的实现

文章目录前言首页导航栏公共样式的配置首页轮播图最后前言 从本篇文章开始记录uniapp实战仿写网易云音乐项目的过程&#xff0c;主要会写一下关键步骤和难点&#xff0c;本专栏会保持持续更新&#xff0c;并在最后送上源码&#xff0c;感兴趣的可以订阅本专栏。本篇主要实现的…

【C++11多线程】获取异步任务的结果:future、shared_future

文章目录1.std::future1.1 get()1.2 valid()1.3 share()1.4 wait_for()1.4.1 std::future_status::timeout1.4.2 std::future_status::ready1.4.3 std::future_status::deferred2.std::shared_future3.参考资料1.std::future std::future 是个类模板&#xff0c;其源码如下所示…