docker搭建redis-cluster

Posted yuanGrowing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker搭建redis-cluster相关的知识,希望对你有一定的参考价值。

文章目录

docker搭建redis-cluster(公网可访问)

网上很多教程,但是那些都无法在公网中进行访问,自己尝试了一番后可以了,做个记录吧。

获取redis镜像

可以从dockerhub里面找你想要的redis版本号,然后执行 docker pull redis:版本号,得到redis镜像。

redis配置

本次配置,使用的是docker网络模式中的host模式,也就是每一个docker容器的ip和主机ip相同。
本次配置希望可以做到公网访问,最终的目标redis网络结构如下。

主节点ip主节点端口从节点ip从节点端口
公网ip7300公网ip7303
公网ip7301公网ip7304
公网ip7302公网ip7305

可以创建一个专门的目录,存放后续redis-cluster搭建相关的文件和目录。我这里创建了一个script目录。后续所有的操作都是在script目录中进行的。

单个redis配置

创建一个redis-cluster.temp文件,作为每个redis配置的模板文件。

port $PORT
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 公网ip
cluster-announce-port $PORT
cluster-announce-bus-port 1$PORT
appendonly no
参数含义填入值
portredis 端口号端口号
bindip 访问白名单ip , 0.0.0.0表示任意ip
cluster-enabled开启集群模式yes/no
cluster-config-file请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够 在启动时重新读取它。总之就是照着写,不用管,是redis自己用的。nodes.conf
cluster-node-timeoutRedis群集节点可以不可用的最长时间,而不会将其视为失败。 如果主节点超过指定的时间不可达,它将由其从属设备进行故障切换。毫秒数
cluster-announce-ip集群节点的ip。个人理解是,集群中的node信息,存的就是这个ip。客户端就是在选择好目标节点后会根据这个ip向目标节点发送命令。所以,如果要公网访问,那这里的ip要填写成公网IP地址。如果是局域网访问,那就填局域网ip即可。总之,就是要填写客户端能够到达的ip。ip地址
cluster-announce-port集群节点的端口号端口号
cluster-announce-bus-portRedis集群通过总线进行节点间的数据交换,每个Redis节点都会开辟一个额外端口与总线进行TCP连接,以二进制形式进行数据交换。一般是Redis port加上10000
appendonly是否开启redis的持久化。yes/no

使用脚本生成3主3从的配置文件和目录

创建一个createdir.sh文件,批量的创建各个节点redis的配置文件和目录。

for port in $(seq 7300 7305);
do
  netport=$[port-7297];
  mkdir -p ./$port/conf && PORT=$port envsubst <./redis-cluster.temp> ./$port/conf/redis.conf && mkdir -p ./$port/data;
done

执行过后script内容如下

更详细的内容

启动各个redis容器

使用命令启动容器

docker run -p 7300:7300 -p 17300:7300 --name redis-1 
-v /root/script/7300/conf/redis.conf:/usr/local/etc/redis/redis.conf  
-v /root/script/7300/data:/data  
-d --net host 
redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
参数含义
-p 7300:7300 -p 17300:7300端口的映射
–name redis-1容器命名为redis-1
两个-v的参数应该是将容器中的目录地址映射到宿主机的实际地址中
-net host使用docker的host网络模式,各个容器的ip和宿主机ip相同
redis:6.0.9具体的redis镜像
redis-server /usr/local/etc/redis/redis.confredis指定启动文件启动,这里的文件实际是映射到了/root/script/7300/conf/redis.conf

修改端口号和目录,依次启动剩余5个容器。

docker run -p 7300:7300 -p 17300:7300 --name redis-1 -v /root/script/7300/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7300/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
docker run -p 7301:7301 -p 17301:7301 --name redis-2 -v /root/script/7301/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7301/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
docker run -p 7302:7302 -p 17302:7302 --name redis-3 -v /root/script/7302/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7302/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
docker run -p 7303:7303 -p 17303:7303 --name redis-4 -v /root/script/7303/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7303/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
docker run -p 7304:7304 -p 17304:7304 --name redis-5 -v /root/script/7304/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7304/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf
docker run -p 7305:7305 -p 17305:7305 --name redis-6 -v /root/script/7305/conf/redis.conf:/usr/local/etc/redis/redis.conf  -v /root/script/7305/data:/data  -d --net host redis:6.0.9 redis-server /usr/local/etc/redis/redis.conf

构建redis集群

通过某一台redis容器执行构建集群的命令即可

docker exec -it redis-1 redis-cli -p 7300 --cluster create 公网ip:7300 公网ip:7301 公网ip:7302 公网ip:7303 公网ip:7304 公网ip:7305 --cluster-replicas 1

公网连接校验

我的机器是在阿里云上,在本地通过阿里云的外网ip连接测试成功。执行cluster nodes如下:

可以看到node里面的ip信息是公网ip。

问题和优化

  • 执行 Waiting for the cluster to join 这一步一直卡着。

    可能是因为阿里云的端口没有打开,不止7300、7301这些要开,17300这些也要开。
  • 设置密码。
    在每个reids的配置文件中加入 masterauth password 和 requirepass password即可。

以上是关于docker搭建redis-cluster的主要内容,如果未能解决你的问题,请参考以下文章

使用docker搭建redis-cluster环境

基于docker环境搭建redis-cluster集群(多台机器)

docker-compose搭建redis-cluster集群

Docker搭建redis-cluster集群三主三备

Docker实战之Redis-Cluster集群

Docker搭建Redis4.0集群(不使用Ruby脚本)