Redis集群管理

一、Redis cluster 分布式集群

1.什么是Redis cluster

1.Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。
2.Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。
3.Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法4.Redis集群有将数据自动切分(split)到多个节点的能力。

2.redis cluster的特点

1.解决了redis资源利用率的问题
2.在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
2.存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
3.根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
5.在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

3.槽的概念

1.集群中,所有节点一共拥有16384个槽位
2.槽位的序号是 0 - 16383 ,序号不重要,槽位的数量才重要
3.每一个槽位获取数据的几率是一样的

4.Redis Cluster故障转移

1.在集群里面,节点会对其他节点进行下线检测。
2.当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移。
3.换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能。
4.因为 Sentinel 是一个独立运行的监控程序,而集群的下线检测和故障转移等功能是集成在节点里面的,它们的运行模式非常地不同,所以尽管这两者的功能很相似,但集群的实现没有重用 Sentinel 的代码。

二、Redis cluster 分布式集群搭建

1.环境准备

节点 主机 IP 端口
节点1 db01 10.0.0.51 6379,6380
节点2 db02 10.0.0.52 6379,6380
节点3 db03 10.0.0.53 6379,6380

2.创建多节点目录

#删除原多实例
[root@db01 ~]# rm -rf /server/redis/*
[root@db02 ~]# rm -rf /server/redis/*
[root@db03 ~]# rm -rf /server/redis/*

#重新创建目录
[root@db01 ~]# mkdir /server/redis/{6379,6380}
[root@db02 ~]# mkdir /server/redis/{6379,6380}
[root@db03 ~]# mkdir /server/redis/{6379,6380}

3.配置redis

[root@db01 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000


[root@db02 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.52 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db03 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.53 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

#配置副本redis
[root@db01 ~]# vim /server/redis/6380/redis.conf
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6380
pidfile "/server/redis/6380/redis.pid"
logfile "/server/redis/6380/redis.log"
protected-mode no
dir "/server/redis/6380"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db02 ~]# vim /server/redis/6380/redis.conf
daemonize yes
bind 172.16.1.52 127.0.0.1
port 6380
pidfile "/server/redis/6380/redis.pid"
logfile "/server/redis/6380/redis.log"
protected-mode no
dir "/server/redis/6380"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db02 ~]# vim /server/redis/6380/redis.conf
daemonize yes
bind 172.16.1.53 127.0.0.1
port 6380
pidfile "/server/redis/6380/redis.pid"
logfile "/server/redis/6380/redis.log"
protected-mode no
dir "/server/redis/6380"
#masterauth 123       #配置集群密码
#requirepass 123
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

4.启动所有节点的redis

[root@db01 ~]# redis-server /server/redis/6379/redis.conf
[root@db02 ~]# redis-server /server/redis/6379/redis.conf
[root@db03 ~]# redis-server /server/redis/6379/redis.conf

[root@db01 ~]# redis-server /server/redis/6380/redis.conf
[root@db02 ~]# redis-server /server/redis/6380/redis.conf
[root@db03 ~]# redis-server /server/redis/6380/redis.conf

#检查启动
[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      15593/redis-server
tcp        0      0 172.16.1.51:6379        0.0.0.0:*               LISTEN      15593/redis-server
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      18602/redis-server
tcp        0      0 172.16.1.51:6380        0.0.0.0:*               LISTEN      18602/redis-server

5.关联所有节点

#查看所有机器redis节点信息,此时所有机器集群中都只有自己一个节点
127.0.0.1:6380> CLUSTER NODES
1cc8546c6bd57ca54659418c28bf589cb8b3cdba :6380 myself,master - 0 0 0 connected

#关联所有节点
127.0.0.1:6380> CLUSTER MEET 172.16.1.52 6379
OK
#不论在哪台机器执行,集群中其他节点都可以认识新节点
127.0.0.1:6380> CLUSTER NODES
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594343695689 0 connected
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594343696193 5 connected
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 master - 0 1594343695183 1 connected
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 master - 0 1594343694982 4 connected
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594343694176 2 connected
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 myself,master - 0 0 3 connected
127.0.0.1:6380> 

#查看集群状态
127.0.0.1:6379> CLUSTER info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:164579
cluster_stats_messages_received:164579
127.0.0.1:6379> 

6.分配槽位

#节点槽位分配
第一个节点 db01:		0 - 5460       5461个槽位
第二个节点 db02:		5461 - 10922   5462个槽位
第三个节点 db03:		10923 - 16383  5461个槽位

#分配槽位,如果在redis中,只能一个一个分配槽位
127.0.0.1:6379> CLUSTER ADDSLOTS 0
OK
127.0.0.1:6379> CLUSTER ADDSLOTS 1
OK
#在命令行可以批量分配
[root@db01 ~]# 
[root@db01 ~]# 
[root@db01 ~]# redis-cli -p 6379 CLUSTER ADDSLOTS {2..5460}
OK
[root@db02 ~]# redis-cli -p 6379 CLUSTER ADDSLOTS {5461..10922}
OK
[root@db03 ~]# redis-cli -p 6379 CLUSTER ADDSLOTS {10923..16383}
OK

#查看槽位分配
127.0.0.1:6379> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594344707485 2 connected 5461-10922
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 master - 0 1594344705479 3 connected
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5460
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594344705970 5 connected
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 master - 0 1594344706477 4 connected
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594344706477 0 connected 10923-16383
#查看集群状态
127.0.0.1:6379> CLUSTER INFO
cluster_state: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:5
cluster_my_epoch:1
cluster_stats_messages_sent:167782
cluster_stats_messages_received:167782

7.测试插入数据

#插入一条数据,报错
172.16.1.51:6379> set k1 v1
(error) MOVED 12706 172.16.1.53:6379		#报错:该key只能插入数据到12706槽位
#换一个值可以
172.16.1.51:6379> set k2 v2
OK

#切换到槽位所在节点插入数据
[root@db01 ~]# redis-cli -h 172.16.1.53 -p 6379
172.16.1.53:6379> set k1 v1
OK

#使用ASK协议连接,插入数据
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379 -c
172.16.1.51:6379> set k1 v1
-> Redirected to slot [12706] located at 172.16.1.53:6379
OK

#大量数据插入测试
[root@db01 ~]# for i in {1..10000};do redis-cli -p 6379 -h 172.16.1.51 -c set k_${i} v_${i};done

#查看数据是否平均
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
172.16.1.51:6379> DBSIZE
(integer) 3347
[root@db01 ~]# redis-cli -h 172.16.1.52 -p 6379
172.16.1.52:6379> DBSIZE
(integer) 3317
[root@db01 ~]# redis-cli -h 172.16.1.53 -p 6379
172.16.1.53:6379> DBSIZE
(integer) 3343

8.将副本加入集群(做主从)

#查看节点状态
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
172.16.1.51:6379> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594347511554 2 connected 5461-10922
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 master - 0 1594347510553 3 connected
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5460
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594347511050 5 connected
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 master - 0 1594347509538 4 connected
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594347510043 0 connected 10923-16383

#规划从库
172.16.1.51 6380    是 172.16.1.52 6379 的从库
172.16.1.52 6380    是 172.16.1.53 6379 的从库
172.16.1.53 6380    是 172.16.1.51 6379 的从库

#分配从库
[root@db01 ~]# redis-cli -p 6380 -h 172.16.1.51
172.16.1.51:6380> CLUSTER REPLICATE 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2
OK
172.16.1.52:6380> CLUSTER REPLICATE fd8dfff8331d493e35324580d35a4ec39c0bd39f
OK
[root@db03 ~]# redis-cli -p 6380 -h 172.16.1.53
172.16.1.53:6380> CLUSTER REPLICATE 12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0
OK

#查看集群主从状态
172.16.1.51:6379> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594348232192 2 connected 5461-10922

1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 0 1594348231187 3 connected

12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5460

df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 slave 12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 0 1594348233204 5 connected

c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594348231689 4 connected

fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594348232695 0 connected 10923-16383

9.错误演示

#停掉一台机器的所有redis
[root@db01 ~]# redis-cli -p 6379 shutdown
[root@db01 ~]# redis-cli -p 6380 shutdown

#到另一台机器查看集群状态
172.16.1.52:6379> CLUSTER NODES
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594348466336 6 connected 0-5460
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 master,fail - 1594348365644 1594348363122 1 disconnected
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594348466335 4 connected
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 myself,master - 0 0 2 connected 5461-10922
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594348467348 0 connected 10923-16383
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave,fail 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 1594348365644 1594348365138 3 disconnected

10.恢复节点

#恢复redis
[root@db01 ~]# redis-server /server/redis/6379/redis.conf 
[root@db01 ~]# redis-server /server/redis/6380/redis.conf

#查看集群状态,恢复的节点主动变成从库,直到下次主库故障
172.16.1.52:6379> CLUSTER NODES
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594348537278 6 connected 0-5460
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 slave df20862e40a495fb4c7c03362a4d0e2f64a072f5 0 1594348535762 6 connected
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594348536669 4 connected
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 myself,master - 0 0 2 connected 5461-10922
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594348536770 0 connected 10923-16383
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 0 1594348537789 3 connected

三、Redis Cluster 集群管理操作(核心)

1.安装集群插件

#EPEL源安装ruby支持
[root@db01 ~]# yum install ruby rubygems -y

#查看gem源
[root@db01 ~]# gem sources -l
*** CURRENT SOURCES ***

http://rubygems.org/
#添加阿里云的gem源
[root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources 
#删除国外gem源
[root@db01 ~]# gem sources  --remove https://rubygems.org/
http://rubygems.org/ removed from sources
#再次查看gem源
[root@db01 ~]# gem sources -l
#使用gem安装redis的ruby插件
[root@db01 ~]# gem install redis -v 3.3.3
Successfully installed redis-3.3.3
1 gem installed
Installing ri documentation for redis-3.3.3...
Installing RDoc documentation for redis-3.3.3...

2.工具参数

[root@db01 ~]# redis-trib.rb
1.create       #创建集群
2.check        #检查集群状态
3.info         #集群信息
4.fix          #修复集群
5.reshard      #迁移槽位
6.rebalance    #平衡槽位数量
7.add-node	   #添加节点
8.del-node     #删除节点	
9.set-timeout  #设置超时时间
10.call        #集群中机器批量执行命令
11.import      #导入redis数据

3.添加节点

1)配置两个实例

[root@db03 ~]# cat /server/redis/6382/redis.conf 
daemonize yes
bind 172.16.1.53 127.0.0.1
port 6382
pidfile "/server/redis/6382/redis.pid"
logfile "/server/redis/6382/redis.log"
protected-mode no
dir "/server/redis/6382"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db03 ~]# cat /server/redis/6381/redis.conf 
daemonize yes
bind 172.16.1.53 127.0.0.1
port 6381
pidfile "/server/redis/6381/redis.pid"
logfile "/server/redis/6381/redis.log"
protected-mode no
dir "/server/redis/6381"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

2)启动新节点

[root@db03 ~]# redis-server /server/redis/6381/redis.conf 
[root@db03 ~]# redis-server /server/redis/6382/redis.conf

3)将新节点加入集群

[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
127.0.0.1:6379> CLUSTER MEET 172.16.1.53 6381
OK
127.0.0.1:6379> CLUSTER MEET 172.16.1.53 6382
OK
127.0.0.1:6379> CLUSTER NODES
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594349678935 0 connected 10923-16383
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594349680449 6 connected 0-5460
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594349679443 4 connected
2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 172.16.1.53:6382 master - 0 1594349680955 1 connected
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 0 1594349679444 3 connected
8a07bc32d3b260fb9a1f23c0da5a054a614850ee 172.16.1.53:6381 master - 0 1594349679942 0 connected
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594349680953 2 connected 5461-10922
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,slave df20862e40a495fb4c7c03362a4d0e2f64a072f5 0 0 1 connected

4)重新分配槽位

#如果redis集群有配置密码,在使用redis-trib.rb 时会遇到无法连接集群的问题
[root@db01 ~]# redis-trib.rb reshard 172.16.1.52:6379
[ERR] Sorry, can't connect to node 172.16.1.52:6379
解决办法:
#修改redis-trib.rb 脚本,配置上密码
[root@db01 /usr/local/redis-3.2.12/src]# find / -name '*redis-trib.rb*' -type f
/usr/local/redis-3.2.12/src/redis-trib.rb
[root@db01 /usr/local/redis-3.2.12/src]# vim /usr/local/redis-3.2.12/src/redis-trib.rb
          @r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60,:password => '123')
[root@db01 ~]# redis-trib.rb reshard 172.16.1.53:6381
>>> Performing Cluster Check (using node 172.16.1.53:6381)
M: 8a07bc32d3b260fb9a1f23c0da5a054a614850ee 172.16.1.53:6381
   slots: (0 slots) master
   0 additional replica(s)
M: fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 172.16.1.53:6382
   slots: (0 slots) master
   0 additional replica(s)
S: 1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380
   slots: (0 slots) slave
   replicates 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2
S: c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380
   slots: (0 slots) slave
   replicates fd8dfff8331d493e35324580d35a4ec39c0bd39f
S: 12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379
   slots: (0 slots) slave
   replicates df20862e40a495fb4c7c03362a4d0e2f64a072f5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#你想要转移多少slot(槽位)到新节点
How many slots do you want to move (from 1 to 16384)?4096
#哪个节点接收这些槽位?ID
What is the receiving node ID? 8a07bc32d3b260fb9a1f23c0da5a054a614850ee
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
#源节点的ID
Source node #1:all
#是否确认分片计划
Do you want to proceed with the proposed reshard plan (yes/no)? yes

#重新分配后再次查看槽位
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
172.16.1.51:6379> CLUSTER NODES
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594350449548 0 connected 12288-16383
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594350448844 6 connected 1365-5460
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594350449044 4 connected
2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 172.16.1.53:6382 master - 0 1594350448544 1 connected
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 0 1594350450050 3 connected
8a07bc32d3b260fb9a1f23c0da5a054a614850ee 172.16.1.53:6381 master - 0 1594350450051 7 connected 0-1364 5461-6826 10923-12287
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594350448544 2 connected 6827-10922
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,slave df20862e40a495fb4c7c03362a4d0e2f64a072f5 0 0 1 connected

5)添加新节点的从库(副本)

#配置新的从库
[root@db03 ~]# redis-cli -h 172.16.1.53 -p 6382
172.16.1.53:6382> CLUSTER REPLICATE 8a07bc32d3b260fb9a1f23c0da5a054a614850ee
OK

#重新分配主从,重新执行CLUSTER REPLICATE
172.16.1.53:6382> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594350621966 2 connected 6827-10922
8a07bc32d3b260fb9a1f23c0da5a054a614850ee 172.16.1.53:6381 master - 0 1594350621966 7 connected 0-1364 5461-6826 10923-12287
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594350623477 0 connected 12288-16383
c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380 slave fd8dfff8331d493e35324580d35a4ec39c0bd39f 0 1594350622468 0 connected
df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380 master - 0 1594350623987 6 connected 1365-5460
2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 172.16.1.53:6382 myself,slave 8a07bc32d3b260fb9a1f23c0da5a054a614850ee 0 0 1 connected
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 slave df20862e40a495fb4c7c03362a4d0e2f64a072f5 0 1594350623988 6 connected
1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380 slave 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 0 1594350622971 2 connected
172.16.1.53:6382>

4.删除节点

1)移除删除节点的槽位

[root@db01 ~]# redis-trib.rb reshard 172.16.1.53:6381
>>> Performing Cluster Check (using node 172.16.1.53:6381)
M: 8a07bc32d3b260fb9a1f23c0da5a054a614850ee 172.16.1.53:6381
   slots: (0 slots) master
   0 additional replica(s)
M: fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: df20862e40a495fb4c7c03362a4d0e2f64a072f5 172.16.1.53:6380
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 172.16.1.53:6382
   slots: (0 slots) master
   0 additional replica(s)
S: 1cc8546c6bd57ca54659418c28bf589cb8b3cdba 172.16.1.51:6380
   slots: (0 slots) slave
   replicates 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2
S: c388120fc6ba88d71ea24cc8348352c1414a3c8c 172.16.1.52:6380
   slots: (0 slots) slave
   replicates fd8dfff8331d493e35324580d35a4ec39c0bd39f
S: 12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379
   slots: (0 slots) slave
   replicates df20862e40a495fb4c7c03362a4d0e2f64a072f5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#你想要转移多少slot(槽位)到新节点
How many slots do you want to move (from 1 to 16384)?4096
#哪个节点接收这些槽位?ID
What is the receiving node ID? 9e56ddcb1700c5117d8d5ccb90134bf5855a33e2
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.	#如果是all则所有机器
  Type 'done' once you entered all the source nodes IDs.		#如果是指定某一台或多台,先输入节点的id,最后以done结束
#源节点的ID
Source node #1:all
#是否确认分片计划
Do you want to proceed with the proposed reshard plan (yes/no)? yes

#平衡槽位
[root@db01 ~]# redis-trib.rb rebalance 172.16.1.51:6379

2)删除节点

[root@db01 ~]# redis-trib.rb del-node 172.16.1.53:6381 8a07bc32d3b260fb9a1f23c0da5a054a614850ee
>>> Removing node 8a07bc32d3b260fb9a1f23c0da5a054a614850ee from cluster 172.16.1.53:6381
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@db01 ~]# redis-trib.rb del-node 172.16.1.53:6382 2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27
>>> Removing node 2aa0dc6d488df4647d27aa9a69dcfd823bcd5f27 from cluster 172.16.1.53:6382
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@db01 ~]# 

5.槽位分配时故障

1)模拟故障

#重新分配槽位,指定的机器只要是集群中的机器就可以
[root@db01 ~]# redis-trib.rb reshard 172.16.1.51:6379

#执行过程中 ctrl + c,检查集群信息
[root@db01 ~]# redis-trib.rb check 172.16.1.51:6379
>>> Check for open slots...
[WARNING] Node 172.16.1.53:6379 has slots in importing state (1384).
[WARNING] Node 172.16.1.53:6380 has slots in migrating state (1384).
[WARNING] The following slots are open: 1384

2)修复故障

[root@db01 ~]# redis-trib.rb fix 172.16.1.53:6379
[root@db01 ~]# redis-trib.rb fix 172.16.1.53:6380

#查看状态
[root@db01 ~]# redis-trib.rb check 172.16.1.51:6379
>>> Performing Cluster Check (using node 172.16.1.51:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@db01 ~]# 

3)重新分配槽位

[root@db01 ~]# redis-trib.rb rebalance 172.16.1.51:6379
>>> Performing Cluster Check (using node 172.16.1.51:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.0% threshold.
#当时槽位之间数量差距小于2%,不会重新平衡槽位数量
posted @   zbzSH  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示