一、Redis Cluster
早期Redis 分布式集群部署方案:
- 客户端分区:由客户端程序决定key写分配和写入的redis node,但是需要客户端自己处理写入分配、高可用管理和故障转移等
- 代理方案:基于三方软件实现redis proxy,客户端先连接之代理层,由代理层实现key的写入分配,对客户端来说是有比较简单,但是对于集群管节点增减相对比较麻烦,而且代理本身也是单点和性能瓶颈。
在哨兵sentinel机制中,可以解决redis高可用的问题,即当master故障后可以自动将slave提升为master从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素,因此redis官方在redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接,特点如下:
- 所有Redis节点使用(PING机制)互联
- 集群中某个节点的失效,是整个集群中超过半数的节点监测都失效才算真正的失效
- 客户端不需要proxy即可直接连接redis,应用程序需要写全部的redis服务器IP
- redis cluster把所有的redis node映射到 0-16383个槽位(slot)上,读写需要到指定的redis node上进行操作,因此有多少个reids node相当于redis 并发扩展了多少倍
- Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈
1.1 Redis cluster架构
1.1.1 Redis cluster基本架构
假如三个主节点分别是:A, B, C 三个节点,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖 0-5460
节点B覆盖 5461-10922
节点C覆盖 10923-16383
1.1.2 Redis cluster主从架构
Redis cluster的架构虽然解决了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用如何解决
1.2 部署redis集群
1.2.1 环境规划
ip | 主机名 | 角色 |
10.10.100.130 | node1 | Master |
10.10.100.131 | node2 | Master |
10.10.100.132 | node3 | Master |
10.10.100.133 | node4 | slave |
10.10.100.134 | node5 | slave |
10.10.100.135 | node6 | slave |
另外预留两台服务器做集群添加节点测试。
ip | 主机名 | 角色 |
10.10.100.136 | node7 | 备用 |
10.10.100.137 | node8 | 备用 |
redis安装目录/apps/redis,安装配置见redis 《一》 —安装配置及持久化
1.2.2 创建redis cluster集群的前提
- 每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本
- 每个节点必须开启的参数
cluster-enabled yes #必须开启集群状态,开启后redis 进程会有cluster显示
cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手动操作 - 所有redis服务器必须没有任何数据
- 先启动为单机redis且没有任何key value
1.2.3 启动所有节点reids
#配置文件开启集群状态,所有节点都需要配置
vim /apps/redis/etc/redis.conf
#添加如下配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
#启动所有节点redis
systemctl start redis
查看reids服务状态
1.2.4 创建集群
1.2.4.1 Redis 3和4版本:
需要使用到集群管理工具redis-trib.rb,这个工具是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具,redis-trib.rb是redis作者用ruby开发完成的,centos 系统yum安装的ruby存在版本较低问题,如下:
[root@node1 ~]# yum install ruby rubygems -y
[root@node1 ~]# find / -name redis-trib.rb
/usr/local/src/redis-4.0.9/src/redis-trib.rb
[root@node1 ~]# cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/bin/
[root@node1 ~]# gem install redis
Fetching: redis-4.4.0.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.3.0.
解决ruby版本较低问题
ruby下载地址 https://cache.ruby-lang.org/pub/ruby/
[root@node1 ~]# yum remove ruby rubygems -y
[root@node1 ~]# cd /usr/local/src
[root@node1 src]# wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.5.tar.gz
[root@node1 src]# tar xf ruby-2.5.5.tar.gz
[root@node1 src]# cd ruby-2.5.5
[root@node1 ruby-2.5.5]# ./configure
[root@node1 ruby-2.5.5]# make && make install
[root@node1 ruby-2.5.5]# ln -sv /usr/local/bin/gem /usr/bin/
##离线安装reids模块
#下载地址https://rubygems.org/gems/redis
[root@node1 src]# wget wget https://rubygems.org/downloads/redis-4.1.0.gem
[root@node1 src]# gem install -l redis-4.1.0.gem
如安装提示如下错误
验证redis-trib.rb 命令
[root@node1 ~]# redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN #创建集群
--replicas <arg> #指定master的副本数量
check host:port #检查集群信息
info host:port #查看集群主机信息
fix host:port #修复集群
--timeout <arg>
reshard host:port #在线热迁移集群指定主机的slots数据
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port #平衡集群中各主机的slot数量
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port #添加主机到集群
--slave
--master-id <arg>
del-node host:port node_id #删除主机
set-timeout host:port milliseconds #设置节点的超时时间
call host:port command arg arg .. arg #在集群上的所有节点上执行命令
import host:port #导入外部redis服务器的数据到当前集群
--from <arg>
--copy
--replace
help (show this help)
1.2.4.2 修改redis登入密码
[root@node1 ~]# vim /usr/local/lib/ruby/gems/2.5.0/gems/redis-3.3.3/lib/redis/client.rb
1.2.4.3 创建redis cluster集群
[root@node1 src]# redis-trib.rb create --replicas 1 10.10.100.130:6379 10.10.100.131:6379 10.10.100.132:6379 10.10.100.133:6379 10.10.100.134:6379 10.10.100.135:6379
如提示如下报错,代表redis节点存在数据
清空redis数据,并删除持久化备份文件,再重启redis
[root@node1 ~]# redis-cli
127.0.0.1:6379> AUTH cwy
OK
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> cluster reset
OK
[root@node1 ~]# rm -f /apps/redis/data/*
[root@node1 ~]# systemctl start redis
1.2.4.2 Redis 5版本:
[root@node1 ~]# redis-cli -a cwy --cluster create 10.10.100.130:6379 10.10.100.131:6379 10.10.100.132:6379 10.10.100.133:6379 10.10.100.134:6379 10.10.100.135:6379 --cluster-replicas 1
1.2.5 验证Redis集群状态
由于未设置masterauth认证密码,所以主从未建立起来,但是集群已经运行,所以需要在每个slave控制台使用config set设置masterauth密码,或者写在每个redis配置文件中,最好是在控制点设置密码之后再写入配置文件当中。
#slave节点设置masterauth
10.10.100.133:6379> CONFIG SET masterauth cwy
OK
10.10.100.134:6379> CONFIG SET masterauth cwy
OK
10.10.100.135:6379> CONFIG SET masterauth cwy
OK
确认slave状态
1.2.5.1 验证master状态
1.2.5.2 验证集群状态
10.10.100.130: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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2534
cluster_stats_messages_pong_sent:2500
cluster_stats_messages_sent:5034
cluster_stats_messages_ping_received:2495
cluster_stats_messages_pong_received:2534
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:5034
1.2.5.3 查看集群node对应关系
10.10.100.130:6379> CLUSTER NODES
bf7d99ac095a9a279dbdf25074e2e1b32f0bb4fa 10.10.100.133:6379@16379 slave 3e85970b8d95a879885aa55bfd0e6a83ea0e18dd 0 1630658036192 4 connected
9f0f436bf44ec9b8d1666197e35d7dea0b2f29ac 10.10.100.134:6379@16379 slave 757d33aa2059b90c3de12687efdef03df0af92a6 0 1630658037200 5 connected
c84a94965f82cc8101a7d5ff6ca058d460eeabc3 10.10.100.135:6379@16379 slave 9000b0229517fbb0ded1592bd6b266f271c7dd41 0 1630658038207 6 connected
9000b0229517fbb0ded1592bd6b266f271c7dd41 10.10.100.131:6379@16379 master - 0 1630658036000 2 connected 5461-10922
3e85970b8d95a879885aa55bfd0e6a83ea0e18dd 10.10.100.132:6379@16379 master - 0 1630658036000 3 connected 10923-16383
757d33aa2059b90c3de12687efdef03df0af92a6 10.10.100.130:6379@16379 myself,master - 0 1630658036000 1 connected 0-5460
1.2.5.4 验证集群写入key
10.10.100.130:6379> set key1 v1 #经过算法计算,当前key的槽位需要写入指定的node
(error) MOVED 9189 10.10.100.131:6379 #槽位不在当前node所以无法写入
10.10.100.131:6379> set key1 v1 #指定的node就可以写入
OK
10.10.100.131:6379> KEYS *
1) "key1"
#在其他主节点没有改key
10.10.100.130:6379> KEYS *
(empty list or set)
1.2.5.5 集群状态验证与监控
redis 3|4
[root@node1 ~]# redis-trib.rb check 10.10.100.130:6379
>>> Performing Cluster Check (using node 10.10.100.130:6379)
M: 757d33aa2059b90c3de12687efdef03df0af92a6 10.10.100.130:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: bf7d99ac095a9a279dbdf25074e2e1b32f0bb4fa 10.10.100.133:6379
slots: (0 slots) slave
replicates 3e85970b8d95a879885aa55bfd0e6a83ea0e18dd
S: 9f0f436bf44ec9b8d1666197e35d7dea0b2f29ac 10.10.100.134:6379
slots: (0 slots) slave
replicates 757d33aa2059b90c3de12687efdef03df0af92a6
S: c84a94965f82cc8101a7d5ff6ca058d460eeabc3 10.10.100.135:6379
slots: (0 slots) slave
replicates 9000b0229517fbb0ded1592bd6b266f271c7dd41
M: 9000b0229517fbb0ded1592bd6b266f271c7dd41 10.10.100.131:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: 3e85970b8d95a879885aa55bfd0e6a83ea0e18dd 10.10.100.132:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node1 ~]# redis-trib.rb info 10.10.100.130:6379
10.10.100.130:6379 (757d33aa...) -> 0 keys | 5461 slots | 1 slaves.
10.10.100.131:6379 (9000b022...) -> 1 keys | 5462 slots | 1 slaves.
10.10.100.132:6379 (3e85970b...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
redis 5
[root@node1 ~]# redis-cli -a cwy --cluster check 10.10.100.130:6379
1.3 Redis cluster集群节点维护
集群运行时间长久之后,难免由于硬件故障、网络规划、业务增长等原因对已有集群进行相应的调整, 比如增加Redis node节点、减少节点、节点迁移、更换服务器等
增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移。
1.3.1 集群维护之动态添加节点
增加Redis node节点,需要与之前的Redis node版本相同、配置一致,然后分别启动两台Redis node,因为一主一从。
将10.10.100.136动态添加到集群当中其不能影响业务使用和数据丢失
同步之前Redis node的配置文件到10.10.100.136 Redis编译安装目录,注意配置文件的监听 IP。
#拷贝配置文件到新节点
[root@node1 ~]# scp redis.conf 10.10.100.136:/usr/local/redis/etc/
[root@node1 ~]# scp redis.conf
10.10.100.137:/usr/local/redis/etc/
#启动redis
[root@node7 ~]#systemctl start redis
[root@node8 ~]#systemctl start redis
1.3.1.1 添加节点到集群
add-node new_host:new_port existing_host:existing_port
要添加的新redis节点IP和端口 添加到的集群中的master IP:端口,新的node节点加到集群之后默认是master节点,但是没有slots数据,需要重新分配。
Redis 3|4 添加方式
[root@node1 ~]# redis-trib.rb add-node 10.10.100.136:6379 10.10.100.130:6379
[root@node1 ~]# redis-trib.rb add-node 10.10.100.137:6379 10.10.100.130:6379
Redis 5 添加方式
redis-cli -a cwy --cluster add-node 10.10.100.137:6379 10.10.100.130:6379
redis-cli -a cwy --cluster add-node 10.10.100.136:6379 10.10.100.130:6379
1.3.1.2 为新master添加slave节点
我们这里将10.10.100.137 配置为10.10.100.136 的slave
#登入到137
[root@node1 ~]# redis-cli -h 10.10.100.137
10.10.100.137:6379> AUTH cwy
OK
##查看当前集群节点,找到目标master 的ID
10.10.100.137:6379> CLUSTER NODES
0b8713d80eb27b6e530aa4af95c2180937673b63 10.10.100.134:6379@16379 slave be89d12fa71c151f495793d8faa8239ff0286796 0 1630663540819 1 connected
be89d12fa71c151f495793d8faa8239ff0286796 10.10.100.130:6379@16379 master - 0 1630663538000 1 connected 0-5460
ef7e819c7002befad0821eaeb32c0f08b23dbc4f 10.10.100.136:6379@16379 master - 0 1630663538806 0 connected
1cf7cebb9d522c697315fd9bab16e56e9dcb26b0 10.10.100.133:6379@16379 slave 280d04878bc488fbe97bde45c1414bbf11ea2701 0 1630663539000 3 connected
7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 10.10.100.131:6379@16379 master - 0 1630663539811 2 connected 5461-10922
df05ae6038d1e1732b9692fcdfb0f7b57abce067 10.10.100.135:6379@16379 slave 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 0 1630663541824 2 connected
55ab5a70e4450ef5143cf0cde072b27d4c539291 10.10.100.137:6379@16379 myself,master - 0 1630663541000 7 connected
280d04878bc488fbe97bde45c1414bbf11ea2701 10.10.100.132:6379@16379 master - 0 1630663540000 3 connected 10923-16383
##将其设置slave,命令格式为cluster replicate MASTERID
10.10.100.137:6379> CLUSTER REPLICATE ef7e819c7002befad0821eaeb32c0f08b23dbc4f
1.3.1.3 重新分配槽位
验证可以看到新加的master节点是没有槽位的
redis 3|4 命令
[root@node1 ~]# redis-trib.rb reshard 10.10.100.136:6379
>>> Performing Cluster Check (using node 10.10.100.136:6379)
M: ef7e819c7002befad0821eaeb32c0f08b23dbc4f 10.10.100.136:6379
slots: (0 slots) master
1 additional replica(s)
S: 1cf7cebb9d522c697315fd9bab16e56e9dcb26b0 10.10.100.133:6379
slots: (0 slots) slave
replicates 280d04878bc488fbe97bde45c1414bbf11ea2701
S: 0b8713d80eb27b6e530aa4af95c2180937673b63 10.10.100.134:6379
slots: (0 slots) slave
replicates be89d12fa71c151f495793d8faa8239ff0286796
M: 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 10.10.100.131:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: df05ae6038d1e1732b9692fcdfb0f7b57abce067 10.10.100.135:6379
slots: (0 slots) slave
replicates 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14
M: be89d12fa71c151f495793d8faa8239ff0286796 10.10.100.130:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 55ab5a70e4450ef5143cf0cde072b27d4c539291 10.10.100.137:6379
slots: (0 slots) slave
replicates ef7e819c7002befad0821eaeb32c0f08b23dbc4f
M: 280d04878bc488fbe97bde45c1414bbf11ea2701 10.10.100.132:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096 #分配多少个槽位
What is the receiving node ID? ef7e819c7002befad0821eaeb32c0f08b23dbc4f
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.
Source node #1:all
#将哪些源主机的槽位分配给10.10.100.136:6379,all是自动在所有的redis node选择划分,
#如果是从redis cluster删除主机可以使用此方式将主机上的槽位全部移动到别的redis主机
Ready to move 4096 slots.
Source nodes:
M: 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 10.10.100.131:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: be89d12fa71c151f495793d8faa8239ff0286796 10.10.100.130:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 280d04878bc488fbe97bde45c1414bbf11ea2701 10.10.100.132:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
Destination node:
M: ef7e819c7002befad0821eaeb32c0f08b23dbc4f 10.10.100.136:6379
slots: (0 slots) master
1 additional replica(s)
.........................
Moving slot 12286 from 280d04878bc488fbe97bde45c1414bbf11ea2701
Moving slot 12287 from 280d04878bc488fbe97bde45c1414bbf11ea2701
Do you want to proceed with the proposed reshard plan (yes/no)? yes #确认分配
1.3.1.4 验证槽位信息
1.3.2 集群维护之动态删除节点
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。
测试将10.10.100.132master节点从集群中移除
1.3.2.1 迁移master 的槽位之其他master
被迁移Redis master源服务器必须保证没有数据,否则迁移报错并会被强制中断。
rdis 3|4 命令
[root@node1 ~]# redis-trib.rb reshard 10.10.100.130:6379
#如果迁移失败使用此命令修复集群
[root@node1 ~]# redis-trib.rb fix 10.10.100.130:6379
rdis 5 命令
redis-cli -a cwy --cluster reshard 10.10.100.130:6379
[root@node1 ~]# redis-trib.rb reshard 10.10.100.130:6379
>>> Performing Cluster Check (using node 10.10.100.130:6379)
........
#迁移master上的多少个槽位,这里将132节点的4096个槽位手动平均分配到其他节点
How many slots do you want to move (from 1 to 16384)? 1364
What is the receiving node ID? 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 #接收槽位的服务器ID
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.
Source node #1:280d04878bc488fbe97bde45c1414bbf11ea2701 #从哪个服务器迁移槽位
Source node #2:done #写done,表示没有其他master了
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes #是否继续
.........
#剩下的槽位干同样的方法分配到其他的节点
验证槽位迁移完成
1.3.2.2 从集群删除服务器
[root@node1 ~]# redis-trib.rb del-node 10.10.100.132:6379 280d04878bc488fbe97bde45c1414bbf11ea2701
>>> Removing node 280d04878bc488fbe97bde45c1414bbf11ea2701 from cluster 10.10.100.132:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
验证node 是否删除
验证并确认10.10.100.132已经从Redis集群中删除。
**注:10.10.100.132被山删除之后,其之前的slave自动成为了Redis集群中其他master的slave,此节点如果不需要也可以一并删除。 **
1.3.3 集群维护之动态迁移节点
由于其中一台master服务器硬件问题需要下线,现需要将数据迁移到新服务器。迁移方案如下
- 新服务器启动redis并将redis添加到集群后,手动将槽位迁移至新添加的redis,该方案需要提前将redis数据导出备份,并清空redis里的数据,迁移完成后再将数据导入到redis
- 新服务器启动redis并将redis添加到集群后,将新加的redis添加到需要下线的主节点的slave,待数据同步完成后,手动停止主节点,master会自动迁移到slave节点
都一种方案按照上面的添加节点,迁移槽位,再删除节点就可以实现了,这里直接测试验证第二种方案
1.3.3.1 添加节点到
#先在136节点写入点数据,方便后面验证迁移是否正常
10.10.100.136:6379> SET key3 v3
OK
10.10.100.136:6379> SET key7 v7
OK
10.10.100.136:6379> KEYS *
1) "key7"
2) "key3"
这里将136节点迁移到刚删除的132节点
[root@node1 ~]# redis-trib.rb add-node 10.10.100.132:6379 10.10.100.130:6379
>>> Adding node 10.10.100.132:6379 to cluster 10.10.100.130:6379
>>> Performing Cluster Check (using node 10.10.100.130:6379)
M: be89d12fa71c151f495793d8faa8239ff0286796 10.10.100.130:6379
slots:1365-5460,12288-13652 (5461 slots) master
1 additional replica(s)
M: 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 10.10.100.131:6379
slots:6827-10922,15019-16383 (5461 slots) master
1 additional replica(s)
M: ef7e819c7002befad0821eaeb32c0f08b23dbc4f 10.10.100.136:6379
slots:0-1364,5461-6826,10923-12287,13653-15018 (5462 slots) master
1 additional replica(s)
S: 0b8713d80eb27b6e530aa4af95c2180937673b63 10.10.100.134:6379
slots: (0 slots) slave
replicates be89d12fa71c151f495793d8faa8239ff0286796
S: 1cf7cebb9d522c697315fd9bab16e56e9dcb26b0 10.10.100.133:6379
slots: (0 slots) slave
replicates 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14
S: 55ab5a70e4450ef5143cf0cde072b27d4c539291 10.10.100.137:6379
slots: (0 slots) slave
replicates ef7e819c7002befad0821eaeb32c0f08b23dbc4f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.10.100.132:6379 to make it join the cluster.
[OK] New node added correctly.
1.3.3.2 将节点添加到136的slave
[root@node1 ~]# redis-cli -h 10.10.100.132
10.10.100.132:6379> AUTH cwy
OK
10.10.100.132:6379> CLUSTER NODES
fb014d851ff2442d752d55471880fc4ac0245731 10.10.100.132:6379@16379 myself,master - 0 1630910247000 0 connected
be89d12fa71c151f495793d8faa8239ff0286796 10.10.100.130:6379@16379 master - 0 1630910245000 9 connected 1365-5460 12288-13652
7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 10.10.100.131:6379@16379 master - 0 1630910246000 12 connected 6827-10922 15019-16383
ef7e819c7002befad0821eaeb32c0f08b23dbc4f 10.10.100.136:6379@16379 master - 0 1630910245602 11 connected 0-1364 5461-6826 10923-12287 13653-15018
0b8713d80eb27b6e530aa4af95c2180937673b63 10.10.100.134:6379@16379 slave be89d12fa71c151f495793d8faa8239ff0286796 0 1630910248000 9 connected
55ab5a70e4450ef5143cf0cde072b27d4c539291 10.10.100.137:6379@16379 slave ef7e819c7002befad0821eaeb32c0f08b23dbc4f 0 1630910248621 11 connected
1cf7cebb9d522c697315fd9bab16e56e9dcb26b0 10.10.100.133:6379@16379 slave 7669a2a1b392fb71e2dc61b6e07d6e1b38cc7e14 0 1630910249628 12 connected
#将132添加到136的slave
10.10.100.132:6379> CLUSTER REPLICATE ef7e819c7002befad0821eaeb32c0f08b23dbc4f
OK
#设置master连接密码
10.10.100.132:6379> CONFIG set masterauth cwy
OK
10.10.100.132:6379> INFO Replication
# Replication
role:slave
master_host:10.10.100.136
master_port:6379
master_link_status:up
......
使用 redis-trib.rb check 10.10.100.130:6379可以看到132已经是136的slave节点了
1.3.3.3 手动停止136节点
手动停止136上的redis
[root@node7 ~]# systemctl stop redis
验证可以看到136停止了,132自动切换成master节点了
1.3.3.4 登入验证数据
#连接到132的redis
[root@node1 ~]# redis-cli -h 10.10.100.132
10.10.100.132:6379> AUTH cwy
OK
#查看之前的数据都在
10.10.100.132:6379> KEYS *
1) "key3"
2) "key7"
10.10.100.132:6379> GET key3
"v3"
#这里因为槽位不在132上所以写入失败
10.10.100.132:6379> set key8 v8
(error) MOVED 13004 10.10.100.130:6379
#槽位在132写入数据正常
10.10.100.132:6379> set key10 v10
OK
10.10.100.132:6379> KEYS *
1) "key3"
2) "key7"
3) "key10"