集群部署篇--Redis 集群动态伸缩

news2024/11/18 9:35:37

文章目录

  • 前言
  • 一、redis 节点的添加
    • 1.1 redis 的实例部署:
    • 1.2 redis 节点添加:
    • 1.3 槽位分配:
    • 1.4 添加从节点:
  • 二、redis 节点的减少
    • 2.1 移除主节点
      • 2.1.1 迁移槽位
      • 2.1.1 删除节点:
  • 三、redis 删除节点的重新加入
    • 3.1 加入节点:
  • 四、redis 集群的故障转移:
    • 4.1 某个主节点挂掉:
    • 4.2 故障转移过程:
  • 五、扩展:
    • 5.1 redis 集群的cluster help命令:
    • 5.2 redis 集群的cluster nodes命令:
    • 5.3 `CLUSTER FORGET` 和 `del-node`:
  • 总结
  • 参考:


前言

在集群部署篇–Redis 集群分片模式 中我们知道了如果去部署redis 的分片集群,本文继续结束下集群节点的增加和删除。


一、redis 节点的添加

本文示例新添加3个节点,1主2从; redis 集群的一些操作指令可以参考 章节:五、扩展;

1.1 redis 的实例部署:

可以参考集群部署篇–Redis 集群分片模式 中 二、Redis 分片集群搭建:部署3个redis 实例;

1.2 redis 节点添加:

使用 --cluster add-node 进行节点添加:

docker exec -it fpredis-8379 redis-cli -p 8379  -a 123456 --cluster add-node 192.168.75.131:5379  192.168.75.131:8379
  • docker exec -it fpredis-8379 redis-cli -p 8379 -a 123456 :用于连接某个redis 实例从而使用redis-cli 客户端
  • –cluster add-node 添加节点命令
  • 192.168.75.131:5379 新添加的节点信息 ip:端口
  • 192.168.75.131:8379 已经存在于集群中的任意一个节点 ip:端口
    在这里插入图片描述
    可以看到会将加入的节点信息 告知集群;

查看新加入的要成为主节点的 node id 信息:连接集群中任意一个节点 执行 cluster nodes 命令(cluster nodes命令 参考 章节: 5.2 redis 集群的cluster nodes命令)

 docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456 -c cluster nodes

在这里插入图片描述
其中 第一列是node id,是改集群下节点的唯一id

1.3 槽位分配:

使用 --cluster reshard 从已经存在的主节点中索取槽位:

 docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456  --cluster reshard 192.168.75.131:8379
  • docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456 :用于连接某个redis 实例从而使用redis-cli 客户端
  • –cluster reshard 交互式槽位分配命令
  • 192.168.75.131:8379已经存在于集群中的任意一个节点 ip:端口

在这里插入图片描述
系统返回信息会提示我们要移动多少哈希槽,这里移动200个 输入200 然后回车;
在这里插入图片描述
然后 需要指定把这些哈希槽转移到哪个节点上,这里选择我们新加入的5379 节点:
35dc0f75b5d8c8818089bb3b6a4cc8717de7c9fb
在这里插入图片描述

选择迁移槽位模式:

  • all all 表示从所有的主节点中随机转移,凑够200个哈希槽;
    在这里插入图片描述

  • done模式:需要你手动的去收入你要迁移的主节点id ,可以为多个接着可以输入 你要迁移的主节点的 节点id:
    最后输入 done 表示输入完成;
    在这里插入图片描述
    如果输入的不是主节点id 会有错误提示:
    在这里插入图片描述
    然后再输入yes,redis集群就开始分配哈希槽:
    在这里插入图片描述
    这样新加入的主节点就获取到了相应的槽位,以及随着迁移过来的数据;

1.4 添加从节点:

将已经存在的redis 实例添加到集群;

docker exec -it fpredis-8379 redis-cli -p 8379  -a 123456 --cluster add-node 192.168.75.131:5479  192.168.75.131:8379

其中192.168.75.131:5479 为新加入的节点ip 及端口,192.168.75.131:8379 为集群中任意节点ip 及端口
查看集群节点信息:
在这里插入图片描述

在对应的从节点上执行

docker exec -it fpredis-5479 redis-cli -p 5479  -a 123456  CLUSTER REPLICATE 35dc0f75b5d8c8818089bb3b6a4cc8717de7c9fb
  • docker exec -it fpredis-5479 redis-cli -p 5479 -a 123456 连接你要添加从节点的redis 实例 使用redis 客户端
  • CLUSTER REPLICATE 添加从节点命令
  • 35dc0f75b5d8c8818089bb3b6a4cc8717de7c9fb 要添加的主节点再集群中的唯一id

二、redis 节点的减少

集群中节点是由主从构成的,对于主从节点删除 也是不同的,对于注解点的删除,如果它拥有槽位需要先迁移槽位,在进行删除;对于从节点因为其只是同步主节点数据 可以直接将其从集群中删除;

2.1 移除主节点

2.1.1 迁移槽位

文中的例子是把拥有的全部槽位(10个),全部迁移到另外一台maser 节点上去

 docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456  --cluster reshard 192.168.75.131:8379

在这里插入图片描述

迁移的过程和 1.3 槽位分配 流程相同,在Redis集群中执行槽位(slot)的迁移时,涉及到槽位内的所有键值对数据也会一起迁移到目标节点。迁移完成,我们连接集群中任意一个节点在看下节点信息;

 docker exec -it fpredis-5479 redis-cli -p 5479 -a 123456 -c cluster nodes

在这里插入图片描述
通过观察可以发现迁移完成后 ,之前的主节点现在已经变成了从节点;

2.1.1 删除节点:

通过del-node 命令删除节点:

docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456    --cluster del-node 192.168.75.131:8379 43772a8e7c9be990df93c194d11b3bb71eecebca
  • docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456 主要是为了进入某个redis 实例中从而使用redis 的客户端redis-cli

  • –cluster del-node 集群删除命令

  • 192.168.75.132:8379 为集群中任意一个节点(可以连接你正在操作机器上 redis集群的一个实例)

  • 43772a8e7c9be990df93c194d11b3bb71eecebca 为要删除的节点id

在这里插入图片描述
当然也可以将改主节点的从节点进行删除,只要将 节点id 换为从节点id 即可:

 docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456    --cluster del-node 192.168.75.131:8379 1f9319b915b590eaf4a84f35e3c4e0cb5e11fb84

三、redis 删除节点的重新加入

通过 --cluster add-node 将需要的节点加入到集群中,新加入的节点是 master 主节点,并且没有被分配槽位,可以为其分配槽位使其成为一个新的主节点,也可以让其成为已经存在主节点的一个从节点,流程同 一、redis 节点的添加:本章节进行简单的概况

3.1 加入节点:

docker exec -it fpredis-8379 redis-cli -p 8379  -a 123456 --cluster add-node 192.168.75.131:5579  192.168.75.131:8379

在这里插入图片描述
查看节点的情况:

在这里插入图片描述
可以看到刚加入的节点是master 并且没有被分配槽位,重复 一、redis 节点的添加 可以为其分配槽位让其成为主节点,或者通过CLUSTER REPLICATE 命令让其成为某个主节点的从节点;

四、redis 集群的故障转移:

4.1 某个主节点挂掉:

查看集群节点的信息:

docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456 -c cluster nodes

在这里插入图片描述
此时直接停掉主节点 5379 这个实例:

docker stop fpredis-5379

因为 fpredis-5379 实例已经被停到,此时使用它的一个从节点查看集群情况

docker exec -it fpredis-5479 redis-cli -p 5479 -a 123456 -c cluster nodes

在这里插入图片描述
可以看到 fpredis-5379 主节点已经 端口连接,并且已经选举出了新的主节点,接管了之前的槽位:此时我们恢复fpredis-5379 实例,它也知会成为集群的一个从节点:
在这里插入图片描述

4.2 故障转移过程:

在Redis集群中,当一个主节点宕机时,会触发故障转移(failover)过程。这个过程由Redis集群内的自动故障检测和转移机制控制。故障转移的主要目的是选举出一个新的主节点,以接替失效的主节点的角色,保证集群的高可用性。下面是主节点宕机后故障转移的大致流程:

  1. 故障检测
    其他主节点会定期向集群中的所有其他节点发送PING消息。如果一个主节点在指定的时间内未能回应,其他节点就会怀疑该节点发生了故障。

  2. 选举流程
    当足够数量的主节点(集群中大多数节点,至少 N/2 + 1,其中N为集群主节点总数)都认为一个主节点失效时,该主节点的从节点将开始选举流程。从节点会根据预设条件(例如复制偏移量、运行时间等)选举出一个从节点成为新的主节点。

  3. 晋升过程
    选举出的从节点会将自己转变为主节点。这个过程涉及更新配置和发送通知给集群中的其他节点以获得它作为主节点的承认。

  4. 配置更新
    新晋升的主节点负责接管原主节点负责管理的所有键槽(hash slots),并与集群中的其他节点通信以更新集群状态。

  5. 数据同步
    一旦成为新的主节点,它将继续处理客户端请求,并开始与可能存在的其他从节点进行同步。这些从节点之前可能跟随的是旧的主节点,现在需要与新的主节点同步数据。

  6. 故障恢复
    如果原来的主节点后来恢复了,它将被集群视为一个普通的从节点,并可能开始复制新的主节点的数据。它的所有键槽(hash slots)都已经移交给了新的主节点。

这个故障转移过程通常是自动进行的,但是Redis提供了手动干预的命令。例如,你可以使用CLUSTER FAILOVER命令来触发从节点的故障转移过程。

在分布式系统中,故障转移完整性非常重要,是评估集群健壮性的一个关键指标。因此,Redis集群的设计目标之一是确保在面临节点宕机等各种故障时,能够迅速且自动地进行恢复。

五、扩展:

5.1 redis 集群的cluster help命令:

通过 cluster help 查看指令:

docker exec -it fpredis-5379 redis-cli -p 5379 -a 123456 --cluster  help

在这里插入图片描述

  1. create:创建集群

  2. check:检查集群

  3. info:查看集群信息

  4. fix:修复集群

  5. reshard:在线迁移slot

  6. rebalance:平衡集群节点slot数量

  7. add-node:添加新节点

  8. del-node:删除节点

  9. set-timeout:设置节点的超时时间

  10. call:在集群所有节点上执行命令

  11. import:将外部redis数据导入集群

5.2 redis 集群的cluster nodes命令:

当你在命令行中执行 redis-cli CLUSTER NODES 命令时,Redis 会返回集群中所有节点的状态信息。这些信息按行分隔,每个节点的信息包括以下字段:

<node-id> <ip:port> <flags> <master> <last-ping-sent> <last-pong-received> <config-epoch> <link-state> <slots>

每个字段具体解释如下:

  1. node-id: 唯一标识每个节点的ID。
  2. ip:port: 节点的IP地址和端口号。
  3. flags: 节点的角色和状态信息,如:
    • master: 该节点是一个主节点。
    • slave: 该节点是一个从节点。
    • myself: 标识这是你当前与之交互的节点。
    • fail?: 疑似失败状态(其他节点怀疑该节点失败)。
    • fail: 失败状态(集群已经同意该节点失败)。
    • handshake: 节点处于加入集群的握手过程中。
    • noaddr: 没有有效的地址。
  4. master: 如果该节点是从节点,这里会显示它所属的主节点ID;如果该节点是主节点,则此字段为空。
  5. last-ping-sent: 上次发送 PING 的时间戳(毫秒)。
  6. last-pong-received: 上次收到 PONG 的时间戳(毫秒)。
  7. config-epoch: 节点的配置纪元,用于实现故障转移。
  8. link-state: 与此节点的连接状态,connected 表示已连接,disconnected 表示断开连接。
  9. slots: 显示该节点负责的槽位。对于主节点,这会列出槽位范围和个别槽位;从节点则不显示此部分。

下面是一个简单的 CLUSTER NODES 输出示例:

07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:7000@17000 master - 0 1407638882853 13 connected 0-5460
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:7001@17001 myself,master - 0 0 1 connected 5461-10922

在这个例子中,有两个主节点。第一个主节点 07c37dfeb235213a872192d90877d0cd55635b91 有槽位0到5460分配给它,并且目前状态是 connected。第二个节点 e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 是你当前连接的节点(myself 标志),它掌管槽位5461到10922,状态也是 connected

5.3 CLUSTER FORGETdel-node:

“del-node”是一个redis-trib 脚本的操作,该脚本用于管理Redis集群。redis-trib脚本中的"del-node"操作更像是一个集成操作,其实际上背后执行了如"CLUSTER FORGET"等一系列命令组合,来自动地移除一个节点。

  1. CLUSTER FORGET

    • 这是一个Redis集群命令,用于让集群中的一个节点遗忘另一个节点。
    • 执行CLUSTER FORGET命令时,需要在集群中的每个节点上分别对要遗忘的节点执行该命令,除了被遗忘节点本身之外。
    • 这是一种底层的操作,需要手动在每个节点上执行。
  2. del-node

    • 这是redis-trib(或者现在更常用的是redis-cli --cluster)工具的一个操作,用于从集群中移除节点。
    • redis-trib中的del-node命令会在内部自动地对集群中的所有其他节点执行CLUSTER FORGET命令,以移除目标节点。
    • 这可以被看作是一种更高层次的,自动化的操作,它简化了移除节点的复杂性,因为你只需运行一次命令,而不是手动到每个节点上去执行CLUSTER FORGET

例如,使用 redis-cli 工具移除集群节点可以像这样操作:

redis-cli --cluster del-node <cluster-node-ip>:<port> <node-id>

这里 <cluster-node-ip>:<port> 是集群中任一可达节点的IP和端口号,而 <node-id> 是需要被移除节点的ID。

所以,CLUSTER FORGET是你需要手动在其他所有节点中对目标节点执行的底层命令,而del-noderedis-tribredis-cli --cluster工具提供的一个自动化命令,它会帮你完成在集群中其他所有节点上执行CLUSTER FORGET的工作。


总结

Redis cluster 集群可以方便的通过集群命令进行节点的添加,槽位的分配,节点的下线操作。

参考:

深入学习Redis(四) Redis高可用之集群;

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

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

相关文章

【数据不完整?用EM算法填补缺失】期望值最大化 EM 算法:睹始知终

期望值最大化算法 EM&#xff1a;睹始知终 算法思想算法推导算法流程E步骤&#xff1a;期望M步骤&#xff1a;最大化陷入局部最优的原因 算法应用高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;问题描述输入输出Python代码实现 算法思想 期望值最大化方法&a…

odoo17 | 用户界面的基本交互

前言 现在我们已经创建了我们的新模型及其 相应的访问权限&#xff0c;是时候了 与用户界面交互。 在本章结束时&#xff0c;我们将创建几个菜单以访问默认列表 和窗体视图。 数据文件 &#xff08;XML&#xff09; Odoo在很大程度上是数据驱动的&#xff0c;因此模块定义的…

桌面天气预报软件 Weather Widget free mac特点介绍

Weather Widget free for Mac多种吸引人的小部件设计可供选择&#xff0c;可以随时了解天气&#xff01;还可以在Dock和菜单栏中为您提供简短的天气预报或当前状况的概述。 Weather Widget free for Mac软件介绍 始终在桌面上使用时尚的天气小部件来随时了解天气&#xff01;多…

团结引擎正式发布,已开放下载

2024年1月1日&#xff0c;Unity 正式发布了针对中国开发者的引擎--团结引擎创世版&#xff0c;现在已经可以开放下载&#xff0c;想体验的小伙伴们可以到官网下载了。 团结引擎是专为中国开发者定制的实时3D引擎&#xff0c;目前是基于Unity 2022LTS版本开发的。团结引擎内置了…

我用 Python 自动生成图文并茂的数据分析报告

reportlab是Python的一个标准库&#xff0c;可以画图、画表格、编辑文字&#xff0c;最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法&#xff1a; 1&#xff09;建立一个空白文档&#xff0c;然后在上面写文字、画图等&#xff1b; 2&#xff09;建…

24、Web攻防——通用漏洞SQL注入MYSQL跨库ACCESS偏移

文章目录 一、SQL注入原理   脚本代码在与数据库进行数据通讯时&#xff08;从数据库取出相关数据进行页面显示&#xff09;&#xff0c;使用预定义的SQL查询语句进行数据查询。能通过参数传递自定义值来实现SQL语句的控制&#xff0c;执行恶意的查询操作&#xff0c;例如查询…

Kali Linux实现UEFI和传统BIOS(Legacy)引导启动

默认Kali linux安装会根据当前启动的引导模式进行安装 例:以UEFI引导启动安装程序,安装后仅能在UEFI引导模式下进入系统 安装Kali系统 这边基于VirtualBox虚拟机镜像实战操作 首先创建一个Kali虚拟机 这里需要注意,把启动 EFI (只针对某些操作系统)选项勾选上,内存、处理器…

TPS5430正负电源模块

TPS5430正负电源模块 Chapter1 TPS5430正负电源模块一、芯片重要参数二、tps5430参考电路讲解以及PCB布局1.正压降压&#xff08;15V转12V&#xff09;2.正压降负压&#xff08;15V转-12V&#xff09; Chapter2 使用tps5430制作正负DC-DC降压电源&#xff0c;tps7a47和tps7a33制…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

微信公众号内网穿透本地调试微信授权

微信公众号内网穿透本地调试一直以来都比较麻烦 怕自己忘记&#xff0c; 记录一下 准备 natapp获取一个域名隧道下载nginx配置微信公众号web网页授权域名 1.natapp获取一个域名隧道 在natapp官网&#xff08;https://natapp.cn/&#xff09;进行注册登录后&#xff0c;进入…

零售业物流这个防漏水技术,居然没有翻车!

随着科技的不断发展&#xff0c;水浸监控系统在各个领域得到了广泛应用。水浸监控不仅仅是为了保护建筑结构和设备&#xff0c;更是为了防范因水灾引起的生命安全和财产损失。 因此&#xff0c;为了有效预防和应对水浸事件&#xff0c;水浸监控系统应运而生&#xff0c;成为各行…

基于决策树、随机森林和层次聚类对帕尔默企鹅数据分析

作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注哦&#x…

c语言-整型在内存的存储

文章目录 前言一、整型数值在内存中的存储1.1 整型数值的表示形式1.2 二进制的表示形式1.3 整数在内存中存储 二、大端字节序存储和小端字节序存储2.1 大端字节序存储2.2 小端字节序存储2.3 练习 总结 前言 本篇文章叙述c语言中整型数据在内存中的存储方式。 一、整型数值在内…

设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式&#xff1f;2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式&#xff1f;3.2. 定义3.3. 代码实现3.4. 主要优点3.5.…

在较高时间周期 这些现货黄金投资法值得一用

以日线图和周线图为代表的较高时间周期&#xff0c;一直是投资者很少利用的。之所以这么说&#xff0c;不是说投资者不会在日线图上分析&#xff0c;而是很少利用日线图交易。一来持仓过夜&#xff0c;会有相关的费用产生。二来很多人做现货黄金以短线为主。其实这种较高的时间…

Windows中磁盘未知没有初始化怎么办?

当我们尝试在Windows11/10/8/7上使用外部硬盘驱动器时&#xff0c;在小概率情况下可能会遇到磁盘未知没有初始化情况&#xff0c;此时如果您进入磁盘管理工具中查看&#xff0c;将会发现您的外部硬盘驱动器显示为未知、未初始化、没有磁盘空间&#xff0c;或者在某些情况下它还…

阿里云服务器8080端口安全组开通图文教程

阿里云服务器8080端口开放在安全组中放行&#xff0c;Tomcat默认使用8080端口&#xff0c;8080端口也用于www代理服务&#xff0c;阿腾云atengyun.com以8080端口为例来详细说下阿里云服务器8080端口开启教程教程&#xff1a; 阿里云服务器8080端口开启教程 阿里云服务器8080端…

Mac 安装 Adobe AE/PS 软件报错 “Failed with error code 146“

文章目录 1. 安装 AE 软件报错2. 网上的方法2.1 删除 caps 文件夹2.2 删除 Adobe Sync 文件夹 3. 我的解决方法 1. 安装 AE 软件报错 我在尝试安装 Adobe AE 软件的时候&#xff0c;报错 “Failed with error code 146” 2. 网上的方法 2.1 删除 caps 文件夹 在 finder 的…

众和策略股市行情分析:股票分红是按持股比例来分的吗?

股票分红立足于同股同利的准则&#xff0c;按股东的持股比例来进行股利的派发分红。持股多的股东按比例所得的分红就多&#xff0c;持股少的股东按比例所得的分红就少。 另外&#xff0c;分红详细是指的股票发行公司分配股利的行为。股利包含股息和盈利&#xff0c;股息是指的…

【Web】CTFSHOW元旦水友赛部分wp

目录 ①easy_include ②easy_web ③easy_login web一共5题&#xff0c;我出了3题&#xff0c;巧的是好像师傅们也只出了3题&#xff0c;跨年拿旗还是很快乐的&#xff0c;下面直接贴出自己的wp. ①easy_include pearcmd不解释 这里主要是 &#xff0c;file://协议支持以fi…