1 为什么使用cluster模式
官网地址:https://redis.io/topics/cluster-tutorial
在主从模式下解决了单点故障问题,并且主从分离以后redis master节点的读的压力。但是master故障后,不会自动转移,此时哨兵模式解决了该问题。在哨兵模式下,从节点无法写入数据,主节点写能力受网络和磁盘影响较大,cluster模式将数据分片,存在各个master节点上,能够有效的解决master节点的写压力;
cluster模式具有以下特点:
- 无中心:各个节点都可以写数据
- 至少6个节点,三主三从,可扩展;
- 各个节点通信通过gossip协议;
- 数据分布在各个节点上;
cluster模式的数据分片是通过crc16算法对存入数据的key进行计算来决定改key存放的节点;每个master节点都会给分配hash槽位(16384个),slave节点不会被分配。
2 基本配置解释
################################ REDIS CLUSTER ################################ 是否开启clustercluster-enabled yes# 集群配置文件,不推荐手动修改,文件由redis自身修改cluster-config-file nodes-7001.conf# 节点超时时间cluster-node-timeout 15000########################## CLUSTER DOCKER/NAT support ######################### 声明自身的ip地址,端口号,以及总线端口(一般情况端口号加10000)cluster-announce-ip 192.168.1.1cluster-announce-port 7001cluster-announce-bus-port 17001
3 搭建环境
| 端口 | redis01 | redis02 | redis03 | redis04 | redis05 | redis06 |
|---|---|---|---|---|---|---|
| port | 7001 | 7002 | 7003 | 7004 | 7005 | 7006 |
| 总线port | 17001 | 17002 | 17003 | 17004 | 17005 | 17006 |
redis.conf配置文件:
################################# GENERAL ###################################### 以前端形式运行,如果守护进程运行,容器没有主进程无法启动daemonize nopidfile /var/run/redis_7001.pidloglevel noticelogfile ""databases 16################################## NETWORK #####################################bind 0.0.0.0protected-mode yesport 6381tcp-backlog 511timeout 0tcp-keepalive 300################################ SNAPSHOTTING ################################save 3600 1save 300 100save 60 10000stop-writes-on-bgsave-error yesrdbchecksum yesdbfilename dump.rdbrdb-del-sync-files nodir /data################################## SECURITY ###################################requirepass 123456################################# REPLICATION #################################masterauth 123456################################ REDIS CLUSTER ###############################cluster-enabled yescluster-config-file nodes-7001.confcluster-node-timeout 15000########################## CLUSTER DOCKER/NAT support ########################cluster-announce-ip 192.168.1.11cluster-announce-port 7001cluster-announce-bus-port 17001
启动脚本如下:
[root@es01 cluster]# cat redis01/run-redis.shdocker rm -f cluster-redis01current_dir=$(cd $(dirname $0);pwd)docker run -d --name cluster-redis01 \-v $current_dir/redis.conf:/etc/redis/redis.conf \--net host \-v $current_dir/data/:/data \-v /etc/localtime:/etc/localtime \redis:6.2.6 /etc/redis/redis.conf
工作目录如下:
[root@es01 cluster]# tree ..├── redis01│ ├── data│ │ └── nodes-7001.conf│ ├── redis.conf│ └── run-redis.sh├── redis02│ ├── data│ │ └── nodes-7002.conf│ ├── redis.conf│ └── run-redis.sh├── redis03│ ├── data│ │ └── nodes-7003.conf│ ├── redis.conf│ └── run-redis.sh├── redis04│ ├── data│ │ └── nodes-7004.conf│ ├── redis.conf│ └── run-redis.sh├── redis05│ ├── data│ │ └── nodes-7005.conf│ ├── redis.conf│ └── run-redis.sh├── redis06│ ├── data│ │ └── nodes-7006.conf│ ├── redis.conf│ └── run-redis.sh└── upClusterRedis.sh12 directories, 19 files
创建集群,副本数为1
redis-cli -a 123456 --cluster create 192.168.1.11:7001 192.168.1.11:7002 192.168.1.11:7003 192.168.1.11:7004 192.168.1.11:7005 192.168.1.11:7006 --cluster-replicas 1
[root@es01 cluster]# redis-cli -a 123456 --cluster create 192.168.1.11:7001 192.168.1.11:7002 192.168.1.11:7003 192.168.1.11:7004 192.168.1.11:7005 192.168.1.11:7006 --cluster-replicas 1Warning: 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 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 192.168.1.11:7005 to 192.168.1.11:7001Adding replica 192.168.1.11:7006 to 192.168.1.11:7002Adding replica 192.168.1.11:7004 to 192.168.1.11:7003>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves are in the same host as their masterM: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots:[0-5460] (5461 slots) masterM: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[5461-10922] (5462 slots) masterM: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[10923-16383] (5461 slots) masterS: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004replicates 9eee9fdef750a76681c9a434a5b38998d33765dcS: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005replicates e28d175a242a4eddeec24d2cf3862fb8e23467dcS: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006replicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join.>>> Performing Cluster Check (using node 192.168.1.11:7001)M: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots:[0-5460] (5461 slots) master1 additional replica(s)M: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[10923-16383] (5461 slots) master1 additional replica(s)S: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005slots: (0 slots) slavereplicates e28d175a242a4eddeec24d2cf3862fb8e23467dcM: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[5461-10922] (5462 slots) master1 additional replica(s)S: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004slots: (0 slots) slavereplicates 9eee9fdef750a76681c9a434a5b38998d33765dcS: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006slots: (0 slots) slavereplicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
检查cluster集群
[root@es01 cluster]# redis-cli -a 123456 --cluster check 192.168.1.11:7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.192.168.1.11:7001 (e28d175a...) -> 0 keys | 5461 slots | 1 slaves.192.168.1.11:7003 (9eee9fde...) -> 0 keys | 5461 slots | 1 slaves.192.168.1.11:7002 (24c158d0...) -> 0 keys | 5462 slots | 1 slaves.[OK] 0 keys in 3 masters.0.00 keys per slot on average.>>> Performing Cluster Check (using node 192.168.1.11:7001)M: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots:[0-5460] (5461 slots) master1 additional replica(s)M: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[10923-16383] (5461 slots) master1 additional replica(s)S: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005slots: (0 slots) slavereplicates e28d175a242a4eddeec24d2cf3862fb8e23467dcM: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[5461-10922] (5462 slots) master1 additional replica(s)S: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004slots: (0 slots) slavereplicates 9eee9fdef750a76681c9a434a5b38998d33765dcS: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006slots: (0 slots) slavereplicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
查看集群信息
[root@es01 cluster]# redis-cli -a 123456 -p 7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:7001> CLUSTER INFOcluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:103cluster_stats_messages_pong_sent:113cluster_stats_messages_sent:216cluster_stats_messages_ping_received:108cluster_stats_messages_pong_received:103cluster_stats_messages_meet_received:5cluster_stats_messages_received:216127.0.0.1:7001>127.0.0.1:7001> CLUSTER NODES9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644637243462 3 connected 10923-16383fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 slave e28d175a242a4eddeec24d2cf3862fb8e23467dc 0 1644637242445 1 connectede28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 myself,master - 0 1644637244000 1 connected 0-546024c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644637242000 2 connected 5461-109224e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644637241000 3 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644637244482 2 connected
整理一下当前的集群信息
| master | 192.168.1.11:7001 | 192.168.1.11:7002 | 192.168.1.11:7003 |
|---|---|---|---|
| slave | 192.168.1.11:7005 | 192.168.1.11:7006 | 192.168.1.11:7004 |
设置一个key,k1刚好经过crc16算法,存放在7003节点,当设置k2时可以看到经过计算后,k2存放在7001节点。
[root@es01 redis01]# redis-cli -a 123456 -p 7003 -cWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:7003> set k1 v1OK127.0.0.1:7003> set k2 v2-> Redirected to slot [449] located at 192.168.1.11:7001OK
此处需要注意的时,连接redis集群需要加上-c参数,告诉客户端以集群方式连接,如果不加会报错:
[root@es01 cluster]# redis-cli -a 123456 -p 7003127.0.0.1:7003> set k2 v2(error) MOVED 449 192.168.1.11:7001
4 故障转移
模拟故障转移,将7001停掉
docker stop cluster-redis01
查看7005日志,当7001宕机后,日志显示连接master节点进行同步失败,然后进行故障转移,7005 slave节点升级为master节点。
# docker logs -f cluster-redis051:S 12 Feb 2022 14:10:45.296 # Connection with master lost.1:S 12 Feb 2022 14:10:45.296 * Caching the disconnected master state.1:S 12 Feb 2022 14:10:45.296 * Reconnecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:45.296 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:45.296 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:45.624 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:45.624 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:45.624 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:46.639 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:46.640 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:46.640 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:47.648 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:47.648 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:47.648 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:48.658 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:48.658 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:48.658 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:49.668 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:49.668 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:49.668 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:50.680 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:50.680 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:50.680 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:51.689 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:51.689 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:51.689 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:52.697 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:52.697 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:52.697 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:53.707 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:53.707 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:53.707 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:54.716 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:54.716 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:54.716 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:55.724 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:55.724 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:55.724 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:56.731 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:56.731 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:56.731 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:57.746 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:57.746 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:57.746 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:58.765 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:58.765 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:58.765 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:10:59.787 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:10:59.787 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:10:59.787 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:00.805 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:00.806 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:00.806 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:01.835 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:01.835 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:01.835 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:02.853 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:02.853 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:02.853 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:03.873 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:03.873 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:03.873 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:04.898 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:04.898 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:04.898 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:05.101 * FAIL message received from 4e3c5f793a98e274c105a946350f6b887bb1833d about e28d175a242a4eddeec24d2cf3862fb8e23467dc1:S 12 Feb 2022 14:11:05.101 # Start of election delayed for 931 milliseconds (rank #0, offset 12582).1:S 12 Feb 2022 14:11:05.101 # Cluster state changed: fail1:S 12 Feb 2022 14:11:05.920 * Connecting to MASTER 192.168.1.11:70011:S 12 Feb 2022 14:11:05.920 * MASTER <-> REPLICA sync started1:S 12 Feb 2022 14:11:05.920 # Error condition on socket for SYNC: Connection refused1:S 12 Feb 2022 14:11:06.122 # Starting a failover election for epoch 7.1:S 12 Feb 2022 14:11:06.124 # Failover election won: I'm the new master.1:S 12 Feb 2022 14:11:06.124 # configEpoch set to 7 after successful failover1:M 12 Feb 2022 14:11:06.124 * Discarding previously cached master state.1:M 12 Feb 2022 14:11:06.124 # Setting secondary replication ID to 516ab19c01da7134706508b65a31eb3d8ad0bdc2, valid up to offset: 12583. New replication ID is 6134525316061eafaa676761e20fe052967766ec1:M 12 Feb 2022 14:11:06.124 # Cluster state changed: ok
查看集群状态,7001状态为fail,7005节点已经切换成master节点。
[root@es01 redis01]# redis-cli -c -a 123456 -p 7005Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:7005> role1) "master"2) (integer) 125823) (empty array)127.0.0.1:7005>127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644646563000 7 connected 0-54609eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644646565134 3 connected 10923-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644646564115 3 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644646562078 2 connected 5461-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 master,fail - 1644646251588 1644646244502 1 disconnected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644646562000 2 connected
重新启动7001节点
docker start cluster-redis01
查看7005节点日志
1:M 12 Feb 2022 14:17:24.713 * Clear FAIL state for node e28d175a242a4eddeec24d2cf3862fb8e23467dc: replica is reachable again.1:M 12 Feb 2022 14:17:24.714 * Replica 192.168.1.11:7001 asks for synchronization1:M 12 Feb 2022 14:17:24.714 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '302913ac0294db7856142a306df5ff4f8640db4c', my replication IDs are '6134525316061eafaa676761e20fe052967766ec' and '516ab19c01da7134706508b65a31eb3d8ad0bdc2')1:M 12 Feb 2022 14:17:24.714 * Starting BGSAVE for SYNC with target: disk1:M 12 Feb 2022 14:17:24.715 * Background saving started by pid 2020:C 12 Feb 2022 14:17:24.718 * DB saved on disk20:C 12 Feb 2022 14:17:24.718 * RDB: 2 MB of memory used by copy-on-write1:M 12 Feb 2022 14:17:24.813 * Background saving terminated with success1:M 12 Feb 2022 14:17:24.813 * Synchronization with replica 192.168.1.11:7001 succeeded
查看集群状态,7001节点重新加入集群成为7005节点的slave
127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644646692000 7 connected 0-54609eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644646690000 3 connected 10923-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644646692623 3 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644646690580 2 connected 5461-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644646689000 7 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644646691601 2 connected
5 添加节点
5.1 添加主节点
端口号为7007(需要先启动一个容器),执行以下命令添加
[root@es01 add01]# redis-cli -a 123456 --cluster add-node 192.168.1.11:7007 192.168.1.11:7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Adding node 192.168.1.11:7007 to cluster 192.168.1.11:7001>>> Performing Cluster Check (using node 192.168.1.11:7001)S: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots: (0 slots) slavereplicates fe4efdc11de7ac0d44636fdde10b6da41fea74f9M: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005slots:[0-5460] (5461 slots) master1 additional replica(s)S: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004slots: (0 slots) slavereplicates 9eee9fdef750a76681c9a434a5b38998d33765dcM: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[10923-16383] (5461 slots) master1 additional replica(s)M: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[5461-10922] (5462 slots) master1 additional replica(s)S: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006slots: (0 slots) slavereplicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.>>> Send CLUSTER MEET to node 192.168.1.11:7007 to make it join the cluster.[OK] New node added correctly.
5.2 分配槽位
添加节点需要给新节点分配操作,没有槽位的节点时没有办法工作的,不能够存放数据。
新添加的节点槽位未分配
127.0.0.1:7001> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 master - 0 1644647700826 7 connected 0-54604e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644647699000 3 connected9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644647700000 3 connected 10923-16383e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 myself,slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644647700000 7 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644647699809 2 connected 5461-109228725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007@17007 master - 0 1644647700000 0 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644647701850 2 connected
执行以下命令进行槽位分配
# redis-cli -a 123456 --cluster reshard 192.168.1.11:7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Performing Cluster Check (using node 192.168.1.11:7001)S: f399aa5bbf0c81041b019e9c376707aec1b1c2f6 192.168.1.11:7001slots: (0 slots) slavereplicates fe996744c3905edfcd5fb8ed6382fe20cee3125aM: 2e7416a90b21d9f7bfaa5f8fc3fd50a8c97e12e4 192.168.1.11:7002slots:[6827-10922] (4096 slots) master1 additional replica(s)M: fe996744c3905edfcd5fb8ed6382fe20cee3125a 192.168.1.11:7005slots:[1365-5460] (4096 slots) master1 additional replica(s)S: 20adb3b635d399f5d8abc15543d494fa51373f7f 192.168.1.11:7006slots: (0 slots) slavereplicates 2e7416a90b21d9f7bfaa5f8fc3fd50a8c97e12e4M: ffc30b239ac989150c1eab5f11390e6c6b1ec36e 192.168.1.11:7007slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) masterM: 4cf440d6c66cfcb4a27805848f35c8f96578056f 192.168.1.11:7003slots:[12288-16383] (4096 slots) master1 additional replica(s)S: 437567fb43a22af468507ce80cf152792ed23afa 192.168.1.11:7004slots: (0 slots) slavereplicates 4cf440d6c66cfcb4a27805848f35c8f96578056f[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)? 2048 # 分配的槽位个数What is the receiving node ID? ffc30b239ac989150c1eab5f11390e6c6b1ec36ePlease 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 # 输入all代表从现有的所有master进行分配
查看节点信息,可以看到7007节点从其他几个主节点获取到了2048个槽位
127.0.0.1:7001> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 master - 0 1644648073898 7 connected 682-54604e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644648072871 3 connected9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644648072000 3 connected 11605-16383e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 myself,slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644648071000 7 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644648070824 2 connected 6144-109228725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007@17007 master - 0 1644648072000 8 connected 0-681 5461-6143 10923-1160488628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644648070000 2 connected
5.4 添加从节点
执行以下命令添加
# redis-cli -a 123456 -c --cluster add-node --cluster-slave --cluster-master-id 8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7008 192.168.1.11:7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Adding node 192.168.1.11:7008 to cluster 192.168.1.11:7001>>> Performing Cluster Check (using node 192.168.1.11:7001)S: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots: (0 slots) slavereplicates fe4efdc11de7ac0d44636fdde10b6da41fea74f9M: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005slots:[682-5460] (4779 slots) master1 additional replica(s)S: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004slots: (0 slots) slavereplicates 9eee9fdef750a76681c9a434a5b38998d33765dcM: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[11605-16383] (4779 slots) master1 additional replica(s)M: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[6144-10922] (4779 slots) master1 additional replica(s)M: 8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007slots:[0-681],[5461-6143],[10923-11604] (2047 slots) masterS: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006slots: (0 slots) slavereplicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.>>> Send CLUSTER MEET to node 192.168.1.11:7008 to make it join the cluster.Waiting for the cluster to join>>> Configure node as replica of 192.168.1.11:7007.[OK] New node added correctly.
查看节点信息,7008作为7007的从节点加入了集群
127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644648434000 7 connected 682-54609eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644648433000 3 connected 11605-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644648432505 3 connected8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007@17007 master - 0 1644648434551 8 connected 0-681 5461-6143 10923-1160424c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644648433525 2 connected 6144-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644648435000 7 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644648432000 2 connected57a0b8b52c3b806a8573029ee3563a2be6f38b3a 192.168.1.11:7008@17008 slave 8725b260b9f78627eedc9b479580b386aa186ae0 0 1644648435575 8 connected
6 删除节点
6.1 删除从节点
先删除从节点7008
# redis-cli -a 123456 --cluster del-node 192.168.1.11:7001 57a0b8b52c3b806a8573029ee3563a2be6f38b3aWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Removing node 57a0b8b52c3b806a8573029ee3563a2be6f38b3a from cluster 192.168.1.11:7001>>> Sending CLUSTER FORGET messages to the cluster...>>> Sending CLUSTER RESET SOFT to the deleted node.
查看集群信息
127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644649135000 7 connected 682-54609eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644649131249 3 connected 11605-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644649135336 3 connected8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007@17007 master - 0 1644649133293 8 connected 0-681 5461-6143 10923-1160424c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644649133000 2 connected 6144-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644649134313 7 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644649133000 2 connected
6.2 删除主节点槽位
在删除主节点之前,需要先将已经分配给主节点7007的槽位分配出去。这里将7007的1686个槽位分配给7005master节点。
# redis-cli -a 123456 --cluster reshard 192.168.1.11:7001Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Performing Cluster Check (using node 192.168.1.11:7001)S: e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001slots: (0 slots) slavereplicates fe4efdc11de7ac0d44636fdde10b6da41fea74f9M: fe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005slots:[0-360],[682-5460],[6144-6985],[11605-12447] (6825 slots) master1 additional replica(s)S: 4e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004slots: (0 slots) slavereplicates 9eee9fdef750a76681c9a434a5b38998d33765dcM: 9eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003slots:[12448-16383] (3936 slots) master1 additional replica(s)M: 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002slots:[6986-10922] (3937 slots) master1 additional replica(s)M: 8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007slots:[361-681],[5461-6143],[10923-11604] (1686 slots) masterS: 88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006slots: (0 slots) slavereplicates 24c158d00fb92da6d0ba39ad5eef21db6f5fab00[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)? 1686What is the receiving node ID? fe4efdc11de7ac0d44636fdde10b6da41fea74f9Please 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: 8725b260b9f78627eedc9b479580b386aa186ae0Source node #2: done
查看7007 master节点已经没有槽位了
127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644649532000 9 connected 0-6985 10923-124479eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644649534761 3 connected 12448-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644649535767 3 connected8725b260b9f78627eedc9b479580b386aa186ae0 192.168.1.11:7007@17007 master - 0 1644649533000 8 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644649533000 2 connected 6986-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644649534000 9 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644649532768 2 connected
6.3删除节点
# redis-cli -a 123456 --cluster del-node 192.168.1.11:7001 8725b260b9f78627eedc9b479580b386aa186ae0Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Removing node 8725b260b9f78627eedc9b479580b386aa186ae0 from cluster 192.168.1.11:7001>>> Sending CLUSTER FORGET messages to the cluster...>>> Sending CLUSTER RESET SOFT to the deleted node.
查看集群信息
127.0.0.1:7005> CLUSTER NODESfe4efdc11de7ac0d44636fdde10b6da41fea74f9 192.168.1.11:7005@17005 myself,master - 0 1644649649000 9 connected 0-6985 10923-124479eee9fdef750a76681c9a434a5b38998d33765dc 192.168.1.11:7003@17003 master - 0 1644649649433 3 connected 12448-163834e3c5f793a98e274c105a946350f6b887bb1833d 192.168.1.11:7004@17004 slave 9eee9fdef750a76681c9a434a5b38998d33765dc 0 1644649648410 3 connected24c158d00fb92da6d0ba39ad5eef21db6f5fab00 192.168.1.11:7002@17002 master - 0 1644649650448 2 connected 6986-10922e28d175a242a4eddeec24d2cf3862fb8e23467dc 192.168.1.11:7001@17001 slave fe4efdc11de7ac0d44636fdde10b6da41fea74f9 0 1644649648000 9 connected88628ef7f9d403a9526f6709833630aa27bdbbe1 192.168.1.11:7006@17006 slave 24c158d00fb92da6d0ba39ad5eef21db6f5fab00 0 1644649647395 2 connected
7 其他
查看集群内所有key信息
]# redis-cli -c -a 123456 --cluster call 192.168.1.11:7001 keys \*Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Calling keys *192.168.1.11:7001: k2192.168.1.11:7005: k2192.168.1.11:7004: k1192.168.1.11:7003: k1192.168.1.11:7002:192.168.1.11:7006:
