述
上文中,我们搭建了一个一主二仆的一个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
5for 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了:
创建docker自定义网桥
执行命令1
docker network create redis-net
查看docker所有的网桥,命令是:1
docker network ls
运行各个redis节点
ok,上面的步骤完成之后,就可以启动容器了
定义一个初始值变量,用于叠加ip1
execsh='/usr/local/bin/redis-cli --cluster create '
这里这个路径就是这样的,不要去修改
然后循环运行6个容器1
2
3
4
5
6
7
8
9for 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
如下图,就创建成功了
完成后执行下面的命令.往上面声明的那个变量后面追加--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
进入容器创建集群
上面我们启动完成之后,都是单独的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
返回如下:
红色圈住的地方,需要手动输入个yes.
校验是否创建成功
在容器内使用redis-cli连接1
redis-cli -p 7000 -c
-c就表示集群模式
如图,我这里获取数据,他自动跳到了7002节点上面
接下来我们把7002节点先停了
然后,再次进到7000容器内部,再get数据,如下:
7002关闭了之后,又跳到了7005上面了
搭建成功
最后再把刚停掉的节点启动起来,至此,一个三主三从的redis集群就搭建好了,参考文章,这里还有一种更方便的方法,可以看看