redis分片集群部署运维介绍

一、介绍
之前的文章介绍过redis主从模式(https://www.cnblogs.com/sunjiwei/p/18404951),但是主从模式有个缺点,无法解决大数据量问题,当数据量增加时,只能通过纵向扩节点资源的方法来解决,无法横向扩展节点分片,所以redis从3.0版本开始支持集群模式(redis cluster),该模式可以横向扩展分片节点,使数据分摊到集群中的所有节点,每个节点只存储部分数据,达到分摊压力的效果。

二、cluster模式的三种分片算法
2.1、哈希取余算法

# 原理:
将键(Key)通过哈希函数(如 CRC32)计算出哈希值,再对节点数量取余,结果决定数据存储的节点。
# 公式:
节点索引 = Hash(Key) % 节点数量
# 优缺点:
优点:实现简单,无需额外元数据维护。
缺点:
扩展性差:节点数量变化时(如扩容 / 缩容),需重新计算所有键的位置,导致大规模数据迁移(雪崩效应)。
2.2、一致性哈希算法

# 介绍:一致性哈希算法是在1997年由麻省理工学院提出的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数就不OK了。

# 原理:
哈希环:将整个哈希空间(通常为 0~2^32-1)组织成一个虚拟环。
节点映射:将节点通过哈希函数映射到环上的某个位置。
数据定位:对键计算哈希值,沿环顺时针找到第一个节点,即为存储位置。

# 缺点:
实现复杂度较高,需维护虚拟节点映射表。
可能会有数据分布不均衡的问题。
2.3、哈希槽

这种情况下,数据key不是与节点绑定,而是与槽绑定。redis会根据key的有效部分计算槽位,分两种情况:
• key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
• key中不包含“{}”,整个key都是有效部分
例如:key是name,那么就根据name计算,如果是{china}num,则根据china计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。

# 原理:
固定槽位:将整个哈希空间划分为 16384 个哈希槽(Hash Slot)。
节点分配:每个节点负责一部分哈希槽(如节点 A 负责 0~5460,节点 B 负责 5461~10922)。
数据定位:对键计算哈希值并取模 16384,确定所属槽位,再根据槽位找到对应节点。

# 介绍:Redis Cluster 默认采用此算法,槽位信息在节点间通过 Gossip 协议同步,客户端(如redis-cli,Jedis,Redis-py等)可缓存槽位→节点映射关系,每个节点也保存了完整的槽位→节点映射关系。

# 优点:
扩展性强:新增节点只需从其他节点迁移部分槽位,无需重新计算所有键。
负载均衡:槽位可手动或自动分配,避免数据倾斜。
故障转移简单:槽位可快速迁移至其他节点(如主从切换时)。


# 为什么槽位是16384个,而不是65536个?
# 这个问题在redis作者antirez的github上有介绍过,翻译如下:
(1)如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。
在消息头中最占空间的是myslotS[CLUSTER_SLOTS/8]。 当槽位为65536时,这块的大小是:65536/8/1024=8kb,当槽位为16384时,这块的大小是:16384/8÷=/1024=2kb
因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。

(2)redis的集群主节点数量基本不可能超过1000个。
集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。
因此redis作者不建议redis cluster节点数量超过1000个。那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。

(3)槽位越小,节点少的情况下,压缩比高,容易传输
Redis主节点的配置信息中它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中会对bitmap进行压缩,
但是如果bitmap的填充率slots/n很高的话(N表示节点数),bitmap的压缩率就很低。也就是如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。
三、部署redis集群模式
3.1、集群搭建
# 本示例共六个节点,三个分片,每个分片一主一从
redis安装请见我另外一篇博客:
redis安装:https://www.cnblogs.com/sunjiwei/p/18397893

注意:做集群的节点,配置文件需要开启下面这些参数
cluster-enabled yes   # 开启分片集群模式
cluster-config-file nodes-6379.conf  # 每个节点保存集群元数据的文件,很重要,多个分片节点的该文件不能相互覆盖,要么名字不同,要么路径不同,默认会放在dir参数的目录下
cluster-node-timeout 5000         # 主节点不可用时间达到这个值时触发故障转移,单位毫秒
cluster-replica-validity-factor 10   # 当主节点宕机时,Redis 会检查其从节点的复制延迟(Lag)。如果从节点的复制延迟 ≤ cluster-node-timeout × cluster-replica-validity-factor,则该从节点被认为 “有效”,可以参与故障转移。如果复制延迟超过这个阈值,从节点将被视为 “过时”,不会被选为新主节点
cluster-migration-barrier 1        # 当主节点宕机时,其从节点必须满足 “至少有 N 个健康的从节点” 才会触发故障转移
cluster-require-full-coverage no  # 有分片节点不可用时,允许部分集群运行
cluster-replica-no-failover no     # 主节点不可用时,设置为yes从库不进行failover,设置为no从库进行failover
masterauth 111111                 # 当开启了密码验证时(requirepass)这个参数必须配置,因为创建分片集群时主从是自动创建的,此时如果没有设置这个参数,会导致从库连接主库被拒绝,以至于主库的数据无法复制到从库,而且如果主库宕机,从库也无法自动故障转移

# 下面开始部署集群模式
1、先安装好六个redis节点,不用手动部署成一主一从,创建集群时会自动为主库选择一个从库

2、创建集群
redis-cli -a 111111 --cluster create 127.0.0.1:3379 127.0.0.1:4379 127.0.0.1:5379 127.0.0.1:6379 127.0.0.1:7379 127.0.0.1:8379 --cluster-replicas 1

注意:
1、集群会选择前三个节点作为主节点,所以如果想指定哪三个节点作为主节点要放在前三位。
2、redis-cli --cluster create 命令是redis5.0及以后版本才有的,5.0之前的版本用的是redis-trib.rb 这个命令,这是封装好的脚本,里面有创建集群的命令,感兴趣的自己研究


参数解释:
--cluster 表示是集群
create 后面接节点信息,主从所有节点都要写上
--cluster-replicas  表示每个主节点有几个从节点,如果没有从节点就是0

创建过程输出信息如下:
[redis@iZuf6c0ayfwv04hf5r4wa8Z rediscluster]$ redis-cli -a 111111 --cluster create 127.0.0.1:3379 127.0.0.1:4379 127.0.0.1:5379 127.0.0.1:6379 127.0.0.1:7379 127.0.0.1:8379 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7379 to 127.0.0.1:3379
Adding replica 127.0.0.1:8379 to 127.0.0.1:4379
Adding replica 127.0.0.1:6379 to 127.0.0.1:5379
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379
   slots:[0-5460] (5461 slots) master
M: 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379
   slots:[5461-10922] (5462 slots) master
M: 51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379
   slots:[10923-16383] (5461 slots) master
S: d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379
   replicates 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f
S: 1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379
   replicates 51799b4c0f65fcae8fdb472b9dd98368ec086def
S: 72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379
   replicates 7a824a6b6a1fcede6dfe029a1dd92776a678adab
Can I set the above configuration? (type 'yes' to accept): yes

# 确认以上信息,输入yes就会继续输出以下信息

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 127.0.0.1:3379)
M: 7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379
   slots: (0 slots) slave
   replicates 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f
S: 1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379
   slots: (0 slots) slave
   replicates 51799b4c0f65fcae8fdb472b9dd98368ec086def
S: 72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379
   slots: (0 slots) slave
   replicates 7a824a6b6a1fcede6dfe029a1dd92776a678adab
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


# 连接集群,注意要加-c,这个参数表示连接的是整个集群
redis-cli -a 111111 -c -h 127.0.0.1 -p 3379 

# 执行命令查看分片信息
127.0.0.1:3379> cluster nodes
9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379@14379 master - 0 1749105027000 2 connected 5461-10922
51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379@15379 master - 0 1749105028931 3 connected 10923-16383
d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379@16379 slave 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 0 1749105026927 4 connected
7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379@13379 myself,master - 0 1749105024000 1 connected 0-5460
1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379@17379 slave 51799b4c0f65fcae8fdb472b9dd98368ec086def 0 1749105027929 5 connected
72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379@18379 slave 7a824a6b6a1fcede6dfe029a1dd92776a678adab 0 1749105027000 6 connected

解释:
第一列是每个节点的id,在分片集群中每个节点(主节点和从节点)都会被分配一个id
第二列是节点的ip:port
第三列是节点的角色,表示主节点或从节点,有个myself的,表示是当前连接的节点,因为连接集群虽然加了-c参数,但是还是需要指定-h,表示具体连接哪一个节点
后面的,如果是主节点,最后会有个5461-10922,这个是集群分配给分片节点的槽位数;如果是从节点,它的后面跟的是它对应的主节点的id,这样就知道哪个主节点和哪个从节点是一对主从模式。

解释下-c参数:
-c参数表示连接的是整个集群,但是连接时还是要指定-h,表示连接某个节点,这个-h可以是集群当中的任意一个节点都行,
比如连接的是3379这个节点,同时加了-c参数,如果你请求的key不在这个3379节点上,则会返回一个 MOVED 错误,同时集群会自己重定向到正确的节点上,并返回正确结果,例如下面这样:
127.0.0.1:3379> set name xiaoming
(error) MOVED 5798 127.0.0.1:4379
127.0.0.1:3379> get name
(error) MOVED 5798 127.0.0.1:4379
127.0.0.1:3379> 
我此时连接的是3379这个节点,我执行了set操作,但是name这个key对应的槽位是在4379这个节点上,所以返回一个moved错误给我,但是集群自己又路由到了4379节点上,把key设置成功了。
如果不加-c这个参数,那就只能返回错误,你需要自己再重新连接到4379这个节点上,执行set name xiaoming 这个操作才能成功

3.2、常用的集群查看命令
连接到集群里面,执行cluster help命令可以查看所有的集群相关命令
# 1、查看所有分片信息和槽信息,cluster nodes
127.0.0.1:3379> cluster nodes
9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379@14379 master - 0 1749105078000 2 connected 5461-10922
51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379@15379 master - 0 1749105078031 3 connected 10923-16383
d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379@16379 slave 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 0 1749105076000 4 connected
7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379@13379 myself,master - 0 1749105076000 1 connected 0-5460
1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379@17379 slave 51799b4c0f65fcae8fdb472b9dd98368ec086def 0 1749105077030 5 connected
72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379@18379 slave 7a824a6b6a1fcede6dfe029a1dd92776a678adab 0 1749105079034 6 connected

# 2、查看集群状态
127.0.0.1:3379> cluster info
cluster_state:ok              # 主要是这个,ok表示没问题
cluster_slots_assigned:16384
cluster_slots_ok:16384        # 正常的槽位数
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6         # 集群已知的节点数
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10976
cluster_stats_messages_pong_sent:11042
cluster_stats_messages_sent:22018
cluster_stats_messages_ping_received:11037
cluster_stats_messages_pong_received:10976
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:22018

# 3、对集群进行检查
redis-cli --cluster check 127.0.0.1:3379 -a 111111
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:3379 (7a824a6b...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:4379 (9e3edd22...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:5379 (51799b4c...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:3379)
M: 7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379
   slots: (0 slots) slave
   replicates 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f
S: 1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379
   slots: (0 slots) slave
   replicates 51799b4c0f65fcae8fdb472b9dd98368ec086def
S: 72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379
   slots: (0 slots) slave
   replicates 7a824a6b6a1fcede6dfe029a1dd92776a678adab
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

四、运维管理分片集群
redis-cli --cluster help 这个帮助命令可以查看有关集群的所有命令
4.1、添加节点
# 命令
redis-cli -a 密码 --cluster add-node \
  <new_node_ip>:<new_node_port> <existing_node_ip>:<existing_node_port> \
  --cluster-slave --cluster-master-id <master_id>  # 若为从节点,指定主节点ID

解释:
--cluster-slave --cluster-master-id <master_id>是加从节点才需要,
<existing_node_ip>:<existing_node_port>是集群中任一节点都可
-a 是密码参数,如果集群没开启密码验证是不需要这个参数的

# 例1:添加主节点分片
先部署一个redis节点,然后执行以下命令添加节点进集群:
redis-cli -a 111111 --cluster add-node 127.0.0.1:1379 127.0.0.1:3379 

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 127.0.0.1:1379 to cluster 127.0.0.1:3379
>>> Performing Cluster Check (using node 127.0.0.1:3379)
M: 7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379
   slots: (0 slots) slave
   replicates 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f
S: 1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379
   slots: (0 slots) slave
   replicates 51799b4c0f65fcae8fdb472b9dd98368ec086def
S: 72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379
   slots: (0 slots) slave
   replicates 7a824a6b6a1fcede6dfe029a1dd92776a678adab
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:1379 to make it join the cluster.
[OK] New node added correctly.

可以看到添加分片节点成功了,但是槽位并没有自动重新分配,新加入的节点是没有哈希槽的现在,执行以下命令也可以查看
[redis@iZuf6c0ayfwv04hf5r4wa8Z rediscluster]$ redis-cli -h 127.0.0.1 -p 3379 -a 111111 -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:3379> 
127.0.0.1:3379> cluster nodes
d03c062e01e070abc91fc8cc6591dde0e1ff1c98 127.0.0.1:1379@11379 master - 0 1749108199142 0 connected
9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379@14379 master - 0 1749108197000 2 connected 5461-10922
51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379@15379 master - 0 1749108197138 3 connected 10923-16383
d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379@16379 slave 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 0 1749108198000 4 connected
7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379@13379 myself,master - 0 1749108194000 1 connected 0-5460
1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379@17379 slave 51799b4c0f65fcae8fdb472b9dd98368ec086def 0 1749108198140 5 connected
72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379@18379 slave 7a824a6b6a1fcede6dfe029a1dd92776a678adab 0 1749108197000 6 connected

可以看到新加入的节点最后是没有槽位信息的,所以添加完主节点分片后,还需要重新让集群rebalance槽位,可以执行以下命令:
redis-cli --cluster rebalance \
host:port    # 集群当中任一节点都可 
--cluster-use-empty-masters     # 允许将槽位分配给空的主节点(默认情况下会跳过没有槽位的主节点)
--cluster-pipeline <arg>    # 设置批量迁移的键数量,默认为 10
--cluster-threshold <arg>   # 各节点槽位数差异超过这个阈值才会进行rebanlance,默认值2%
--cluster-simulate    # 模拟执行,会打印一些信息,不会真正执行

开始执行rebanlance命令:
redis-cli -a 111111 --cluster rebalance 127.0.0.1:3379 --cluster-use-empty-masters
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 127.0.0.1:3379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 4 nodes. Total weight = 4.00
Moving 1366 slots from 127.0.0.1:4379 to 127.0.0.1:1379
#############################################################
Moving 1365 slots from 127.0.0.1:5379 to 127.0.0.1:1379
#############################################################
Moving 1365 slots from 127.0.0.1:3379 to 127.0.0.1:1379
#############################################################

进入到集群当中执行cluster nodes查看槽位信息:
127.0.0.1:3379> cluster nodes    # rebalance前的
d03c062e01e070abc91fc8cc6591dde0e1ff1c98 127.0.0.1:1379@11379 master - 0 1749110604860 0 connected
9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379@14379 master - 0 1749110605861 2 connected 5461-10922
51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379@15379 master - 0 1749110605000 3 connected 10923-16383
d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379@16379 slave 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 0 1749110604000 4 connected
7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379@13379 myself,master - 0 1749110603000 1 connected 0-5460
1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379@17379 slave 51799b4c0f65fcae8fdb472b9dd98368ec086def 0 1749110606863 5 connected
72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379@18379 slave 7a824a6b6a1fcede6dfe029a1dd92776a678adab 0 1749110602857 6 connected



127.0.0.1:3379> cluster nodes    # rebalance后的
d03c062e01e070abc91fc8cc6591dde0e1ff1c98 127.0.0.1:1379@11379 master - 0 1749110901494 7 connected 0-1364 5461-6826 10923-12287
9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379@14379 master - 0 1749110899489 2 connected 6827-10922
51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379@15379 master - 0 1749110899000 3 connected 12288-16383
d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379@16379 slave 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 0 1749110900000 4 connected
7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379@13379 myself,master - 0 1749110897000 1 connected 1365-5460
1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379@17379 slave 51799b4c0f65fcae8fdb472b9dd98368ec086def 0 1749110899000 5 connected
72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379@18379 slave 7a824a6b6a1fcede6dfe029a1dd92776a678adab 0 1749110900492 6 connected





# 例2:给主节点添加从节点
先执行cluster nodes 命令查看主节点id
127.0.0.1:3379> cluster nodes
d03c062e01e070abc91fc8cc6591dde0e1ff1c98 127.0.0.1:1379@11379 master - 0 1749110604860 0 connected

在执行添加从节点的命令:
redis-cli -a 111111 --cluster add-node 127.0.0.1:9379 127.0.0.1:3379 --cluster-slave --cluster-master-id d03c062e01e070abc91fc8cc6591dde0e1ff1c98 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 127.0.0.1:9379 to cluster 127.0.0.1:3379
>>> Performing Cluster Check (using node 127.0.0.1:3379)
M: 7a824a6b6a1fcede6dfe029a1dd92776a678adab 127.0.0.1:3379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: d03c062e01e070abc91fc8cc6591dde0e1ff1c98 127.0.0.1:1379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f 127.0.0.1:4379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
M: 51799b4c0f65fcae8fdb472b9dd98368ec086def 127.0.0.1:5379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
S: d65076cd476b217af690cf750b7b5a3429bd9160 127.0.0.1:6379
   slots: (0 slots) slave
   replicates 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f
S: 1164223bb145f848a7b17870d020296c64791a77 127.0.0.1:7379
   slots: (0 slots) slave
   replicates 51799b4c0f65fcae8fdb472b9dd98368ec086def
S: 72b0b19fc0db64ce9b1f3d4728975e20d988e3dc 127.0.0.1:8379
   slots: (0 slots) slave
   replicates 7a824a6b6a1fcede6dfe029a1dd92776a678adab
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:9379 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 127.0.0.1:1379.
[OK] New node added correctly.


可以看到加入成功了,此时再到集群中执行cluster nodes命令即可看到从库信息了
4.2、reshard命令
reshard命令是从指定分片节点当中迁移固定的槽位到另一个分片节点中。

命令:
redis-cli -a 密码 --cluster reshard \
host:port
--cluster-from <arg>   # 源分片节点id
--cluster-to <arg>     # 目标分片节点id
--cluster-slots <arg>  # 指定要迁移的槽位数量
--cluster-yes          # 自动确认,直接迁移,不需要手动确认了
--cluster-pipeline <arg> # 设置批量迁移的键数量,默认为 10
 
例如:
redis-cli -a 111111 --cluster reshard 127.0.0.1:3379 --cluster-from 9e3edd22d05dafcb9b67fb6ab4ea2de6de0c411f --cluster-to d03c062e01e070abc91fc8cc6591dde0e1ff1c98 --cluster-slots 1000 

执行这个命令后集群会输出所有迁移的槽位信息让你确认,输入yes确认后 开始迁移
4.3、删除节点
redis-cli -a 密码 --cluster del-node host:port node_id
注意:如果删除的是主节点,需要先把对应的从节点删除,然后再把主节点上的槽位迁移走,再删除主节点,否则主节点上的数据会全部没了

redis-cli -a 111111 --cluster del-node 127.0.0.1:3379 d649f3274dc32c40e5d999aaa6f61faea236f78e
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node d649f3274dc32c40e5d999aaa6f61faea236f78e from cluster 127.0.0.1:3379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

注意:不能先把节点关闭,然后在删除,这样会报错找不到这个节点,要节点存活的情况下直接删除节点即可。此时节点会被删除并关闭
4.4、cluster failover
故障转移分为手动故障转移和自动故障转移,
自动故障转移就是当其中一个主节点分片不可用时,其对应的从节点会自动提升为主节点,当把原来的主节点拉起后,其会作为从节点自动加入集群。

手动故障转移需要人为的执行命令把从节点提升为主节点,语法如下:
redis-cli -a 密码 -c -h [从节点IP] -p [从节点端口] CLUSTER FAILOVER FORCE

例:
redis-cli -a 111111 -c -h 127.0.0.1 -p 6379 CLUSTER FAILOVER force
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK

参考文档:
https://developer.aliyun.com/article/1492555

posted @ 2025-06-05 17:22  有形无形  阅读(147)  评论(0)    收藏  举报