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

2023年 8月 9日 40.3k 0

Cluster XX的集群指令(扩展)

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

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

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

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

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

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

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

写入记录

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

[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,要进行主备切换,您需要先登录到备节点,然后在备节点上执行切换到主节点的命令。

[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客户端。在退出客户端后,可以按照以下命令使用该工具:

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

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

新加入slave节点

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

  • 首先,通过运行命令redis-cli并使用cluster node命令查看主节点的ID(用于替换"主节点的id")。

  • 然后,退出redis-cli客户端。

  • 使用以下命令将从节点添加到集群:

    /redis所在目录/src/redis-trib.rb add-node --slave --master-id 主节点的id 新节点ip:端口号 集群中任意节点ip:端口号
    
  • 在上述命令中,将"新节点ip"替换为要添加的从节点的IP地址,将"端口号"替换为对应的端口号,将"主节点的id"替换为主节点的实际ID,将"集群中任意节点ip"替换为已存在的集群中的任意一个节点的IP地址和端口号。

    [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实例上,可以使用以下命令:

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

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

    cluster replicate 8c6534cbfbd2b5453ab4c90c7724a75d55011c27
    

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

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

    cluster nodes
    

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

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

    分配哈希槽

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

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

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

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

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

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

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

    cluster nodes
    

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

    删除从节点

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

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

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

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

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

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

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

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

    删除主节点

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

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

  • 迁移主节点上的数据:首先,连接到要删除的主节点,可以使用以下命令连接到指定的主节点:

    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-cli -h x.x.x.x -p xxxx
    

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

    10.0.0.70:6383> cluster replicate f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad
    

    这将把主节点的数据迁移到ID为f1f6e93e625e8e0cef0da1b3dfe0a1ea8191a1ad的主节点上。

  • 处理主节点下的从节点:如果主节点下存在从节点,需要将这些从节点分配给其他主节点或进行删除操作。

    • 如果要分配给其他主节点,可以使用以下命令连接到主节点并执行相应的操作:

      [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
      

      然后根据需要,将从节点分配给其他主节点或删除。

    • 如果要删除从节点,可以使用以下命令连接到其他主节点并执行删除操作:

      [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node  
      

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

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

    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb reshard 
    

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

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

    [root@mysql-db01 ~]# /data/redis-x.x.x/src/redis-trib.rb del-node  
    

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

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

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

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

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

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

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

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

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

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论