## 前言
使用docker-compose和redis官方镜像和第三方redis-trib镜像组建3主3从的redis集群并设置密码。
## 构建文件结构
```
#新建文件夹
mkdir -p /mnt/docker/redis
#在redis文件夹下新建docker-compose.yml文件
cd /mnt/docker/redis
touch docker-compose.yml
#新建一个模板文件
touch redis_cluster.tmpl
```
## 构件基础配置
输入指令
```
vim redis_cluster.tmpl
```
编写redis_cluster.tmpl文件
```
# redis端口
port ${PORT}
# 添加访问认证
requirepass 1234
#如果主节点开启了访问认证,从节点访问主节点需要认证;
masterauth 1234
# 关闭保护模式
protected-mode no
# 开启集群
cluster-enabled yes
# 集群节点配置
cluster-config-file nodes.conf
# 超时
cluster-node-timeout 15000
# 集群节点IP host模式为宿主机IP
cluster-announce-ip 127.0.0.1
# 集群节点端口 6061 - 6066
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
# 开启 appendonly 备份模式
appendonly yes
```
>注意:
>- cluster-announce-ip处的ip请填写自己服务器的ip。
>- cluster-announce-port与cluster-announce-bus-port两处的端口配置为集群所需端口配置。如果需要开启外网访问,请保证将此处各个端口可以正常访问。
批量创建配置文件和数据目录,终端运行以下命令:
```
for port in `seq 6061 6066`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis_cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
```
>注意:此处的6061-6066为redis连接端口,可更改为自己定义的端口,此端口对应redis_cluster.tmpl文件中的${PORT}端口。
## 编写docker-compose.yml文件
直接贴出,此处使用的网桥是host。
```yml
version: '3' services: node1: image: redis:5.0.10 container_name: redis1 restart: always volumes:
./6061/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6061/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" node2: image: redis:5.0.10 container_name: redis2 restart: always volumes:
./6062/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6062/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" node3: image: redis:5.0.10 container_name: redis3 restart: always volumes:
./6063/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6063/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" node4: image: redis:5.0.10 container_name: redis4 restart: always volumes:
./6064/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6064/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" node5: image: redis:5.0.10 container_name: redis5 restart: always volumes:
./6065/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6065/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host" node6: image: redis:5.0.10 container_name: redis6 restart: always volumes:
./6066/conf/redis.conf:/usr/local/etc/redis/redis.conf
./6066/data:/data command: redis-server /usr/local/etc/redis/redis.conf network_mode: "host"
```
## 启动运行
在redis目录下(即docker-compose.yml同级目录)执行
```
docker-compose up -d
```
查看容器运行情况
```
docker-compose ps
```
## 连接集群
进入其中一个容器
```
docker exec -it redis1 bash
```
集群配置比较简单,只需一条命令
```
redis-cli -a 1234 --cluster create ip:6061 ip:6062 ip:6063 ip:6064 ip:6065 ip:6066 --cluster-replicas 1
```
>此处ip替换成实际ip地址,中间需要用yes来同意集群方案出现选择提示信息,输入 yes。
至此一个高可用的 Redis Cluster 集群搭建完成,如下图所示,该集群中包含 6 个 Redis 节点,3 主 3 从。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。
## 验证集群
在容器内输入指令
```
redis-cli -c -a 1234 -h 127.0.0.1 -p 6061
```
查看集群信息和节点信息
```
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
```
源文件:
```bash
127.0.0.1:6061> cluster nodes 06851aa134d50096d82a434eced9194233b5204e 127.0.0.1:6063@16063 slave 8b33f273386c9504ef8bd10b005e24825b3b9596 0 1567671901000 4 connected a42297b65f7101fc9e4941ef8a0e65080d1b6338 127.0.0.1:6065@16065 slave 0aa20378d14e3ef0859815196cbafa67e1001d0e 0 1567671901581 6 connected e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 127.0.0.1:6062@16063 master - 0 1567671902582 3 connected 10923-16383 0aa20378d14e3ef0859815196cbafa67e1001d0e 127.0.0.1:6066@16066 myself,master - 0 1567671901000 1 connected 0-5460 8b33f273386c9504ef8bd10b005e24825b3b9596 127.0.0.1:6061@16061 master - 0 1567671902383 2 connected 5461-10922 fe355eed99100197f43d1216d1de82643dd496a5 127.0.0.1:6064@16064 slave e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 0 1567671901380 5 connected
```
再测试一下set和get,另外可以看到,结点会自己切换,并且6061端口set和数据可以在6062端口get到
## 集群写入数据简单测试
- 随便登录一个集群节点
```bash
redis-cli -c -p 6061 -a 你的密码
写入数据 ```bash
127.0.0.1:6063> set test 1 -> Redirected to slot [7800] located at 127.0.0.1:6061 OK 127.0.0.1:6061> get test "1" 127.0.0.1:6061> del test (integer) 1
```
可以看到,集群中任意节点写入数据,在其他任意节点都能读到。
#### 后记
至此使用多机环境基于 Docker Compose 搭建 Redis Cluster 就到这里。虽然整体搭建过程感觉比起之前并没有简化太多。但是,如果我们想要停止并删除 Redis Cluster 集群环境,之前的方式就需要一个个去操作,而 Docker Compose 只需要一个 docker-compose down 命令的操作即可。文章参考:[参考1][1],[参考2][2] [1]: https://segmentfault.com/a/1190000021710597#item-7 [2]: https://my.oschina.net/u/4126211/blog/4555576
Docke搭建Redis集群