- 准备集群环境:
docker-79
、docker-80
、docker-81
- 拉取镜像:
docker pull bitnami/redis-cluster:latest
3. 在任意文件夹下新建 compose.yml 脚本:redis_compose.yml
异常
SELECT is not allowed in cluster mode
打开连接,提示:SELECT is not allowed in cluster mode
这是因为redis在单机模式下redis.conf配置文件中默认的数据库数量是16个,在集群模式下这个配置是不起作用的,集群客户端是不支持多数据库db的,只有一个数据库默认是SELECT 0;redis集群版只使用db0,select命令虽然能够支持select 0。其他的db都会返回错误。
CLUSTERDOWN Hash slot not served
使用 cluster info
看下redis集群状态:
可以看到集群状态为 fail
,并且下面的槽点数是 0 ,这就很不正常了。
依次进入容器内部:docker exec -it 容器ID bash
执行:redis-cli -c -h 172.17.0.1 -p 6379
正常可以连接上redis,然后执行:cluster meet 172.17.0.1 6379
这个IP(172.17.0.1
) 为docker 内部默认的网络IP:
如果没有密码,会直接提示OK
如果有密码 需要输入: auth redis密码
这个meet 命令就很秀,是为了让集群内部的节点互相认识下??? 那就接着操作另外两台服务器的IP,也让他们互相认识下。
走完这一步,发现并没有解决问题,尝试客户端写入值进去,仍然提示这个异常。
然后在容器内执行:redis-cli --cluster info 192.168.104.79:6379 -a huauN@2021
,其中 huauN@2021
为 redis 集群密码,如果没有密码,则可以不用加 -a 密码
,发现 slots 槽 为空,这就是为什么会上面的错误的问题了。
root@docker-80:/# redis-cli --cluster info 192.168.104.79:6379 -a huauN@2021
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.104.79:6379 (6ce9026c...) -> 0 keys | 0 slots | 0 slaves.
[OK] 0 keys in 1 masters.
0.00 keys per slot on average.
root@docker-80:/#
接着使用 redis-cli --cluster fix
进行集群修复
root@docker-80:/#
root@docker-80:/# redis-cli --cluster fix 192.168.104.79:6379 -a huauN@2021
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.104.79:6379 (6ce9026c...) -> 0 keys | 0 slots | 0 slaves.
[OK] 0 keys in 1 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.104.79:6379)
M: 6ce9026c9f438f8025323bf13787e43f08dc33bd 192.168.104.79:6379
slots: (0 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.
>>> Fixing slots coverage...
The following uncovered slots have no keys across the cluster:
[0-16383]
Fix these slots by covering with a random node? (type 'yes' to accept): yes
>>> Covering slot 660 with 192.168.104.79:6379
>>> Covering slot 4315 with 192.168.104.79:6379
>>> Covering slot 13760 with 192.168.104.79:6379
>>> Covering slot 10315 with 192.168.104.79:6379
然后会让输入确认是否修复槽:Fix these slots by covering with a random node? (type 'yes' to accept):
,这里输入 yes
就会自动修复槽了,等待滚动输出结束,看下节点信息,如下图,槽数量为16384,即为正常单节点槽数。
这时候,直接查看另外两台机器的槽点,可以看到,也都已经正常了。
这时,使用客户端连接测试redis 可正常使用:
另外两台机器上也自动存在该key:
这时,再看集群状态,也已经变成ok了: