Docker-Redis-三主三从集群架构搭建

上文中,我们搭建了一个一主二仆的一个Redis架构,在实际生产环境中,我们往往需要搭建一个redis集群,那本文来看一下,基于docker搭建一个三主三从的redis集群

环境准备

一开始,准备还是用上面文章中拉下来的3.2.9版本的redis,结果在搭建集群的时候出了一些问题,可能是配置的原因,最后也没有深入去研究,所以这里还是用一个新的版本.5.0.0来搭建

然后拉一个redis5.0.0版本的下来

1
docker pull redis:5.0.0

创建集群配置文件

/usr/docker/redis-cluster下创建一个文件(这个路径是可以自定义的),redis-cluster.tmpl,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#redis端口
port ${PORT}
#关闭保护模式,允许外网访问
protected-mode no
# 开启集群模式
cluster-enabled yes
#集群配置名
cluster-config-file nodes.conf
#超时时间
cluster-node-timeout 5000
#搭建集群主机的外网ip
cluster-announce-ip ${IP}
#节点映射端口
cluster-announce-port ${PORT}
#节点总线端
cluster-announce-bus-port 1${PORT}
#持久化模式
appendonly yes

创建每个节点的配置文件和文件夹

首先需要两个变量,一个是我们的ip地址,一个是刚刚的目录,命令如下:

1
ip=xxx.xxx.xx.xx

1
redisdir="/usr/docker/redis-cluster"

变量搞定之后,就是循环创建文件夹和文件了,命令如下:

1
2
3
4
5
for port in `seq 7000 7005`; do \
mkdir -p ${redisdir}/${port}/conf \
&& PORT=${port} IP=${ip} envsubst < ./redis-cluster.tmpl > ${redisdir}/${port}/conf/redis.conf \
&& mkdir -p ${redisdir}/${port}/data; \
done

执行完毕之后,随便打开一个看下,下面这样子,变量都被替换掉就ok了:

image

创建docker自定义网桥

执行命令

1
docker network create redis-net

查看docker所有的网桥,命令是:

1
docker network ls

运行各个redis节点

ok,上面的步骤完成之后,就可以启动容器了

定义一个初始值变量,用于叠加ip

1
execsh='/usr/local/bin/redis-cli --cluster create '

这里这个路径就是这样的,不要去修改

然后循环运行6个容器

1
2
3
4
5
6
7
8
9
for port in `seq 7000 7005`; do \
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
-v ${redisdir}/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v ${redisdir}/${port}/data:/data \
--privileged=true \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis:5.0.0 redis-server /usr/local/etc/redis/redis.conf; \
execsh=${execsh}`docker inspect redis-${port} | grep "IPAddress" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o`:${port}' '
done

如下图,就创建成功了
image

完成后执行下面的命令.往上面声明的那个变量后面追加--cluster-replicas 1

1
execsh=${execsh}'--cluster-replicas 1'

最后将拼接好的命令打印到控制台,后面进入到redis容器中需要用到

1
echo ${execsh}

返回值应该是这样的:

1
/usr/local/bin/redis-cli --cluster create 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005 --cluster-replicas 1

这个返回的数据复制下来,等下要用

查看已启动的容器

看一下6个容器是不是都启动了,如下:

1
docker ps

image

进入容器创建集群

上面我们启动完成之后,都是单独的redis服务,并不是一个集群,然后我们先进入redis-7000这个容器的内部,命令如下:

1
docker exec -ti redis-7000 /bin/bash

然后执行我们上面复制下来的那个shell脚本

1
/usr/local/bin/redis-cli --cluster create 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005 --cluster-replicas 1

返回如下:
image

红色圈住的地方,需要手动输入个yes.

校验是否创建成功

在容器内使用redis-cli连接

1
redis-cli -p 7000 -c

-c就表示集群模式

image
如图,我这里获取数据,他自动跳到了7002节点上面

接下来我们把7002节点先停了

image

然后,再次进到7000容器内部,再get数据,如下:
image

7002关闭了之后,又跳到了7005上面了

搭建成功

最后再把刚停掉的节点启动起来,至此,一个三主三从的redis集群就搭建好了,参考文章,这里还有一种更方便的方法,可以看看