版本:redis-3.0.5 redis-3.2.0 redis-3.2.9
参考:http://redis.io/topics/cluster-tutorial。
目录
5.3. OOM相关:vm.overcommit_memory 4
5.4. /sys/kernel/mm/transparent_hugepage/enabled 4
11.3. jedis(java cluster client) 11
11.4. r3c(C++ cluster client) 12
17.2. redis-trib.rb rebalance 15
1. 前言
本文参考官方文档而成:http://redis.io/topics/cluster-tutorial。经测试,安装过程也适用于redis-3.2.0。
2. 部署计划
依据官网介绍,部署6个redis节点,为3主3从。3台物理机每台都创建2个redis节点:
服务端口 |
IP地址 |
配置文件名 |
6379 |
192.168.0.251 |
redis-6379.conf |
6379 |
192.168.0.252 |
redis-6379.conf |
6379 |
192.168.0.253 |
redis-6379.conf |
6380 |
192.168.0.251 |
redis-6380.conf |
6380 |
192.168.0.252 |
redis-6380.conf |
6380 |
192.168.0.253 |
redis-6380.conf |
疑问:3台物理机,会不会主和从节点分布在同一个物理机上?
3. 目录结构
redis.conf为从https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下载的配置文件。redis-6379.conf和redis-6380.conf指定了服务端口,两者均通过include复用(包含)了redis.conf。
本文将redis安装在/data/redis(每台机器完全相同,同一台机器上的多个节点对应相同的目录和文件,并建议将bin目录加入到环境变量PATH中,以简化后续的使用):
/data/redis |-- bin | |-- redis-benchmark | |-- redis-check-aof | |-- redis-check-dump | |-- redis-cli | |-- redis-sentinel -> redis-server | `-- redis-server |-- conf | |-- redis-6379.conf | |-- redis-6380.conf | `-- redis.conf `-- log
3 directories, 9 files |
4. 编译安装
打开redis的Makefile文件,可以看到如下内容:
PREFIX?=/usr/local INSTALL_BIN=$(PREFIX)/bin INSTALL=install |
Makefile中的“?=”表示,如果该变量之前没有定义过,则赋值为/usr/local,否则什么也不做。
如果不设置环境变量PREFIX或不修改Makefile中的值,则默认安装到/usr/local/bin目录下。建议不要使用默认配置,而是指定安装目录,如/data/redis-3.0.5:
$ make $ make install PREFIX=/data/redis-3.0.5 $ ln -s /data/redis-3.0.5 /data/redis $ mkdir /data/redis/conf $ mkdir /data/redis/log $ mkdir /data/redis/data |
5. 修改系统参数
5.1. 修改最大可打开文件数
修改文件/etc/security/limits.conf,加入以下两行:
* soft nofile 102400 * hard nofile 102400
# End of file |
其中102400为一个进程最大可以打开的文件个数,当与RedisServer的连接数多时,需要设定为合适的值。
修改后,需要重新登录才会生效,如果是crontab,则需要重启crontab,如:service crond restart,有些平台可能是service cron restart。
5.2. TCP监听队列大小
即TCP listen的backlog大小,“/proc/sys/net/core/somaxconn”的默认值一般较小如128,需要修改大一点,比如改成32767。立即生效还可以使用命令:sysctl -w net.core.somaxconn=32767。
要想永久生效,需要在文件/etc/sysctl.conf中增加一行:net.core.somaxconn = 32767,然后执行命令“sysctl -p”以生效。
Redis配置项tcp-backlog的值不能超过somaxconn的大小。
5.3. OOM相关:vm.overcommit_memory
如果“/proc/sys/vm/overcommit_memory”的值为0,则会表示开启了OOM。可以设置为1关闭OOM,设置方法请参照net.core.somaxconn完成。
5.4. /sys/kernel/mm/transparent_hugepage/enabled
默认值为“[always] madvise never”,建议设置为never,以开启内核的“Transparent Huge Pages (THP)”特性,设置后redis进程需要重启。为了永久生效,请将“echo never > /sys/kernel/mm/transparent_hugepage/enabled”加入到文件/etc/rc.local中。
6. 配置redis
从https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下载配置文件(也可直接复制源代码包中的redis.conf,然后在它的基础上进行修改),在这个基础上,进行如下表所示的修改(配置文件名redis-6379.conf中的6379建议设置为实际使用的端口号):
配置项 |
值 |
配置文件 |
说明 |
port |
6379 |
redis-6379.conf |
客户端连接端口,并且总有一个刚好大于10000的端口,这个大的端口用于主从复制和集群内部通讯。 |
cluster-config-file |
nodes-6379.conf |
|
|
pidfile |
/var/run/redis-6379.pid |
只有当daemonize值为yes时,才有意义;并且这个要求对目录/var/run有写权限,否则可以考虑设置为/tmp/redis-6379.pid。 |
|
dir |
/data/redis/data/6379 |
|
|
dbfilename |
dump-6379.rdb |
位于dir指定的目录下 |
|
appendfilename |
"appendonly-6379.aof" |
|
|
logfile |
/data/redis/log/redis-6379.log |
日志文件,包含目录和文件名 |
|
loglevel |
verbose |
|
日志级别 |
port |
6380 |
redis-6380.conf |
|
cluster-config-file |
nodes-6380.conf |
|
|
pidfile |
/var/run/redis-6380.pid |
|
|
dir |
/data/redis/data/6380 |
AOF和RDB文件存放目录 |
|
dbfilename |
dump-6380.rdb |
RDB文件名 |
|
appendfilename |
appendonly-6380.aof |
AOF文件名 |
|
logfile |
/data/redis/log/redis-6380.log |
|
|
loglevel |
verbose |
日志级别 |
|
cluster-enabled |
yes |
redis.conf |
表示以集群方式运行,为no表示以非集群方式运行 |
cluster-node-timeout |
3000 |
单位为毫秒: repl-ping-slave-period+ (cluster-node-timeout* cluster-slave-validity-factor) |
|
cluster-slave-validity-factor |
0 |
如果要最大的可用性,值设置为0 |
|
repl-ping-slave-period |
1 |
slave ping master的时间间隔,单位为秒 |
|
repl-timeout |
10 |
复制超时,单位为秒,须大于repl-ping-slave-period的值 |
|
slave-read-only |
yes |
slave是否只读 |
|
slave-serve-stale-data |
yes |
当slave与master断开连接,slave是否继续提供服务 |
|
slave-priority |
100 |
slave权重值,当master挂掉,只有权重最大的slave接替master |
|
appendonly |
yes |
当同时写AOF或RDB,则redis启动时只会加载AOF,AOF包含了全量数据 |
|
daemonize |
yes |
相关配置项pidfile |
|
protected-mode |
no |
3.2.0新增的配置项,默认值为yes,限制从其它机器登录Redis server,而只能从127.0.0.1登录。为保证redis-trib.rb工具的正常运行,需要设置为no,完成后可以改回yes,但每次使用redis-trib.rb都需要改回为no。要想从非127.0.0.1访问也需要改为no。 |
|
tcp-backlog |
32767 |
取值不能超过系统的/proc/sys/net/core/somaxconn |
|
auto-aof-rewrite-percentage |
100 |
设置自动rewite AOF文件(手工rewrite只需要调用命令BGREWRITEAOF) |
|
auto-aof-rewrite-min-size |
64mb |
触发rewrite的AOF文件大小,只有大于此大小时才会触发rewrite |
|
no-appendfsync-on-rewrite |
yes |
子进程在做rewrite时,主进程不调用fsync(由内核默认调度) |
|
cluster-require-full-coverage |
no |
为no表示有slots不可服务时其它slots仍然继续服务 |
|
maxmemory |
26843545600 |
|
设置最大的内存,单位为字节 |
maxmemory-policy |
volatile-lru |
|
设置达到最大内存时的淘汰策略 |
client-output-buffer-limit |
|
|
设置master端的客户端缓存 |
repl-timeout |
|
|
|
7. 启动redis实例
登录3台物理机,启动两个redis实例(启动之前,需要创建好配置中的各目录):
1) redis-server redis-6379.conf
2) redis-server redis-6380.conf
可以写一个启动脚本start-redis-cluster.sh:
#!/bin/sh
REDIS_HOME=/data/redis $REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6379.conf $REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6380.conf |
8. 创建和启动redis cluster前的准备工作
上一步启动的redis只是单机版本,在启动redis cluster之前,需要完成如下一些依赖的安装。在此之后,才可以创建和启动redis cluster。
8.1. 安装ruby
安装命令:yum install ruby
安装过程中,如提示“[y/d/N]”,请选“y”然后回车。
查看版本:
$ ruby --version ruby 2.0.0p353 (2013-11-22) [x86_64-linux] |
也可以从Ruby官网https://www.ruby-lang.org下载安装包(如ruby-2.3.1.tar.gz)来安装Ruby。截至2016/5/13,Ruby的最新稳定版本为Ruby 2.3.1。
8.2. 安装rubygems
安装命令:yum install rubygems
如果不使用yum安装,也可以手动安装RubyGems,RubyGems是一个Ruby包管理框架,它的下载网址:https://rubygems.org/pages/download。
比如下载安装包rubygems-2.6.4.zip后解压,然后进入解压生成的目录,里面有个setup.rb文件,以root用户执行:ruby setup.rb安装RubyGems。
8.3. 安装redis-3.0.0.gem
安装命令:gem install -l redis-3.0.0.gem
安装之前,需要先下载好redis-3.0.0.gem。
redis-3.0.0.gem官网:https://rubygems.org/gems/redis/versions/3.0.0
redis-3.0.0.gem下载网址:https://rubygems.org/downloads/redis-3.0.0.gem
redis-3.3.0.gem官网:https://rubygems.org/gems/redis/versions/3.3.0
9. redis-trib.rb
redis-trib.rb是redis官方提供的redis cluster管理工具,使用ruby实现。
10. 创建和启动redis集群
10.1. 复制redis-trib.rb
将redis源代码的src目录下的集群管理程序redis-trib.rb复制到/data/redis/bin目录,并将bin目录加入到环境变量PATH中,以简化后续的操作。
redis-trib.rb用法(不带任何参数执行redis-trib.rb即显示用法):
$ ./redis-trib.rb Usage: redis-trib
rebalance host:port --auto-weights --timeout --pipeline --use-empty-masters --weight --threshold --simulate add-node new_host:new_port existing_host:existing_port --slave --master-id reshard host:port --timeout --pipeline --yes --slots --to --from check host:port set-timeout host:port milliseconds call host:port command arg arg .. arg fix host:port --timeout info host:port create host1:port1 ... hostN:portN --replicas import host:port --replace --copy --from help (show this help) del-node host:port node_id
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster. |
10.2. 创建redis cluster
创建命令(3主3从):
redis-trib.rb create --replicas 1 192.168.0.251:6379 192.168.0.252:6379 192.168.0.253:6379 192.168.0.251:6380 192.168.0.252:6380 192.168.0.253:6380 |
? 参数说明:
1) create
表示创建一个redis cluster集群。
2) --replicas 1
表示为集群中的每一个主节点指定一个从节点,即一比一的复制。\
运行过程中,会有个提示,输入yes回车即可。从屏幕输出,可以很容易地看出哪些是主(master)节点,哪些是从(slave)节点:
>>> Creating cluster Connecting to node 192.168.0.251:6379: OK /usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: wrong element type nil at 0 (expected array) /usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: ignoring wrong elements is deprecated, remove them explicitly /usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.0.251:6379 192.168.0.252:6379 192.168.0.253:6379 Adding replica 192.168.0.252:6380 to 192.168.0.251:6379 Adding replica 192.168.0.251:6380 to 192.168.0.252:6379 Adding replica 192.168.0.253:6380 to 192.168.0.253:6379 M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379 slots:0-5460 (5461 slots) master M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379 slots:5461-10922 (5462 slots) master M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379 slots:10923-16383 (5461 slots) master S: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380 replicates de461d3337b17d2119b79024d57d8b119e7320a6 S: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380 replicates 150f77d1000003811fb3c38c3768526a0b25ec31 S: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380 replicates faf50658fb7b0bae64cee5371da782e0f4919eee 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.0.251:6379) M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379 slots:0-5460 (5461 slots) master M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379 slots:5461-10922 (5462 slots) master M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379 slots:10923-16383 (5461 slots) master M: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380 slots: (0 slots) master replicates de461d3337b17d2119b79024d57d8b119e7320a6 M: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380 slots: (0 slots) master replicates 150f77d1000003811fb3c38c3768526a0b25ec31 M: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380 slots: (0 slots) master replicates faf50658fb7b0bae64cee5371da782e0f4919eee [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. |
10.3. ps aux|grep redis
[test@test-168-251 ~]$ ps aux|grep redis test 3824 0.7 5.9 6742404 3885144 ? Ssl 2015 1639:13 /data/redis/bin/redis-server *:6379 [cluster] test 3831 0.5 3.9 6709636 2618536 ? Ssl 2015 1235:43 /data/redis/bin/redis-server *:6380 [cluster] |
停止redis实例,直接使用kill命令即可,如:kill 3831,重启和单机版相同,经过上述一系列操作后,重启会自动转换成cluster模式。。
11. redis cluster client
11.1. 命令行工具redis-cli
官方提供的命令行客户端工具,在单机版redis基础上指定参数“-c”即可。以下是在192.168.0.251上执行redis-cli的记录:
$ ./redis-cli -c -p 6379 127.0.0.1:6379> set foo bar -> Redirected to slot [12182] located at 192.168.0.253:6379 OK 192.168.0.253:6379> set hello world -> Redirected to slot [866] located at 192.168.0.251:6379 OK 192.168.0.251:6379> get foo -> Redirected to slot [12182] located at 192.168.0.253:6379 "bar" 192.168.0.253:6379> get hello -> Redirected to slot [866] located at 192.168.0.251:6379 "world"
查看集群中的节点: 192.168.0.251:6379> cluster nodes |
11.2. 从slaves读数据
默认不能从slaves读取数据,但建立连接后,执行一次命令READONLY ,即可从slaves读取数据。如果想再次恢复不能从slaves读取数据,可以执行下命令READWRITE。
11.3. jedis(java cluster client)
官网:https://github.com/xetorthio/jedis
编程示例:
SetHostAndPort> jedisClusterNodes = new HashSet(); //Jedis Cluster will attempt to discover cluster nodes automatically jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379)); JedisCluster jc = new JedisCluster(jedisClusterNodes); jc.set("foo", "bar"); String value = jc.get("foo"); |
11.4. r3c(C++ cluster client)
官网:https://github.com/eyjian/r3c
12. 新增节点
12.1. 添加一个新主(master)节点
先以单机版配置和启动好redis-server,然后执行命令:
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 |
执行上面这条命令时,可能遇到错误“[ERR] Sorry, can't connect to node 127.0.0.1:7006”。引起该问题的原因可能是因为ruby的版本过低(运行ruby -v可以查看ruby的版本),可以尝试升级ruby再尝试,比如ruby 1.8.7版本就需要升级。对于Redis 3.0.5和Redis 3.2.0,使用Ruby 2.3.1操作正常。请注意升级到最新版本的ruby也可能遇到这个错误。
另一个会引起这个问题的原因是从Redis 3.2.0版本开始引入了“保护模式(protected mode),防止redis-cli远程访问”,仅限redis-cli绑定到127.0.0.1才可以连接Redis server。
为了完成添加新主节点,可以暂时性的关闭保护模式,使用redis-cli,不指定-h参数(但可以指定-p参数,或者-h参数值为127.0.0.1)进入操作界面:CONFIG SET protected-mode no。
注意7006是新增的节点,而7000是已存在的节点(可为master或slave)。如果需要将7006变成某master的slave节点,执行命令:
cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e |
新加入的master节点上没有任何数据(slots,运行redis命令cluster nodes可以看到这个情况)。当一个slave想成为master时,由于这个新的master节点不管理任何slots,它不参与选举。
可以使用工具redis-trib.rb的resharding特性为这个新master节点分配slots,如:
redis-trib.rb reshard 127.0.0.1:7000,其中7000为集群中任意一个节点即可,redis-trib.rb将自动发现其它节点。
在reshard过程中,将会询问reshard多少slots:
How many slots do you want to move (from 1 to 16384)?,取值范围为1~16384,其中16384为redis cluster的拥有的slots总数,比如想只移动100个,输入100即可。如果迁移的slots数量多,应当设置redis-trib.rb的超时参数--timeout值大一点。否则,迁移过程中易遇到超时错误“[ERR] Calling MIGRATE: IOERR error or timeout reading to target instance”,导致只完成部分,可能会造成数据丢失。
接着,会提示“What is the receiving node ID?”,输入新加入的master节点ID。过程中如果遇到错误“Sorry, can't connect to node 10.225.168.253:6380”,则可能需要暂时先关闭相应的保护模式。
如果在迁移过程遇到下面这样的错误:
>>> Check for open slots... [WARNING] Node 192.168.0.3:6379 has slots in importing state (5461). [WARNING] Node 192.168.0.5:6380 has slots in migrating state (5461). [WARNING] The following slots are open: 5461 |
可以考虑使用命令“redis-trib.rb fix 192.168.0.3:6379”尝试修复。需要显示有节点处于migrating或importing状态,可以登录到相应的节点,使用命令“cluster setslot 5461 stable”修改,参数5461为问题显示的slot的ID。
12.2. 添加一个新从(slave)节点
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000 |
注意这种方式,如果添加了多个slave节点,可能导致master的slaves不均衡,比如一些有3个slave,其它只1个slave。可以在slave节点上执行redis命令“CLUSTER REPLICATE”进行调整,让它成为其它master的slave。“CLUSTER REPLICATE”带一个参数,即master ID,注意使用redis-cli -c登录到slave上执行。
上面方法没有指定7006的master,而是随机指定。下面方法可以明确指定为哪个master的slave:
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000 |
13. 删除节点
从集群中删除一个节点:
./redis-trib.rb del-node 127.0.0.1:7000 |
第一个参数为集群中任意一个节点,第二个参数为需要删除节点的ID。
成功删除后,再调用下CLUSTER FORGET:
CLUSTER FORGET |
注意如果是删除一个master节点,则需要先将它管理的slots的迁走,然后才可以删除它。
如果是master或slave机器不能连接,比如硬件故障导致无法启动,这个时候做不了del-node,只需要直接做CLUSTER 即可,在FORGET后,节点状态变成handshake。
!!!请注意,需要在所有node上执行一次“CLUSTER FORGET”,否则可能遇到被剔除node的总是处于handshake状态。
14. master机器硬件故障
这种情况下,master机器可能无法启动,导致其上的master无法连接,master将一直处于“master,fail”状态,如果是slave则处于“slave,fail”状态。
如果是master,则会它的slave变成了master,因此只需要添加一个新的从节点作为原slave(已变成master)的slave节点。完成后,通过CLUSTER FORGET将故障的master或slave从集群中剔除即可。
!!!请注意,需要在所有node上执行一次“CLUSTER FORGET”,否则可能遇到被剔除node的总是处于handshake状态。
15. 检查节点状态
redis-trib.rb check 127.0.0.1:6380
如发现如下这样的错误:
[WARNING] Node 192.168.0.11:6380 has slots in migrating state (5461).
[WARNING] The following slots are open: 5461
可以使用redis命令取消slots迁移(5461为slot的ID):
cluster setslot 5461 stable
需要注意,须登录到192.168.0.11:6380上执行redis的setslot子命令。
16. 变更主从关系
使用命令cluster replicate,参数为master节点ID,注意不是IP和端口,在被迁移的slave上执行该命令。
17. slots相关命令
CLUSTER ADDSLOTS slot1 [slot2] ... [slotN] CLUSTER DELSLOTS slot1 [slot2] ... [slotN] CLUSTER SETSLOT slot NODE node CLUSTER SETSLOT slot MIGRATING node CLUSTER SETSLOT slot IMPORTING node |
17.1. 迁移slosts
示例:将slot8从节点A迁移到节点B,有如下两种方法:
在节点B上执行:CLUSTER SETSLOT 8 IMPORTING A 或 在节点A上执行:CLUSTER SETSLOT 8 MIGRATING B |
上述操作只是将slot标记为迁移状态,完成迁移还需要执行:
CLUSTER SETSLOT NODE |
其中node-id为目标的Node ID。
17.2. redis-trib.rb rebalance
当有增减节点时,可以使用命令:
redis-trib.rb rebalance 192.168.0.31:6379 --auto-weights
做一次均衡,简单点可以只指定两个参数:“192.168.0.31:6379”为集群中已知的任何一个节点,参数“-auto-weights”表示自动权重。
18. 人工主备切换
在需要的slaves节点上执行命令:CLUSTER FAILOVER。
19. 查看集群信息
对应的redis命令为:cluster info,示例:
127.0.0.1:6381> cluster info cluster_state:ok 所有slots正常则显示为OK,否则为error cluster_slots_assigned:16384 多少slots被分配了,即多少被master管理了,16384为全部slots cluster_slots_ok:16384 有多少slots是正常的 cluster_slots_pfail:0 有多少slots可能处于异常状态,处于这个状态并不表示有问题,仍能继续提供服务 cluster_slots_fail:0 有多少slots处于异常状态,需要修复才能服务 cluster_known_nodes:10 集群中的节点数 cluster_size:3 集群中master个数 cluster_current_epoch:11 本地的当前时间变量,用于故障切换时生成独一无二的增量版本号 cluster_my_epoch:0 cluster_stats_messages_sent:4049 通过集群消息总线发送的消息总数 cluster_stats_messages_received:4051 通过过集通过群消息总线收到的消息总数 |
20. 禁止指定命令
KEYS命令很耗时,FLUSHDB和FLUSHALL命令可能导致误删除数据,所以线上环境最好禁止使用,可以在Redis配置文件增加如下配置:
rename-command KEYS "" rename-command FLUSHDB "" rename-command FLUSHALL "" |
21. 问题排查
1) 如果最后一条日志为“16367:M 08 Jun 14:48:15.560 # Server started, Redis version 3.2.0”,节点状态始终终于fail状态,则可能是aof文件损坏了,这时可以使用工具edis-check-aof --fix进行修改,如:
../../bin/redis-check-aof --fix appendonly-6380.aof
0x a1492b9b: Expected prefix '
AOF analyzed: size=2705928192, ok_up_to=2705927067, diff=1125
This will shrink the AOF from 2705928192 bytes, with 1125 bytes, to 2705927067 bytes
Continue? [y/N]: y
2) in `call': ERR Slot 16011 is already busy (Redis::CommandError)
将所有节点上的配置项cluster-config-file指定的文件删除,然后重新启;或者在所有节点上执行下FLUSHALL命令。
另外,如果使用主机名而不是IP,也可能遇到这个错误,如:“redis-trib.rb create --replicas 1 redis1:6379 redis2:6379 redis3:6379 redis4:6379 redis5:6379 redis6:6379”,可能也会得到错误“ERR Slot 16011 is already busy (Redis::CommandError)”。
3) for lack of backlog (Slave request was: 51875158284)
默认值:
# redis-cli config get repl-timeout
A) "repl-timeout"
B) "10"
# redis-cli config get client-output-buffer-limit
A) "client-output-buffer-limit"
B) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
增大:
redis-cli config set "client-output-buffer-limit" "normal 0 0 0 slave 2684354560 671088640 60 pubsub 33554432 8388608 60"
4) 复制中断场景
A) master的slave缓冲区达到限制的硬或软限制大小,与参数client-output-buffer-limit相关;
B) 复制时间超过repl-timeout指定的值,与参数repl-timeout相关。
slave反复循环从master复制,如果调整以上参数仍然解决不了,可以尝试删除slave上的aof和rdb文件,然后再重启进程复制,这个时候可能能正常完成复制。