Redis 分布式集群操作

news2024/11/19 12:42:08

文章目录

  • 连接集群
  • 写入数据
    • 单个key写入
    • 批量key操作
  • 集群查询
    • 查询 key 的 slot
    • 查询 slot 中 key 的数量
    • 查询 slot 中的 key
  • 故障转移
    • Master宕机
    • Master 和 Slave 都宕机
  • 集群扩容
    • 1.启动两个节点
    • 2.添加 master
    • 3.分配slot
    • 4.添加 slave
  • 集群缩容
    • 1.删除 slave 节点
    • 2.移出 master 的 slot
    • 3.删除 master 节点

连接集群

redis-cli -c -p 6380

image-20230612204758257

-c参数表示cluster模式的意思,使用-c参数时,redis-cli会自动检测Redis集群的配置信息,并将命令路由到正确的节点上执行。

写入数据

单个key写入

image-20230612205724867

可以看到当写入name的时候redis会去计算name的hash值,hash值为5798,对应节点的端口号为6381,于是自动重定向到6381的节点上存储数据。当写入languages这个key的时候,由于languages的hash值还在6381这个节点上,因此没有发生重定向。

批量key操作

image-20230612210259921

当使用mset存储多个key时很可能会发生错误。这是因为每个key的hash值不一样,导致可能每个key存储在不同的机器上,所以不能一次性同时写入多个key。要解决这个问题可以使用的方式来一次性存储多个key。只要为这些 key 指定一个统一的 group,让这个 group 作为计算 slot 的唯一值。

image-20230612210904438

集群查询

查询 key 的 slot

通过 cluster keyslot 可以查询指定 key 的 slot。例如,下面是查询 msg 和 name 的 slot。

image-20230613084639869

查询 slot 中 key 的数量

通过 cluster countkeysinslot 命令可以查看到指定 slot 所包含的 key 的个数。

image-20230613085413510

查询 slot 中的 key

通过 cluster getkeysinslot 命令可以查看到指定 slot 所包含的 key。

image-20230613085632719

故障转移

分布式系统中的某个 master 如果出现宕机,那么其相应的 slave 就会自动晋升为 master。如果原 master 又重新启动了,那么原 master 会自动变为新 master 的 slave。

Master宕机

通过 cluster nodes 命令可以查看系统的整体架构及连接情况。

image-20230613090609254

可以看到6380、6381、8382均为Master主机,其中6380的Slave是6383;6381的Slave是6384;6382的Slave是6385。现在将6381关机,再登录6384的机器。

image-20230613091327920

可以看到,由于Master6381宕机,它的Slave6384晋升为Master节点。当6381重新启动后,6381会成为6384的Slave。

image-20230613091804544

Master 和 Slave 都宕机

如果某 slot 范围对应节点的 master 与 slave 全部宕机,那么整个分布式系统是否还可以对外提供读服务,就取决于属性 cluster-require-full-coverage 的设置。

image-20230613092221978

该属性有两种取值:

  • yes:默认值。要求所有 slot 节点必须全覆盖的情况下系统才能运行。

  • no:slot 节点不全的情况下系统也可以提供查询服务。

image-20230613093136389

6381和6384现在都关机了。

image-20230613093316893

整个分布式系统已经不能提供服务。

集群扩容

1.启动两个节点

需要添加两个新的节点:端口号为 6386 的节点为 master节点,其下会有一个端口号为 6387 的 slave 节点。写好相应配置文件以后就能启动。

image-20230613095753565

查询集群的连接情况:

image-20230613101842430

2.添加 master

虽然启动了6386和6387这两个节点,但是在没有添加到分布式系统之前,它们两个是孤立节点,每个节点与其它任何节点都没有关系。现在需要为6386这个master分配slot。通过以下命令:

# 格式:
redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort}

redis-cli --cluster add-node 192.168.11.10:6386 192.168.11.10:6385

可以将新的节点添加到系统中。其中{newHost}:{newPort}是新添加节点的地址,{existHost}:{existPort}是原系统中的任意节点地址。添加成功后,通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其它 master 节点都分配有 slot,只有新添加的 master 还没有相应的 slot。当然,通过该命令也可以看到该新节点的动态 ID。

image-20230613102754473

3.分配slot

为新的 master 分配的 slot 来自于其它节点,总 slot 数量并不会改变。所以 slot 分配过程本质是一个 slot 的移动过程。

通过命令:

# 格式:
redis-cli --cluster reshard {existIP}:{existPort}

redis-cli --cluster reshard 192.168.11.10:6384

开启 slot 分配流程,其中地址{existIP}:{existPort}为分布式系统中的任意节点地址。执行完命令后还要输入需要分配slot的数量和分配给谁的id。

1

现在要选择要移动 slot 的源节点。有两种方案。如果选择键入 all,则所有已存在 slot 的节点都将作为 slot 源节点,即该方案将进行一次 slot 全局大分配。也可以选择其它部分节点作为 slot 源节点。此时将源节点的动态 ID 复制到这里,每个 ID 键入完毕后回车,然后再复制下一个 slot 源节点动态 ID,直至最后一个键入完毕回车后再键入 done。这里我将6380和6382这两个机器作为slot的源节点,从这两个节点中抽取出2500个slot给6386机器。

image-20230613105000843

其首先会检测指定的 slot 源节点的数据,然后制定出 reshard 的方案。

image-20230613105249676

这里会再进行一次 Q&A 交互,询问是否想继续处理推荐的方案。键入 yes,然后开始真正的全局分配,直至完成。现在查看集群的slot分配情况。

image-20230613105536704

可以看到6386的slot确实分配了,只不过并不是连续的,从 [0~1249] 和 [10923~12172]。总共的slot数量:(1249 - 0 + 1) + (12172 - 10923+ 1) = 1250+1250 = 2500。

4.添加 slave

现要将 6387 节点添加为 6386 节点的 slave。当然,首先要确保 6387 节点的 Redis 是启动状态。通过命令:

# 格式
redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID

redis-cli --cluster add-node 192.168.11.10:6387 192.168.11.10:6380 --cluster-slave --cluster-master-id c939dab0c09bb2d28ece43ea3281b31f0ae27fef

可将新添加的节点直接添加为指定 master 的 slave。最后集群连接的结果如下:

image-20230613110743257

集群缩容

下面要将 slave 节点 6387 与 master 节点 6386 从分布式系统中删除。

1.删除 slave 节点

对于 slave 节点,可以直接通过以下命令删除。

# 格式
redis-cli --cluster del-node <delHost>:<delPort> delNodeID

redis-cli --cluster del-node 192.168.11.10:6387 0bd67fc99e234126658b1316ccddd7a39f51b6df

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHFxw6oY-1686627266251)(https://liubing-1314895948.cos.ap-chengdu.myqcloud.com/img/202306131114294.png)]

2.移出 master 的 slot

在删除一个 master 之前,必须要保证该 master 上没有分配有 slot。否则无法删除。所以,在删除一个 master 之前,需要先将其上分配的 slot 移出。

# 这个IP和端口号必须是分布式系统中存在的IP和端口号
redis-cli --cluster reshard 192.168.11.10:6384

接下来就是选择移出的slot数量和接收slot的机器ID

image-20230613112252201

What is the receiving node ID?是6380这个master的机器ID;ID(c939dab0c09bb2d28ece43ea3281b31f0ae27fef)为6386的机器ID。后面再输入yes确认就可以了。整个过程和前面的分配slot非常相似。再使用redis-cli -c -p 6386 cluster nodes命令查看发现,6386 节点中已经没有 slot 了。

3.删除 master 节点

# 格式
redis-cli --cluster del-node <delHost>:<delPort> delNodeID

redis-cli --cluster del-node 192.168.11.10:6386 c939dab0c09bb2d28ece43ea3281b31f0ae27fef

此时再查看集群,发现已经没有了 6386 节点。

image-20230613113302988

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

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

相关文章

【K8SRockyLinux】基于开源操作系统搭建K8S高可用集群(详细版)

文章目录 一、实验节点规划表&#x1f447;二、实验版本说明&#x1f4c3;三、实验拓扑&#x1f4ca;四、实验详细操作步骤&#x1f579;️1. 安装Rocky Linux开源企业操作系统2. 所有主机系统初始化3. 所有master节点部署keepalived4. 所有master节点部署haproxy5. 所有节点配…

睿智医药×企通启动采购与供应链管理项目,加速医药领域数智采购

随着世界经济发展、人口总量增长、人口老龄化程度提高以及人们保健意识增强&#xff0c;新型国家城市化建设的推进和各国医疗保障体制的不断完善&#xff0c;全球医药市场呈持续增长趋势。在政策、资本、技术等因素催化下&#xff0c;我国生物医药行业研发创新实力稳步增强&…

Three.js教程:渲染器

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链。 其他系列工具&#xff1a; NSDT简石数字孪生 渲染器 生活中如果有了景物和相机&#xff0c;那么如果想获得一张照片&#xff0c;就需要你拿着相机&#xff0c;按一下&#xff0c;咔&#xff0c;完成拍照。对于threejs而言…

《西部学刊》期刊简介及投稿邮箱

《西部学刊》是经国家新闻出版总署批准&#xff0c;由陕西新华出版传媒集团主管、主办的面向国内外公开发行的综合性哲学社会科学学术期刊。2014年&#xff0c;被国家新闻出版广电总局认定为第一批学术期刊。 《 西部学刊》以全球视野&#xff0c;关注中国西部&#xff0c;聚焦…

webpack生成模式配置

一、生产模式和开发模式介绍 生成模式&#xff08;production mode&#xff09;是指在开发完成后将代码部署到生产环境中运行的模式&#xff0c;通常需要进行代码压缩、优化、合并&#xff0c;以减少文件大小和请求次数&#xff0c;提高页面加载速度和运行效率。 开发模式&am…

生成式人工智能将会对Salesforce的CRM系统护城河构成破坏性威胁

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 第一季度财务业绩 由于Salesforce(CRM)对2024财年的预测挫败了投资者对其人工智能业务前景的信心&#xff0c;所以猛兽财经认为&#xff0c;Salesforce今年的股价反弹可能已经结束了。尽管该公司在第一季度实现了令人印象深…

母婴商家怎么建立自己的品牌,母婴产品传播渠道总结

随着互联网的发展逐渐深入我们的生活&#xff0c;线上传播的模式也越来越被大家熟知。越来越多的行业开始重视线上传播。那么母婴商家怎么建立自己的品牌&#xff0c;母婴产品传播渠道总结。 其实&#xff0c;母婴产品线上用户群体众多&#xff0c;且母婴产品用户目的明确&…

5_普通最小二乘法线性回归案例(Scikit-learn 0.18.2)

现有一批描述家庭用电情况的数据&#xff0c;对数据进行算法模型预测&#xff0c;并最终得到预测模型&#xff08;每天各个时间段和功率之间的关系、功率与电流之间的关系等&#xff09; 数据来源&#xff1a;Individual household electric power consumption Data Set建议&am…

Meta开源音乐生成AI模型MusicGen;直白图解GPT2模型Self Attention注意力机制

&#x1f989; AI新闻 &#x1f680; Meta开源音乐生成AI模型MusicGen 摘要&#xff1a;Meta在Github上开源了其AI语言模型MusicGen&#xff0c;该模型基于Google 2017年推出的Transformer模型&#xff0c;可将文本和旋律转化为完整乐曲。MusicGen支持文本与旋律的组合输入&a…

Python实现ACO蚁群优化算法优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

AD板子定位孔打孔的两种方式

第一种 注意 直径大小要和 开孔直径一样。 Plated 这个勾打掉 去掉金属壁. 还要X Y坐标 添加一样。 孔位对齐 第二种 选中要开孔的圆 切到机械1层 快捷键 T V B 看效果 总结&#xff1a;第二种最简单

SpringBoot源码-自动装配

一、自动装配原理图 二、入口 springboot的核心注解SpringBootApplication 接着看 SpringBootApplication 注解 截图&#xff1a; 代码&#xff1a; Target({ElementType.TYPE}) //注解的适用范围&#xff0c;Type表示注解可以描述在类、接口、注解或者枚举中 Retention(Ret…

10种常用的数据分析思路

概要 数据分析的思路及其重要&#xff0c;以致于我们总是忽略它&#xff0c;重“术”而轻“道”&#xff0c;但其实应该一视同仁。这篇文章讲了表单分析、用户分析、埋点分析、聚类分析等10种分析方法&#xff0c;先学为敬~ 道家曾强调四个字&#xff0c;叫“道、法、术、器”…

MUR8060PT-ASEMI大电流快恢复二极管80A 600V

编辑&#xff1a;ll MUR8060PT-ASEMI大电流快恢复二极管80A 600V 型号&#xff1a;MUR8060PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大漏源电流&#xff1a;80A 漏源击穿电压&#xff1a;600V 引脚数量&#xff1a;2 恢复时间&#xff1a;22ns 正向压降&am…

NIO 基础

3. 文件编程 non-blocking io 非阻塞 IO 1.1 Channel & Buffer channel 类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 stream 要么是输入&#…

经典文献阅读之--RigidFusion(动态障碍物SLAM)

0. 简介 在真实的SLAM场景中&#xff0c;我们会发现在遇到大量动态障碍物的场景时候&#xff0c;特别容易造成跟丢的问题。传统的解决方法是通过将动态障碍物滤除&#xff0c;而本文《RigidFusion: Robot Localisation and Mapping in Environments with Large Dynamic Rigid …

物联网到底如何实现万物互联?

前言&#xff1a;作为计算机相关专业的你&#xff0c;绝对听说过物联网这个词&#xff0c;它的解释相比你也听过&#xff0c;叫万物互联&#xff0c;也就是所谓的IOT&#xff0c;但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接…

蓝牙客户端QBluetoothSocket的使用——Qt For Android

了解蓝牙 经典蓝牙和低功耗蓝牙差异 经典蓝牙&#xff08;Bluetooth Classic&#xff09;&#xff1a;分为基本速率/增强数据速率(BR/EDR)&#xff0c; 79个信道&#xff0c;在2.4GHz的(ISM)频段。支持点对点设备通信&#xff0c;主要用于实现无线音频流传输&#xff0c;已成…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 &#xff0c;那么响应式是什么呢&#xff1f; 响应式&#xff1a;响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说&#xff1a; 自适应&#xff1a;元素随着…

设置全局loading

为什么要设置全局loading&#xff1f; 在项目开发过程中&#xff0c;请求接口的时候延迟没有数据&#xff0c;页面感觉狠卡顿&#xff0c;这个时候就要用loading来做一个延迟界面。 但是每个界面都写loading的话就会很复杂&#xff0c;所以今天给大家带来了一个全局loading的…