文章目录
Redis 集群搭建
前言
百度了很多文章,大概都是在本机上跑一台虚机,然后将所有的redis集群的6个节点(最小集群)都安装在这台虚机上,而实际在真实的应用场景中,可能会分别在6台机器上安装,经过实践,发现在在6台机器上安装会出现一些异想不到的问题。
本文以3台虚机安装redis最小集群(6个节点)。
一、部署前准备
1、虚拟机准备
本例中相关参数说明:
物理主机IP:192.168.168.156,操作系统:Windows7
虚拟机与物理主机的网桥地址:192.168.56.1
3台虚拟机IP分别是:192.168.56.11、192.168.56.12、192.168.56.13,操作系统:CentOS7.5
保证3台虚拟机之间网络通畅,可以互ping,同时3台虚拟机也可以与网桥 192.168.56.1、物理主机 192.168.168.156 互ping。
2、配置虚拟机防火墙
为了保证 redis 启动后服务能被正常访问以及 redis 集群之间互相通信,需要放开 6379 和 16379 端口,在CentOS7下使用如下命令,在public区域放开 6379、16379、6380、16380 端口,允许外部访问,将 3 台虚拟机均按如下操作放开端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanent #(--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --zone=public --add-port=16380/tcp --permanent
firewall-cmd --reload
是否成功放开此端口,在宿主机上使用如下命令测试,如果输出结果为yes,说明防火墙配置成功
firewall-cmd --zone=public --query-port=6379/tcp
firewall-cmd --zone=public --query-port=16379/tcp
firewall-cmd --zone=public --query-port=6380/tcp
firewall-cmd --zone=public --query-port=16380/tcp
二、安装 redis
1、下载源码并解压
从 redis 官网 得知,只能下载源码编译后安装,此处使用官网截止 2019-10-15 前的最新稳定版本 redis-5.0.5.tar.gz,在第1台虚拟机(192.168.56.11)的 /home/system/soft 目录中进行下载并解压:
[system@cnkanon-1 soft]$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
--2019-10-22 15:13:24-- http://download.redis.io/releases/redis-5.0.5.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 109.74.203.151
正在连接 download.redis.io (download.redis.io)|109.74.203.151|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1975750 (1.9M) [application/x-gzip]
正在保存至: “redis-5.0.5.tar.gz.1”
100%[==================================================================================================================================>] 1,975,750 21.4KB/s 用时 77s
2019-10-22 15:14:43 (25.0 KB/s) - 已保存 “redis-5.0.5.tar.gz.1” [1975750/1975750])
[root@cnkanon-1 soft]# tar -zxvf redis-5.0.5.tar.gz
[root@cnkanon-1 soft]# ll
总用量 847584
drwxrwxr-x. 6 system dev 4096 5月 16 00:07 redis-5.0.5
-rw-r--r--. 1 system dev 1975750 5月 16 00:26 redis-5.0.5.tar.gz
2、编译安装
如果在编译中出现错误,使用 yum install gcc,tcl
安装 gcc、tcl 编译环境。
[root@cnkanon-1 soft]# cd redis-5.0.5/
[root@cnkanon-1 redis-5.0.5]# make MALLOC=libc # 等待 make 结束
[root@cnkanon-1 redis-5.0.5]# make install PREFIX=/usr/local/redis # 将 redis 安装到 /usr/local/redis 目录
3、配置 redis
将 redis 配置为后台运行,修改 redis.conf 中的 deamonize=yes,操作如下:
[root@cnkanon-1 soft]# cd /usr/local/redis # 进入安装目录查看
[root@cnkanon-1 redis]# ll
总用量 0
drwxr-xr-x. 2 root root 168 10月 18 13:11 bin
[root@cnkanon-1 redis]# cd bin # 进入 bin 目录
[root@cnkanon-1 bin]# cp /home/system/soft/redis-5.0.5/redis.conf . # 复制源码目录中的 redis.conf 到 bin 目录
[root@cnkanon-1 bin]# ll
总用量 32804
-rw-r--r--. 1 root root 112 10月 18 13:09 dump.rdb
-rwxr-xr-x. 1 root root 4366616 10月 17 17:42 redis-benchmark
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-check-aof
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-check-rdb
-rwxr-xr-x. 1 root root 4806856 10月 17 17:42 redis-cli
-rw-r--r--. 1 root root 61798 10月 17 18:39 redis.conf # redis 配置文件
lrwxrwxrwx. 1 root root 12 10月 17 17:42 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-server
[root@cnkanon-1 bin]# vim redis.conf # 修改 daemonize 为 yes
4、启动 redis
使用指定配置文件启动 redis,并以后台进程模式运行。
[root@cnkanon-1 bin]# ./redis-server /usr/local/redis/bin/redis.conf
17235:C 22 Oct 2019 17:02:36.771 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17235:C 22 Oct 2019 17:02:36.771 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=17235, just started
17235:C 22 Oct 2019 17:02:36.771 # Configuration loaded
[root@cnkanon-1 bin]# netstat -ntlp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 17236/./redis-serve
5、客户端命令连接测试
使用 redis-cli 命令连接测试。
[root@cnkanon-1 bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
[root@cnkanon-1 bin]#
三、安装 redis 集群
1、哈希槽的概念
redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数, 这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
redis 集群没有使用一致性hash,而是引入了哈希槽的概念。
redis 集群有16384个哈希槽,每个 key 通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处就在于可以方便的添加或移除节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了; 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了; 这样以后新增或移除节点的时候不用先停掉所有的 redis 服务而继续运行。
2、集群环境准备
redis 集群至少需要 3 个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以 2 个节点无法构成集群。要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以redis 集群至少需要 6 台服务器。结合本文最开始配置的 3 台虚拟机,每台虚拟机上运行 1 主 1 备 redis 节点。
3、集群安装
在前面安装好单台 redis 的基础上,开始安装 redis 集群。
3.1 集群配置参数
- cluster-enabled <yes/no>:如果是yes,表示启用集群,否则以单例模式启动
- cluster-config-file : 可选,这不是一个用户可编辑的配置文件,这个文件是Redis集群节点自动持久化每次配置的改变,为了在启动的时候重新读取它。
- cluster-node-timeout :超时时间,集群节点不可用的最大时间。如果一个master节点不可到达超过了指定时间,则认为它失败了。注意,每一个在指定时间内不能到达大多数master节点的节点将停止接受查询请求。
- cluster-slave-validity-factor :如果设置为0,则一个slave将总是尝试故障转移一个master。如果设置为一个正数,那么最大失去连接的时间是node timeout乘以这个factor。
- cluster-migration-barrier :一个master和slave保持连接的最小数量(即:最少与多少个slave保持连接),也就是说至少与其它多少slave保持连接的slave才有资格成为master。
- cluster-require-full-coverage <yes/no>:如果设置为yes,这也是默认值,如果key space没有达到百分之多少时停止接受写请求。如果设置为no,将仍然接受查询请求,即使它只是请求部分key。
3.2 第一步
在第1台虚拟机 192.168.56.11 上安装 1 主 1 备 redis 服务。
-
/usr/local 目录下创建 redis-cluster 目录
-
分别复制 /usr/local/redis/bin 到 /usr/local/redis-cluster/redis-6379、/usr/local/redis-cluster/redis-6380
-
修改 /usr/local/redis-cluster/redis-6379/redis.conf 配置文件中的端口为 6379,修改 /usr/local/redis-cluster/redis-6380/redis.conf 配置文件中的端口为 6380
-
分别启动 /usr/local/redis-cluster/redis-6379、/usr/local/redis-cluster/redis-6380 两个服务,并检查 6379、6380、16379、16380 端口是否启动 (说明:开启集群后,6379为客户端提供服务端口;16379为集群节点访问群集总线端口 ,即二进制协议的节点到节点通信通道,节点使用群集总线进行故障检测,配置更新,故障转移授权等)
[root@cnkanon-1 local]# mkdir redis-cluster
[root@cnkanon-1 local]# cd redis-cluster
[root@cnkanon-1 redis-cluster]# cp /usr/local/redis/bin /usr/local/redis-cluster/redis-6379
[root@cnkanon-1 redis-cluster]# cp /usr/local/redis/bin /usr/local/redis-cluster/redis-6380
修改 redis.conf 配置文件,增加集群配置信息。
# 修改端口号,并启用集群模式
[root@cnkanon-1 redis-cluster]# vi redis-6379/redis.conf # 修改 port=6379,cluster-enabled=yes
daemonize yes
bind 192.168.56.11
port 6379
pidfile /var/run/redis-cluster/redis-6379.pid
cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 5000
[root@cnkanon-1 redis-cluster]# vi redis-6380/redis.conf # 修改 port=6380,cluster-enabled=yes
daemonize yes
bind 192.168.56.11
port 6380
pidfile /var/run/redis-cluster/redis-6380.pid
cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 5000
分别启动并验证 6379、6380 两个服务。
# 启动 redis-6379
[root@cnkanon-1 redis-cluster]# cd redis-6379/
[root@cnkanon-1 redis-6379]# ./redis-server redis.conf
3191:C 22 Oct 2019 18:29:23.847 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3191:C 22 Oct 2019 18:29:23.847 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3191, just started
3191:C 22 Oct 2019 18:29:23.847 # Configuration loaded
# 启动 redis-6380
[root@cnkanon-1 redis-6379]# cd ../redis-6380
[root@cnkanon-1 redis-6380]# ./redis-server redis.conf
3587:C 22 Oct 2019 18:29:56.101 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3587:C 22 Oct 2019 18:29:56.101 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3587, just started
3587:C 22 Oct 2019 18:29:56.101 # Configuration loaded
# 检查端口是否启动
[root@cnkanon-1 redis-cluster]# netstat -ntlp | grep -E "6379|6380"
tcp 0 0 192.168.56.11:6379 0.0.0.0:* LISTEN 3192/./redis-server
tcp 0 0 192.168.56.11:6380 0.0.0.0:* LISTEN 3588/./redis-server
tcp 0 0 192.168.56.11:16379 0.0.0.0:* LISTEN 3192/./redis-server
tcp 0 0 192.168.56.11:16380 0.0.0.0:* LISTEN 3588/./redis-server
2.3 第二步
同样的方法,将第 2 台、第 3 台虚拟机安装 1 主 1 备 redis 服务,此处为了方便,直接使用 scp 命令从第 1 台虚拟机 192.168.56.11
上将 redis-cluster
复制过来并启动 redis-6379、redis-6380
。
# 从第 1 台虚拟机复制 redis-cluster 目录
[root@cnkanon-2 local]# scp -r root@192.168.56.11:/usr/local/redis-cluster/ .
[root@cnkanon-2 local]# cd redis-cluster
[root@cnkanon-2 redis-cluster]# ll
总用量 0
drwxr-xr-x. 2 root root 212 10月 18 14:58 redis-6379
drwxr-xr-x. 2 root root 212 10月 18 14:58 redis-6380
# 启动 redis-6379
[root@cnkanon-2 redis-cluster]# cd redis-6379/
[root@cnkanon-2 redis-6379]# ./redis-server redis.conf
3191:C 22 Oct 2019 18:29:23.847 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3191:C 22 Oct 2019 18:29:23.847 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3191, just started
3191:C 22 Oct 2019 18:29:23.847 # Configuration loaded
# 启动 redis-6380
[root@cnkanon-2 redis-6379]# cd ../redis-6380
[root@cnkanon-2 redis-6380]# ./redis-server redis.conf
3587:C 22 Oct 2019 18:29:56.101 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3587:C 22 Oct 2019 18:29:56.101 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3587, just started
3587:C 22 Oct 2019 18:29:56.101 # Configuration loaded
# 检查端口是否启动
[root@cnkanon-2 redis-cluster]# netstat -ntlp | grep -E "6379|6380"
tcp 0 0 192.168.56.12:6379 0.0.0.0:* LISTEN 3192/./redis-server
tcp 0 0 192.168.56.12:6380 0.0.0.0:* LISTEN 3588/./redis-server
tcp 0 0 192.168.56.12:16379 0.0.0.0:* LISTEN 3192/./redis-server
tcp 0 0 192.168.56.12:16380 0.0.0.0:* LISTEN 3588/./redis-server
第 3 台虚拟机安装方式同上,此处不再赘述。
4、启动集群
在第 1 台虚拟机上 redis-6379 目录中使用如下命令启动集群
# 基于工程自动构建镜像
[root@cnkanon-1 redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --cluster-replicas 1
如果出现如下错误,说明 redis 实例上的数据不为空,需要删除 node-xxxx.conf 文件并使用 redis-cli 逐个连接 6 个 redis 实例,执行 flushdb 清空数据。
[ERR] Node 192.168.56.11:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
删除 node-6379.conf、node-6380.conf 文件,并清空第 1 台虚拟上 6379、6380 上 redis 实例的数据。
# 删除 node-6379.conf 文件
[root@cnkanon-1 redis-6379]# rm node-6379.conf
rm:是否删除普通文件 "node-6379.conf"?y
# 清空 redis-6379 数据
[root@cnkanon-1 redis-6379]# ./redis-cli -h 192.168.56.11 -p 6379
192.168.56.11:6379> flushdb
OK
192.168.56.11:6379> exit
# 删除 node-6380.conf 文件
[root@cnkanon-1 redis-6380]# rm node-6380.conf
rm:是否删除普通文件 "node-6380.conf"?y
# 清空 redis-6380 数据
[root@cnkanon-1 redis-6380]# ./redis-cli -h 192.168.56.11 -p 6380
192.168.56.11:6380> flushdb
OK
192.168.56.11:6380> exit
依次对第 2 台、第 3 台虚拟机进行同样操作,完成后,再次启动集群。
[root@cnkanon-1 redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --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 192.168.56.12:6380 to 192.168.56.11:6379
Adding replica 192.168.56.13:6380 to 192.168.56.12:6379
Adding replica 192.168.56.11:6380 to 192.168.56.13:6379
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
slots:[0-5460] (5461 slots) master
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
slots:[5461-10922] (5462 slots) master
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
slots:[10923-16383] (5461 slots) master
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
Can I set the above configuration? (type 'yes' to accept):
可以看到,192.168.56.11:6379、192.168.56.12:6379、192.168.56.13:6379 分别为第 1、2、3 个 master 节点
192.168.56.12:6380 为 192.168.56.11:6379 的 slave 节点,192.168.56.13:6380 为 192.168.56.12:6379 的 slave 节点,192.168.56.11:6380 为 192.168.56.13:6379 的 slave 节点
0-5460 个哈希槽分配给了第 1 个主从节点,5461-10922 个哈希槽分配给了第 2 个主从节点,10923-16381 个哈希槽分配给了第 3 个主从节点
最后一句 Can I set the above configuration? (type 'yes' to accept):
意思是是否能看见上述分配的配置信息,输入 yes
后会开始等待所有剩下节点加入集群
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
....
**(重要):**如果此处一直处于等待中,说明剩下的节点未被发现或通知到加入集群,需要使用 redis-cli
分别登录各节点,并输入 cluster meet 192.168.56.11:6379
。
# 登录第 1 台虚拟机 192.168.56.11:6380
[root@cnkanon-1 redis-6379]# ./redis-cli -h 192.168.56.11 -p 6380
192.168.56.11:6380> cluster meet 192.168.56.11:6379
OK
192.168.56.11:6379> exit
[root@cnkanon-1 redis-6379]#
# 依次登录剩下所有节点,并输入此信息
返回集群启动窗口,会发现所有节点已成功发现并加入集群了
[root@cnkanon-1 redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --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 192.168.56.12:6380 to 192.168.56.11:6379
Adding replica 192.168.56.13:6380 to 192.168.56.12:6379
Adding replica 192.168.56.11:6380 to 192.168.56.13:6379
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
slots:[0-5460] (5461 slots) master
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
slots:[5461-10922] (5462 slots) master
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
slots:[10923-16383] (5461 slots) master
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
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 192.168.56.11:6379)
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
slots: (0 slots) slave
replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
slots: (0 slots) slave
replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
slots: (0 slots) slave
replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@cnkanon-1 redis-6379]#
四、集群常用指令
1、查看集群信息
使用命令 redis-cli -c -h ip -p port
连接到集群,并使用 cluster info
查看集群信息,**注意:**此处的参数多了 -c
表示连接到 cluster。
[root@cnkanon-1 redis-6379]# ./redis-cli -c -h 192.168.56.11 -p 6379
192.168.56.11: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:3868
cluster_stats_messages_pong_sent:3916
cluster_stats_messages_sent:7784
cluster_stats_messages_ping_received:3911
cluster_stats_messages_pong_received:3868
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:7784
可以看到 cluster_state:ok
集群状态正常,成功分配了 16384 个槽位 cluster_slots_ok:16384
,集群大小为 3 cluster_size:3
。
[root@cnkanon-1 redis-6379]# ./redis-cli -c -h 192.168.56.11 -p 6379
192.168.56.11:6379> cluster nodes
b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379@16379 master - 0 1571815929000 5 connected 10923-16383
006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380@16380 slave 039436617b5cf1b342bb6f81ee52d8dbf41130a6 0 1571815928599 6 connected
32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380@16380 slave 3ada712db1d5487e6ed8e468a73c225ec7024609 0 1571815930219 4 connected
039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379@16379 master - 0 1571815930510 3 connected 5461-10922
6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380@16380 slave b686b70f648f0f3c7b6a5f52f6047aef51160943 0 1571815929202 5 connected
3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379@16379 myself,master - 0 1571815930000 1 connected 0-5460
可以看到 3 个 master,3 个 slave 节点以及相应的槽位分配 。
2、重新分配槽位
如果执行 redis-cli --cluster create ip:port --cluster-replicas 1
成功创建cluster,但输出如下错误信息,意思是不是所有的 slot 都被节点覆盖到,官方的建议是使用fix修复。
redis-cli --cluster fix
3、查看槽位分配情况
可以使用如下指令检查集群状态 slots 详细分配 。
redis-cli --cluster check host:port
例如:检查 192.168.56.11:6379 的槽位分配情况
[root@cnkanon-1 redis-6379]# ./redis-cli --cluster check 192.168.56.11:6379
192.168.56.11:6379 (3ada712d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.13:6379 (b686b70f...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.12:6379 (03943661...) -> 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.56.11:6379)
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
slots: (0 slots) slave
replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
slots: (0 slots) slave
replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
slots: (0 slots) slave
replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4、查看集群状态
执行redis-cli --cluster info ip:port
检查集群状态。
[root@cnkanon-1 redis-6379]# ./redis-cli --cluster info 192.168.56.11:6379
192.168.56.11:6379 (3ada712d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.13:6379 (b686b70f...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.12:6379 (03943661...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
5、其它命令
Cluster Manager Commands:
create host1:port1 ... hostN:portN
--cluster-replicas <arg>
check host:port
info host:port
fix host:port
reshard host:port
--cluster-from <arg>
--cluster-to <arg>
--cluster-slots <arg>
--cluster-yes
--cluster-timeout <arg>
--cluster-pipeline <arg>
rebalance host:port
--cluster-weight <node1=w1...nodeN=wN>
--cluster-use-empty-masters
--cluster-timeout <arg>
--cluster-simulate
--cluster-pipeline <arg>
--cluster-threshold <arg>
add-node new_host:new_port existing_host:existing_port
--cluster-slave
--cluster-master-id <arg>
del-node host:port node_id
call host:port command arg arg .. arg
set-timeout host:port milliseconds
import host:port
--cluster-from <arg>
--cluster-copy
--cluster-replace
help
add-node 方法可以添加节点,还可以指定是主节点还是从节点。del-node 是删除指定节点。还有其它的 fix 修复命令,reshard 重新分配slot等等。