【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)

Cluster XX的集群指令(扩展)

下面是对Redis集群扩展的指令:

  • cluster myid:用于获取当前节点的ID。

该指令返回节点的ID。在Redis集群中,每个节点都有一个唯一的ID,通过该指令可以获取当前节点的ID。这个ID在集群中具有重要的作用,例如在进行节点之间的通信时进行鉴权。

  • cluster slots:用于获取当前节点负责的槽信息。

该指令用于返回节点负责的槽(slot)信息。在Redis集群中,数据通过哈希槽的方式进行分片存储,每个槽代表一个指定范围的数据,每个节点负责管理一部分槽。通过该指令可以获取当前节点负责管理的槽的信息,包括槽的起始和结束范围以及负责该槽的主节点和从节点信息。

  • cluster reset:用于重置Redis集群的状态,慎用,可能导致数据丢失和系统不可用。

该指令用于重置Redis集群。这个指令的作用比较危险,它会重置整个集群的状态,并清除所有的节点信息和槽分配信息。因此,使用该指令需要非常谨慎,因为重置集群可能导致数据丢失和系统不可用。一般情况下,只有在出现集群状态混乱或需要重新搭建集群时才会使用该指令。

写入记录

只有拥有哈希槽的节点才能存储数据,因此只有主节点才有写入数据的权限。

bash

复制代码

[root src]# redis-cli -h xx.xx.xx.xx -p 6380
xx.xx.xx.xx:xxxx> get key
(nil)
xx.xx.xx.xx:xxxx> set key  123
OK

主节点和备节点切换-CLUSTER FAILOVER

在需要的slaves节点上执行命令:CLUSTER FAILOVER,要进行主备切换,您需要先登录到备节点,然后在备节点上执行切换到主节点的命令。

bash

复制代码

[root ~]# /data/redis-x.x.x/src/redis-cli -h xx.xx.xx.xx -p xxxx
xx.xx.xx.xx:xxxx> cluster failover
(error) ERR You should send CLUSTER FAILOVER to a slave
xx.xx.xx.xx:xxxx> exit
[root ~]# /data/redis-x.x.x/src/redis-cli -h xx.xx.xx.xx -p xxxx2
xx.xx.xx.xx:xxxx2> cluster failover     ##切换到主节点
OK
xx.xx.xx.xx:xxxx> cluster nodes
777c9eab94812d13d8b9dc768460dcf1316283f1 xx.xx.xx.xx:xxxx slave c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c 0 1511223574993 6 connected
92dfe8ab12c47980dcc42508672de62bae4921b1 xx.xx.xx.xx:xxxx2 myself,master - 0 0 8 connected 500-5460
2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx slave 92dfe8ab12c47980dcc42508672de62bae4921b1 0 1511223577007 8 connected

新加入master节点

Redis实例添加到集群之前,请务必确保该Redis实例没有存储过任何数据,并且没有持久化的数据文件,否则在添加过程中会出现错误,为了进行节点的维护操作,您需要使用redis-trib.rb工具而不是redis-cli客户端。在退出客户端后,可以按照以下命令使用该工具:

bash

复制代码

/redis所在目录/src/redis-trib.rb add-node 新节点ip:端口号 集群中任意节点ip:端口号

如果您需要添加新的Redis节点到集群中,请将"新节点ip"替换为要添加的Redis节点的IP地址,将"端口号"替换为对应的端口号,并将"集群中任意节点ip"替换为已存在的集群中的任意一个节点的IP地址和端口号。

新加入slave节点

添加从节点到集群的操作可以按照以下步骤进行:

  1. 首先,通过运行命令redis-cli并使用cluster node命令查看主节点的ID(用于替换"主节点的id")。
  2. 然后,退出redis-cli客户端。
  3. 使用以下命令将从节点添加到集群:
  4. bash
  5. 复制代码
/redis所在目录/src/redis-trib.rb add-node --slave --master-id 主节点的id 新节点ip:端口号 集群中任意节点ip:端口号

在上述命令中,将"新节点ip"替换为要添加的从节点的IP地址,将"端口号"替换为对应的端口号,将"主节点的id"替换为主节点的实际ID,将"集群中任意节点ip"替换为已存在的集群中的任意一个节点的IP地址和端口号。

bash

复制代码

[root@xxxx~]# /data/redis-x.x.x/src/redis-trib.rb add-node xx.xx.xx.xx:xxxx1 xx.xx.xx.xx:xxxx2
>>> Adding node xx.xx.xx.xx:xxxx1 to cluster xx.xx.xx.xx:xxxx2
>>> Performing Cluster Check (using node xx.xx.xx.xx:xxxx1)
M: c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c xx.xx.xx.xx:xxxx1
   slots:500-5460,15464-16383 (5881 slots) master
   2 additional replica(s)
S: 2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx2
   slots: (0 slots) slave
   replicates c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c
M: 2da5edfcbb1abc2ed799789cb529309c70cb769e xx.xx.xx.xx:xxxx1
   slots:0-499,5461-15463 (10503 slots) master
   1 additional replica(s)
S: c0e1784f0359f986972c1f9a0d9788f3d69e6c99 xx.xx.xx.xx:xxxx2
   slots: (0 slots) slave
   replicates 2da5edfcbb1abc2ed799789cb529309c70cb769e
S: 777c9eab94812d13d8b9dc768460dcf1316283f1 xx.xx.xx.xx:xxxx4
   slots: (0 slots) slave
   replicates c93b6d1edd6bc4c69d48f9f49e75c2c7f0d1a70c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node xx.xx.xx.xx:xxxx1 to make it join the cluster.
[OK] New node added correctly.

为slave节点重新分配master

首先,登录到需要设置为新的从节点的Redis实例上,可以使用以下命令:

bash

复制代码

/data/redis-xxxx/src/redis-cli -h xx.xx.xx.xx -p xxxx

然后,在Redis命令行界面上执行以下命令:

bash

复制代码

cluster replicate 8c6534cbfbd2b5453ab4c90c7724a75d55011c27

上述命令中的"8c6534cbfbd2b5453ab4c90c7724a75d55011c27"是新的主节点的ID,将其替换为实际的ID。

执行完以上命令后,继续执行以下命令:

复制代码

cluster nodes

确认节点配置已更新,输出结果应包含类似如下内容:

bash

复制代码

2f003cfd139ae4f2bbdac40b0055b46bdff96e0a xx.xx.xx.xx:xxxx myself,slave 8c6534cbfbd2b5453ab4c90c7724a75d55011c27 0 0 1 connected

分配哈希槽

reshard是redis cluster的核心功能,它通过迁移哈希槽来达到负载匀衡和可扩展目的。进入Redis所在目录,并使用以下命令来执行reshard操作:

bash

复制代码

/src/redis-trib.rb reshard 新节点ip:端口号

其中,"新节点ip:端口号"需要替换为实际的新节点的IP地址和端口号。执行以上命令后,会询问您要借用多少个哈希槽来分配给新的主节点。您可以根据需求输入一个合适的数值,例如我们填入1000。

接下来,会要求您输入新节点的ID(即新的主节点的ID),您需要输入刚创建的节点的ID,即"ip:port"。

然后,会要求您输入源节点。如果您想从所有节点中随机选取一部分哈希槽分配给新节点,您可以输入"all",否则可以输入具体的源节点。

完成以上步骤后,Redis集群会开始移动哈希槽,并显示相应的状态提示。

移动完成后,您可以进入Redis客户端,并执行以下命令:

bash

复制代码

cluster nodes

通过执行以上命令,您可以查看集群节点的状态,确认新添加的节点已成功分配了哈希槽。

删除从节点

删除节点可以分为两种情况:主节点和从节点。对于从节点,由于没有分配哈希槽,因此删除操作非常简单,只需执行以下命令:

bash

复制代码

/redis所在目录/src/redis-trib.rb del-node 从节点ip:从节点端口号 从节点的id号

例如,删除主节点IP为xxxxxxxx,端口号为6381,ID为d14e2f0538dc6925f04d1197b57f44ccdb7c683a的从节点,可以执行以下命令:

bash

复制代码

[root@mysql-db01 src]# /data/redis-xxxx/src/redis-trib.rb del-node xxxxxx:6381 d14e2f0538dc6925f04d1197b57f44ccdb7c683a

执行以上命令后,将从集群中移除节点,并发送CLUSTER FORGET消息到集群中的其他节点,最后关闭该节点。

同样地,删除主节点IP为xxxxxxx,端口号为6384,ID为e2cfd53b8083539d1a4546777d0a81b036ddd82a的从节点,可以执行以下命令:

bash

复制代码

[root@mysql-db01 src]# /data/redis-xxxx/src/redis-trib.rb del-node xxxxxxx:6384 e2cfd53b8083539d1a4546777d0a81b036ddd82a

执行以上命令后,同样会将节点从集群中移除,并发送CLUSTER FORGET消息到集群中的其他节点,最后关闭该节点。

删除主节点

在删除主节点之前,需要进行一些数据迁移操作,并将该节点上的哈希槽分配给其他主节点。同时,在删除主节点时,如果该主节点下还有从节点,需要将从节点分配给其他主节点或进行删除操作。

如果主节点下有从节点,需要将从节点分配给其他主节点或删除。

  1. 迁移主节点上的数据:首先,连接到要删除的主节点,可以使用以下命令连接到指定的主节点:
  2. css
  3. 复制代码
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx
  1. 然后,执行以下命令将主节点的数据迁移到其他主节点:
  2. ruby
  3. 复制代码
10.0.0.70:6383> cluster replicate f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad
  1. 这将把主节点的数据迁移到ID为f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad的主节点上。
  2. 处理主节点下的从节点:如果主节点下存在从节点,需要将这些从节点分配给其他主节点或进行删除操作。
  • 如果要分配给其他主节点,可以使用以下命令连接到主节点并执行相应的操作:
  • css
  • 复制代码
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx
x.x.x.x:xxxx> cluster nodes
  • 然后根据需要,将从节点分配给其他主节点或删除。
  • 如果要删除从节点,可以使用以下命令连接到其他主节点并执行删除操作:
  • css
  • 复制代码
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node <主节点IP:端口号> <从节点ID>
  • 使用上述命令将从节点分配给其他主节点或进行删除操作。
  1. 迁移哈希槽(槽):使用以下命令进行迁移操作,将主节点上的哈希槽(槽)分配到其他主节点上,以保持集群的完整性:
  2. csharp
  3. 复制代码
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb reshard <待迁移哈希槽的主节点IP:端口号>
  1. 程序会提示您输入迁移的哈希槽数量和接收哈希槽的主节点ID,按照提示进行操作即可。
  2. 删除主节点:一旦完成数据迁移和哈希槽迁移操作,就可以删除主节点了。使用以下命令连接到要删除的主节点并执行删除操作:
  3. css
  4. 复制代码
[root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node <待删除主节点的IP:端口号> <待删除主节点的ID>
  1. 执行上述命令后,主节点将被成功删除。

检查集群所有节点是否正常

要检查集群中任意节点的状态,可以使用以下命令:

bash

复制代码

/redis所在目录/src/redis-trib.rb check 集群任意节点ip:节点端口号

例如,在节点IP为x.x.x.x,端口号为xxxx的节点上执行集群检查,可以执行以下命令:

bash

复制代码

[root@mysql-db01 ~]# /data/redis-xxx.xxx.xxx.xxx/src/redis-trib.rb check x.x.x.x:xxxx

执行以上命令后,会进行集群检查并输出集群状态信息,包括主节点(带有M标记)和从节点(带有S标记)的具体信息,以及每个节点的哈希槽分配情况。

同时,还会对集群进行一些检查,包括:

  • 检查所有节点是否对哈希槽配置达成一致;
  • 检查是否所有的16384个哈希槽都被分配到节点上。

在以上示例中,集群检查结果显示所有节点对于哈希槽的配置达成一致,且所有16384个哈希槽都被分配到了节点上。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
52 4
|
3月前
|
NoSQL Redis Windows
windows服务器重装系统之后,Redis服务如何恢复?
windows服务器重装系统之后,Redis服务如何恢复?
75 6
|
19天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
28 5
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
92 5
|
2月前
|
移动开发 NoSQL 网络协议
Redis 管道技术
10月更文挑战第21天
26 3
|
2月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
132 2
|
2月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
115 3
|
2月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
45 2
|
3月前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
3月前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
80 2