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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【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个哈希槽都被分配到了节点上。

相关文章
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
317 2
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
333 5
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
3月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
1月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
2月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
189 1
Redis专题-实战篇二-商户查询缓存
|
1月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
6月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
951 0
|
2月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
下一篇
oss云网关配置