【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. 使用以下命令将从节点添加到集群:

    bash 复制代码
    /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. 迁移主节点上的数据:首先,连接到要删除的主节点,可以使用以下命令连接到指定的主节点:

    css 复制代码
    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx

    然后,执行以下命令将主节点的数据迁移到其他主节点:

    ruby 复制代码
    10.0.0.70:6383> cluster replicate f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad

    这将把主节点的数据迁移到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>

      使用上述命令将从节点分配给其他主节点或进行删除操作。

  3. 迁移哈希槽(槽):使用以下命令进行迁移操作,将主节点上的哈希槽(槽)分配到其他主节点上,以保持集群的完整性:

    csharp 复制代码
    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb reshard <待迁移哈希槽的主节点IP:端口号>

    程序会提示您输入迁移的哈希槽数量和接收哈希槽的主节点ID,按照提示进行操作即可。

  4. 删除主节点:一旦完成数据迁移和哈希槽迁移操作,就可以删除主节点了。使用以下命令连接到要删除的主节点并执行删除操作:

    css 复制代码
    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node <待删除主节点的IP:端口号> <待删除主节点的ID>

    执行上述命令后,主节点将被成功删除。

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

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

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个哈希槽都被分配到了节点上。

相关推荐
聪明的墨菲特i几秒前
Django前后端分离基本流程
后端·python·django·web3
明达技术42 分钟前
物联优化汽车齿轮锻造
分布式·物联网
hlsd#1 小时前
go mod 依赖管理
开发语言·后端·golang
陈大爷(有低保)1 小时前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、1 小时前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头1 小时前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
编程、小哥哥1 小时前
设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)
redis·设计模式·抽象工厂模式
2401_857439691 小时前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话