简介
基于docker redis:5.0.4介绍redis集群搭建过程中踩过的坑,按照传统的方式6个节点(6001~6006),3主3从。
特别注意:redis镜像内部用户id为999
第一步:创建配置文件
自己找一个目录,创建文件夹 redis-cluster
在redis-cluster文件夹中创建6个配置文件,最好放在单独的文件夹中
mkdir redis-cluster
cd redis-cluster
mkdir 6001 6002 6003 6004 6005 6006
第二步:获取配置文件
最好从redis5.0.4版本的安装包中获取,这样可以避免不必要的错误(思路:下载tar.gz包,解压 tar -zxf *.tar.gz),将获取到的redis.conf文件复制到6001文件夹中并编辑。
port 6379 #端口
cluster-enabled yes #启用集群模式
cluster-config-file nodes.conf
cluster-node-timeout 5000 #超时时间
appendonly yes #是否持久化
daemonize no #后台运行,这里特别注意,不要设置为yes
protected-mode no #非保护模式
pidfile /var/run/redis_6379.pid
#bind * 注掉所有的bind
#备注:一个主机可能有多个网卡,bind意在只接受bind指定地址所在网卡的数据请求,不配置bind默认接收所有网卡的请求
特别说明:
1:daemonize在docker中最好不要设置为yes,在docker的容器中如果设置为后台运行,那么redis启动完后,容器就停止了。
第三步:配置文件批量copy
将刚改的配置文件,在6002~6006文件夹中都复制一份
第四步:启动服务
docker run -p 6001:6001 -p 16001:16001 -v /root/redis-cluster/6001/redis.conf:/etc/redis/redis.conf --name redis6001 -d redis:5.0.4 redis-server /etc/redis/redis.conf
docker run -p 6002:6002 -p 16002:16002 -v /root/redis-cluster/6002/redis.conf:/etc/redis/redis.conf --name redis6002 -d redis:5.0.4 redis-server /etc/redis/redis.conf
docker run -p 6003:6003 -p 16003:16003 -v /root/redis-cluster/6003/redis.conf:/etc/redis/redis.conf --name redis6003 -d redis:5.0.4 redis-server /etc/redis/redis.conf
docker run -p 6004:6004 -p 16004:16004 -v /root/redis-cluster/6004/redis.conf:/etc/redis/redis.conf --name redis6004 -d redis:5.0.4 redis-server /etc/redis/redis.conf
docker run -p 6005:6005 -p 16005:16005 -v /root/redis-cluster/6005/redis.conf:/etc/redis/redis.conf --name redis6005 -d redis:5.0.4 redis-server /etc/redis/redis.conf
docker run -p 6006:6006 -p 16006:16006 -v /root/redis-cluster/6006/redis.conf:/etc/redis/redis.conf --name redis6006 -d redis:5.0.4 redis-server /etc/redis/redis.conf
第五步:创建集群
redis-cli --cluster create 172.16.240.183:6001 172.16.240.183:6002 172.16.240.183:6003 172.16.240.183:6004 172.16.240.183:6005 172.16.240.183:6006 --cluster-replicas 1
特别注意:
1:创建集群时一直处于Waiting for the cluster to join 状态,此时极有可能是防火墙问题,暂时关掉防火墙,然后重新创建,此时如果成功,说明就是防火墙问题,然后再针对防火墙进行配置。(注意:docker服务启动状态下,如果防火墙发生启动和关闭,此时docker启动会报防火墙相关错误,不必担心,重启docker就好,命令 systemctl restart docker, 不同操作系统命令可能不同)
2:创建集群成功,但是用当前redis集群所在主机进行操作时,可以存取,但是通过程序访问时可能会访问不到(比如java、springboot等)
原因(可能):在Redis Cluster集群模式下,集群的节点需要告诉用户或者是其他节点连接自己的IP和端口。默认情况下,Redis会自动检测自己的IP和从配置中获取绑定的PORT,告诉客户端或者是其他节点。而在Docker环境中,如果使用的不是host网络模式,在容器内部的IP和PORT都是隔离的(获取容器中的ip和端口),那么客户端和其他节点无法通过节点公布的IP和PORT建立连接。
解决:
(1)、redis容器创建时,改用host网络模式,但是这种我个人理解不怎么靠谱,待学习后再做补充。
(2)、redis4.0以后增加了如下所示配置,该配置可以配置对外发布的ip、端口、总线端口。此时要特别注意,这里发布的ip会告诉你的应用,用这个ip进行访问,所以你开放的ip要保证你的应用可以访问到。
cluster-announce-ip:要宣布的IP地址。
cluster-announce-port:要宣布的数据端口。
cluster-announce-bus-port:要宣布的集群总线端口