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