一、简介 Redis集群功能从3.0版本开始引入,到5.0.14版本已经相当成熟。本文就来聊聊如何搭建一个最简单的集群,以及常用的集群管理命令。版本锁定在5.0.14,所有操作均基于此版本。 二、架构图 先来看一个最基础的集群架构,一目了然: 三、搭建集群 3.1、下载 这里是在一台Linux服务器
Redis集群功能从3.0版本开始引入,到5.0.14版本已经相当成熟。本文就来聊聊如何搭建一个最简单的集群,以及常用的集群管理命令。版本锁定在5.0.14,所有操作均基于此版本。
先来看一个最基础的集群架构,一目了然:
长期稳定更新的攒劲资源: >>>点此立即查看<<<

这里是在一台Linux服务器上演示,生产环境切勿模仿——每个Redis服务应该跑在不同的物理机或容器上。下面直接进入下载和编译步骤。
#下载redis-5.0.14 [root@Alian-ECS ~]# wget http://download.redis.io/releases/redis-5.0.14.tar.gz #解压压缩包 [root@Alian-ECS ~]# tar -zxvf redis-5.0.14.tar.gz #复制到部署目录 [root@Alian-ECS ~]# cp -r redis-5.0.14 /usr/local #进入redis的目录 [root@Alian-ECS ~]# cd /usr/local/redis-5.0.14 [root@Alian-ECS redis-5.0.14]# ll 总用量 288 -rw-r--r-- 1 root root 127554 2月 7 13:59 00-RELEASENOTES -rw-r--r-- 1 root root 53 2月 7 13:59 BUGS -rw-r--r-- 1 root root 2381 2月 7 13:59 CONTRIBUTING -rw-r--r-- 1 root root 1487 2月 7 13:59 COPYING drwxr-xr-x 6 root root 192 2月 7 14:01 deps -rw-r--r-- 1 root root 11 2月 7 13:59 INSTALL -rw-r--r-- 1 root root 151 2月 7 13:59 Makefile -rw-r--r-- 1 root root 6888 2月 7 13:59 MANIFESTO -rw-r--r-- 1 root root 20555 2月 7 13:59 README.md -rw-r--r-- 1 root root 63088 2月 7 13:59 redis.conf -rwxr-xr-x 1 root root 275 2月 7 13:59 runtest -rwxr-xr-x 1 root root 280 2月 7 13:59 runtest-cluster -rwxr-xr-x 1 root root 373 2月 7 13:59 runtest-moduleapi -rwxr-xr-x 1 root root 281 2月 7 13:59 runtest-sentinel -rw-r--r-- 1 root root 9710 2月 7 13:59 sentinel.conf drwxr-xr-x 3 root root 8192 2月 7 14:13 src drwxr-xr-x 11 root root 182 2月 7 13:59 tests drwxr-xr-x 8 root root 4096 2月 7 13:59 utils
进入src目录,依次执行编译和安装,然后将编译后的文件拷贝到统一目录。
#进入源码目录 [root@Alian-ECS redis-5.0.14]# cd src #编译(确保linux上安装有gcc) [root@Alian-ECS src]# make #编译安装 [root@Alian-ECS src]# make install #进入到redis目录 [root@Alian-ECS src]# cd /usr/local/redis-5.0.14 #新建目录 [root@Alian-ECS redis-5.0.14]# mkdir bin #拷贝复制 [root@Alian-ECS redis-5.0.14]# cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis-5.0.14/bin #查看拷贝的文件 [root@Alian-ECS redis-5.0.14]# ll bin 总用量 53300 -rwxr-xr-x 1 root root 735 2月 7 14:28 mkreleasehdr.sh -rwxr-xr-x 1 root root 6018304 2月 7 14:28 redis-benchmark -rwxr-xr-x 1 root root 10501736 2月 7 14:28 redis-check-aof -rwxr-xr-x 1 root root 10501736 2月 7 14:28 redis-check-rdb -rwxr-xr-x 1 root root 6542120 2月 7 14:28 redis-cli -rwxr-xr-x 1 root root 10501736 2月 7 14:28 redis-sentinel -rwxr-xr-x 1 root root 10501736 2月 7 14:28 redis-server
为了演示方便,定义6个端口:7001、7002、7003、7004、7005、7006,分别对应6个实例。先创建6个目录,然后修改redis.conf。
[root@Alian-ECS redis-5.0.14]# mkdir 7001 7002 7003 7004 7005 7006 [root@Alian-ECS redis-5.0.14]# vim redis.conf
关键配置项如下:
配置好一个后,复制到各个目录,再批量修改端口号。
[root@Alian-ECS redis-5.0.14]# cp redis.conf 7001 [root@Alian-ECS redis-5.0.14]# cp redis.conf 7002 [root@Alian-ECS redis-5.0.14]# cp redis.conf 7003 [root@Alian-ECS redis-5.0.14]# cp redis.conf 7004 [root@Alian-ECS redis-5.0.14]# cp redis.conf 7005 [root@Alian-ECS redis-5.0.14]# cp redis.conf 7006 #批量修改端口号(例如将7001替换为7002) [root@Alian-ECS redis-5.0.14]# sed -i 's/7001/7002/g' 7002/redis.conf [root@Alian-ECS redis-5.0.14]# sed -i 's/7001/7003/g' 7003/redis.conf [root@Alian-ECS redis-5.0.14]# sed -i 's/7001/7004/g' 7004/redis.conf [root@Alian-ECS redis-5.0.14]# sed -i 's/7001/7005/g' 7005/redis.conf [root@Alian-ECS redis-5.0.14]# sed -i 's/7001/7006/g' 7006/redis.conf [root@Alian-ECS redis-5.0.14]#
启动所有服务:
[root@Alian-ECS redis-5.0.14]# bin/redis-server 7001/redis.conf [root@Alian-ECS redis-5.0.14]# bin/redis-server 7002/redis.conf [root@Alian-ECS redis-5.0.14]# bin/redis-server 7003/redis.conf [root@Alian-ECS redis-5.0.14]# bin/redis-server 7004/redis.conf [root@Alian-ECS redis-5.0.14]# bin/redis-server 7005/redis.conf [root@Alian-ECS redis-5.0.14]# bin/redis-server 7006/redis.conf [root@Alian-ECS redis-5.0.14]# ps -ef|grep redis root 2979640 1 0 15:48 00:00:00 bin/redis-server 127.0.0.1:7001 [cluster] root 2980332 1 0 15:49 00:00:00 bin/redis-server 127.0.0.1:7002 [cluster] root 2980507 1 0 15:49 00:00:00 bin/redis-server 127.0.0.1:7003 [cluster] root 2980702 1 0 15:49 00:00:00 bin/redis-server 127.0.0.1:7004 [cluster] root 2980857 1 0 15:49 00:00:00 bin/redis-server 127.0.0.1:7005 [cluster] root 2980977 1 0 15:49 00:00:00 bin/redis-server 127.0.0.1:7006 [cluster] root 2981097 2735921 0 15:49 pts/0 00:00:00 grep --color=auto redis
现在6个实例都起来了,但彼此还是独立的,集群尚未形成。
使用redis-cli的cluster子命令一键创建集群:
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
--cluster-replicas 1 表示每个主节点配备1个从节点。[root@Alian-ECS bin]# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 >>> 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:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7006 to 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7003 >>> Trying to optimize sla ves allocation for anti-affinity [WARNING] Some sla ves are in the same host as their master M: 5df6e4e6acefc3045d98f1a3207168e8007f6288 127.0.0.1:7001 slots:[0-5460] (5461 slots) master M: fb0383882cfb2b1e219b822d5f3a46cad8ed624e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master M: 48b9419d7e772f71273347dc557a3ef07edb67a9 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master S: 4d40e49d2d8602fb335b16c3cf8c425e7317049e 127.0.0.1:7004 replicates 48b9419d7e772f71273347dc557a3ef07edb67a9 S: 6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0 127.0.0.1:7005 replicates 5df6e4e6acefc3045d98f1a3207168e8007f6288 S: 4822ef8b239c5f3f00c71cca00f7636ba7fa60e3 127.0.0.1:7006 replicates fb0383882cfb2b1e219b822d5f3a46cad8ed624e Can 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 cluster Waiting for the cluster to join >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 5df6e4e6acefc3045d98f1a3207168e8007f6288 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 4822ef8b239c5f3f00c71cca00f7636ba7fa60e3 127.0.0.1:7006 slots: (0 slots) sla ve replicates fb0383882cfb2b1e219b822d5f3a46cad8ed624e S: 6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0 127.0.0.1:7005 slots: (0 slots) sla ve replicates 5df6e4e6acefc3045d98f1a3207168e8007f6288 M: fb0383882cfb2b1e219b822d5f3a46cad8ed624e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 4d40e49d2d8602fb335b16c3cf8c425e7317049e 127.0.0.1:7004 slots: (0 slots) sla ve replicates 48b9419d7e772f71273347dc557a3ef07edb67a9 M: 48b9419d7e772f71273347dc557a3ef07edb67a9 127.0.0.1:7003 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@Alian-ECS bin]#
当询问是否确认分配方案时,输入 yes 即可。
集群搭建完成后,可以通过 cluster info 子命令查看概要信息,需要提供集群中任意一个节点的地址。
语法
redis-cli --cluster info ip:port
使用
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster info 127.0.0.1:7001 127.0.0.1:7001 (5df6e4e6...) -> 0 keys | 5461 slots | 1 sla ves. 127.0.0.1:7002 (fb038388...) -> 0 keys | 5462 slots | 1 sla ves. 127.0.0.1:7003 (48b9419d...) -> 0 keys | 5461 slots | 1 sla ves. [OK] 0 keys in 3 masters. 0.00 keys per slot on a verage. [root@Alian-ECS redis-5.0.14]#
使用 check 子命令可以验证16384个槽是否全部指派给了主节点,同样需要提供任意节点地址。
语法
redis-cli --cluster check ip:port
使用
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster check 127.0.0.1:7001 127.0.0.1:7001 (5df6e4e6...) -> 0 keys | 5461 slots | 1 sla ves. 127.0.0.1:7002 (fb038388...) -> 0 keys | 5462 slots | 1 sla ves. 127.0.0.1:7003 (48b9419d...) -> 0 keys | 5461 slots | 1 sla ves. [OK] 0 keys in 3 masters. 0.00 keys per slot on a verage. >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 5df6e4e6acefc3045d98f1a3207168e8007f6288 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 4822ef8b239c5f3f00c71cca00f7636ba7fa60e3 127.0.0.1:7006 slots: (0 slots) sla ve replicates fb0383882cfb2b1e219b822d5f3a46cad8ed624e S: 6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0 127.0.0.1:7005 slots: (0 slots) sla ve replicates 5df6e4e6acefc3045d98f1a3207168e8007f6288 M: fb0383882cfb2b1e219b822d5f3a46cad8ed624e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 4d40e49d2d8602fb335b16c3cf8c425e7317049e 127.0.0.1:7004 slots: (0 slots) sla ve replicates 48b9419d7e772f71273347dc557a3ef07edb67a9 M: 48b9419d7e772f71273347dc557a3ef07edb67a9 127.0.0.1:7003 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@Alian-ECS redis-5.0.14]#
如果故意用 cluster delslots 撤销一些槽的指派,再检查就会报错:
#撤销对7001节点槽0,1,2,3,4的指派
127.0.0.1:7001> cluster delslots 0 1 2 3 4 5
OK
127.0.0.1:7001> cluster slots
1) 1) (integer) 6
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 7001
3) "5df6e4e6acefc3045d98f1a3207168e8007f6288"
4) 1) "127.0.0.1"
2) (integer) 7005
3) "6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 7002
3) "fb0383882cfb2b1e219b822d5f3a46cad8ed624e"
4) 1) "127.0.0.1"
2) (integer) 7006
3) "4822ef8b239c5f3f00c71cca00f7636ba7fa60e3"
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7003
3) "48b9419d7e772f71273347dc557a3ef07edb67a9"
4) 1) "127.0.0.1"
2) (integer) 7004
3) "4d40e49d2d8602fb335b16c3cf8c425e7317049e"
127.0.0.1:7001>
再次检查:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster check 127.0.0.1:7001 127.0.0.1:7001 (5df6e4e6...) -> 1 keys | 5455 slots | 1 sla ves. 127.0.0.1:7002 (fb038388...) -> 1 keys | 5462 slots | 1 sla ves. 127.0.0.1:7003 (48b9419d...) -> 0 keys | 5461 slots | 1 sla ves. [OK] 2 keys in 3 masters. 0.00 keys per slot on a verage. >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 5df6e4e6acefc3045d98f1a3207168e8007f6288 127.0.0.1:7001 slots:[6-5460] (5455 slots) master 1 additional replica(s) S: 4822ef8b239c5f3f00c71cca00f7636ba7fa60e3 127.0.0.1:7006 slots: (0 slots) sla ve replicates fb0383882cfb2b1e219b822d5f3a46cad8ed624e S: 6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0 127.0.0.1:7005 slots: (0 slots) sla ve replicates 5df6e4e6acefc3045d98f1a3207168e8007f6288 M: fb0383882cfb2b1e219b822d5f3a46cad8ed624e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 4d40e49d2d8602fb335b16c3cf8c425e7317049e 127.0.0.1:7004 slots: (0 slots) sla ve replicates 48b9419d7e772f71273347dc557a3ef07edb67a9 M: 48b9419d7e772f71273347dc557a3ef07edb67a9 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [ERR] Nodes don't agree about configuration! >>> Check for open slots... >>> Check slots coverage... [ERR] Not all 16384 slots are covered by nodes.
如果出现槽未分配的情况,可以使用 fix 命令修复。比如上面的报错,执行fix即可。
语法
redis-cli --cluster fix ip:port
使用
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster fix 127.0.0.1:7001 127.0.0.1:7001 (5df6e4e6...) -> 1 keys | 5455 slots | 1 sla ves. 127.0.0.1:7002 (fb038388...) -> 1 keys | 5462 slots | 1 sla ves. 127.0.0.1:7003 (48b9419d...) -> 0 keys | 5461 slots | 1 sla ves. [OK] 2 keys in 3 masters. 0.00 keys per slot on a verage. >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 5df6e4e6acefc3045d98f1a3207168e8007f6288 127.0.0.1:7001 slots:[6-5460] (5455 slots) master 1 additional replica(s) S: 4822ef8b239c5f3f00c71cca00f7636ba7fa60e3 127.0.0.1:7006 slots: (0 slots) sla ve replicates fb0383882cfb2b1e219b822d5f3a46cad8ed624e S: 6979395e0eadb9a252ce80f61ed4b3b1ec1cccf0 127.0.0.1:7005 slots: (0 slots) sla ve replicates 5df6e4e6acefc3045d98f1a3207168e8007f6288 M: fb0383882cfb2b1e219b822d5f3a46cad8ed624e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 4d40e49d2d8602fb335b16c3cf8c425e7317049e 127.0.0.1:7004 slots: (0 slots) sla ve replicates 48b9419d7e772f71273347dc557a3ef07edb67a9 M: 48b9419d7e772f71273347dc557a3ef07edb67a9 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [ERR] Nodes don't agree about configuration! >>> Check for open slots... >>> Check slots coverage... [ERR] Not all 16384 slots are covered by nodes. >>> Fixing slots coverage... List of not covered slots: 0,1,2,3,4,5 Slot 0 has keys in 0 nodes: Slot 1 has keys in 0 nodes: Slot 2 has keys in 0 nodes: Slot 3 has keys in 0 nodes: Slot 4 has keys in 0 nodes: Slot 5 has keys in 0 nodes: The following uncovered slots ha ve no keys across the cluster:2, 1, 0, 5, 3, 4 Fix these slots by covering with a random node? (type 'yes' to accept): yes >>> Covering slot 2 with 127.0.0.1:7003 >>> Covering slot 1 with 127.0.0.1:7003 >>> Covering slot 0 with 127.0.0.1:7003 >>> Covering slot 5 with 127.0.0.1:7003 >>> Covering slot 3 with 127.0.0.1:7003 >>> Covering slot 4 with 127.0.0.1:7003 [root@Alian-ECS redis-5.0.14]#
使用 reshard 子命令可以将指定数量的槽从源节点迁移到目标节点。
语法
redis-cli --cluster reshard: --cluster-from #源节点的ID --cluster-to #目标节点的ID --cluster-slots #要迁移的槽的数量 --cluster-yes #直接确认 --cluster-timeout
示例:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from 48b9419d7e772f71273347dc557a3ef07edb67a9 --cluster-to 5df6e4e6acefc3045d98f1a3207168e8007f6288 --cluster-slots 5
通过 rebalance 子命令,可以重新分配各个节点的槽数量,使负载趋于均衡。
语法
redis-cli --cluster rebalance:
示例:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster rebalance 127.0.0.1:7001
使用 add-node 子命令将新节点加入集群,需要提供新节点地址和集群中任意现有节点地址。
语法
redis-cli --cluster add-node: :
默认添加的是主节点。如果要添加从节点,需要加上 --cluster-sla ve 和 --cluster-master-id 参数,指定要复制的主节点ID。
通过 del-node 移除集群中的某个节点。
语法
redis-cli --cluster del-node:
其中 ip:port 是集群入口节点,node_id 是要移除的节点ID。示例:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster del-node 127.0.0.1:7001 4d40e49d2d8602fb335b16c3cf8c425e7317049e
使用 set-timeout 为集群所有节点重新设置 cluster-node-timeout 值。
语法
redis-cli --cluster set-timeout:
示例:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster set-timeout 127.0.0.1:7001 30000
通过 import 子命令可以将单机Redis服务器的数据导入集群。
语法
redis-cli --cluster import: # 集群入口地址 --cluster-from : # 单机服务地址 --cluster-copy # 使用复制导入 --cluster-replace # 覆盖相同名称的键
示例:
[root@Alian-ECS redis-5.0.14]# bin/redis-cli --cluster import 127.0.0.1:7001 --cluster-from 127.0.0.1:7002 --cluster-copy --cluster-replace
如果测试过程中反复分片、添加或删除节点导致集群混乱,可以重建集群(生产环境慎用)。步骤如下:
[root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7001 shutdown [root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7002 shutdown [root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7003 shutdown [root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7004 shutdown [root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7005 shutdown [root@Alian-ECS redis-5.0.14]# redis-cli -h 127.0.0.1 -p 7006 shutdown #删除 [root@Alian-ECS redis-5.0.14]# rm -f ./*/nodes-*.conf ./*/appendonly.aof ./*/dump.rdb ./*/*.log [root@Alian-ECS bin]# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
注意:这里执行的目录是redis的安装目录,子节点目录分别是7001~7006,实际使用时请根据自己目录结构调整。
以上是Redis集群搭建与常用管理命令的完整实战,从下载编译到集群创建、维护、修复,覆盖了日常运维中大部分场景。掌握了这些,基本就能应对集群的初始化与常见操作了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述