最近进行了Redis集群的学习和配置,可以参考了以下博客:
- 主线
Redis集群的原理和搭建
redis5.0后放弃了Ruby的集群方式,大大简化了集群的构建复杂度
redis5.0集群(用3台虚拟机模拟3主3备)(未尝试)
Redis容灾部署哨兵(sentinel)机制配置详解及原理介绍(配置)
Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)(深入原理)
- 分支
redis集群密码设置
redis requires ruby version 2.2.2的解决方案
Linux下面如何运行.sh文件?
1.1 哈希槽分配异常
- 出现情况
有以下出错提示:
Please fix your cluster problems before resharding
- 出现场景
在哈希槽没有被正常分配时出现,这个时候重新分配哈希槽的时候会出现上述的出错提示
- 解决方法
这个时候使用指令
/bin/redis-trib fix 127.0.0.1:7000
此时该指令会帮你重新分配哈希槽,分配后集群便会恢复正常。
1.2 结点标志异常
- 出现情况
在redis-cli
客户端中使用cluster nodes
出现:
78641a9cf0098e1c5c07821266dcd1feae21bcd3 :0 fail,noaddr - 1530942381678 1530942361875 0 disconnected
- 出现场景
因为使用kill直接杀掉进程导致结点标志没有被清除,而残留下来的结点标志可能会占用哈希槽造成不必要的错误。
- 解决方法
可以在redis-cli
客户端中使用指令cluster reset
重新设置结点标志。使用cluster meet
添加主节点,使用./redis-trip add-node --slave
添加子节点。
此时还存在哈希槽分配不均的问题,使用./redis-trib reshard
重新分配哈希槽,最后使用done结束选择数据源。
1.3 等待加入
- 出现情况
在给集群增加节点或者新建集群是会出现以下提示并且处于无限等待中:
Waiting for the cluster to join....................................
- 解决方法
在本篇文章中有以下方法[How to solve redis cluster “Waiting for the cluster to join” issue?]:
1、 由于结点间数据的传输需要一个端口,而这个端口是与客户端端口分开的,一般是客户端端口上加上1000。比如客户端端口为6379,那么服务端端口则为16379。使用iptable -F
关闭防火墙或者开启相对应的端口即可
2、检查redis.conf
中的bind
设置,将127.0.0.1移除或者将其移到LAN IP后。
在本篇文章中有以下方法[Redis 3.2.1集群搭建]()
1、在redis-cli -c -p 700*
中分别进入redis各节点的客户端命令窗口, 依次输入cluster meet 192.168.1.238 7000
,与进入等待状态的7000结点建立连接。
另外还有:
1、在redis.conf文件中把bind 127.0.0.1本地环回口改为物理接口.
不过以上方法测试后都失败了,最后我使用了1.2节的方法解决了该问题。
1.4 配置错误
- 出现情况
使用指令./redis-trip check ip:port
时出现以下提示
Redis [ERR] Nodes don’t agree about configuration!
- 出现场景
在哈西槽分配异常时可能出现,比如已经fail掉的节点占有哈西槽
- 解决方法
这个时候使用指令
/bin/redis-trib fix 127.0.0.1:7000
此时该指令会帮你重新分配哈希槽,分配后集群便会恢复正常。
1.5 指定地址不合法
- 出现情况
配置完所有主节点后,报
" ERR Invalid node address specified"
- 解决方法
由于redis-trib.rb 对域名或主机名支持不好,故在创建集群的时候要使用ip:port的方式
redis-trib.rb create ip1:port1 ip2:port2 ip3:port3
1.6 slot插槽被占用了
- 出现情况
创建集群时报
err slot 0 is already busy (redis::commanderror)
- 解决方法
这是由于之间创建集群没有成功,需要将nodes.conf
和dir
里面的文件全部删除(注意不要删除了redis.conf
)
或者用redis-cli
登录到每个节点执行flushall
和cluster reset
就可以了。
1.6 已经拥有插槽
- 出现情况
ERR I'm already the owner of hash slot 0 (Redis::CommandError)
- 解决方法
搭建集群前时,以前redis的旧数据和配置信息没有清理干净。这个时候使用下列指令进行修复
/bin/redis-trib fix 127.0.0.1:7000
1.7 语法错误
- 出现情况
在用redis-tirb
工具进行reshard 的时候,报如下错误:
[ERR] Calling MIGRATE ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
- 出现场景
ruby gem安装的redis库,版本不能使用最新的4.x版本的,否则redis-trib reshard 127.0.0.1:7117
重新分片会报语法错误
- 解决方法
1、卸载安装的redis库,gem uninstall redis
2、安装3.x版本,gem install redis -v 3.3.5 测试3.2.1到3.3.5都可以,4.x以上的分片报错。
1.8 结点非空
- 出现情况
创建集群的时候出现以下错误提示:
[ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
- 解决方法
这是由于7000结点上还有上次集群的信息。在redus-cli
客户端状态下仍然可以看到7000结点建立的连接。
a5ec74f676af17dc88433a84975a94f06f4219fe 127.0.0.1:7000 myself,master - 0 0 10 connected 10923-16383
0eabc86d1131fb7e6c33560d71fc9e717f9ae13d 127.0.0.1:7005 slave 3ee71b59d8f4b58e463bceb4af09e9a3bc648abb 0 1558247953061 12 connected
需要将所有的nodes结点信息的文件删除,若删除后仍有该错误提示。则需要对需要建立集群的结点使用cluster reset
指令清除所有结点信息
1.9 redis主从复制失败等
- 出现情况
包括主从复制失败、主从故障转移失败、哨兵机制无法检测到监测主节点的slave结点、slave结点中的master_link_status为down。
- 解决方法
存在以下情况:
1、 防火墙拦截了端口的访问
2、conf文件中没有用bind绑定主服务器地址
可以查看该文章寻找解决方案:redis主从复制失败(master_link_status:down)
1.10 其他