Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)

  1. 准备集群环境:docker-79docker-80docker-81
    Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
  2. 拉取镜像:
docker pull bitnami/redis-cluster:latest

Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
3. 在任意文件夹下新建 compose.yml 脚本:redis_compose.yml

异常

SELECT is not allowed in cluster mode

打开连接,提示:SELECT is not allowed in cluster mode
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
这是因为redis在单机模式下redis.conf配置文件中默认的数据库数量是16个,在集群模式下这个配置是不起作用的,集群客户端是不支持多数据库db的,只有一个数据库默认是SELECT 0;

redis集群版只使用db0,select命令虽然能够支持select 0。其他的db都会返回错误。
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)

CLUSTERDOWN Hash slot not served

Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
使用 cluster info 看下redis集群状态:
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
可以看到集群状态为 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:
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
如果没有密码,会直接提示OK 如果有密码 需要输入: auth redis密码
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
这个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,即为正常单节点槽数。
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
这时候,直接查看另外两台机器的槽点,可以看到,也都已经正常了。

Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
这时,使用客户端连接测试redis 可正常使用:
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)
另外两台机器上也自动存在该key:
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)

这时,再看集群状态,也已经变成ok了:
Docker Swarm 安装 Redis 集群(bitnami/redis-cluster:latest)

上一篇:Docker 搭建 Redis Cluster 集群


下一篇:自然语言处理实验—用K-means的方法对样本特征分类(含python代码和详细例子解释)