使用Docker容器搭建redis集群(多台机器部署)
搭建Redis集群之前需知:
1.Docker 容器启动redis必须设置network为host模式,[redis官方文档有说明](https://redis.io/topics/cluster-tutorial);
2.redis集群至少需要6个节点(3个master,3个slave);
3.redis主从节点是算法分配的,无需指定,所以我们的服务名称都叫redis-master;
- 这里我们使用最方便的搭建方式,使用docker-compose来搭建,对docker-compose不了解的朋友可以先行了解一下,[docker-compose学习地址](https://www.runoob.com/docker/docker-compose.html)。
- 在搭建Redis集群之前,我们需要修改下Redis的配置文件redis.conf,[redis.conf文件官方下载地址。](https://github.com/antirez/redis/blob/5.0/redis.conf)
- 1.将redis.conf复制6份,分别命名为nodes-6391.conf,nodes-6392.conf....
- 2.修改配置文件中的属性,主要是修改了一些集群配置和运行端口,端口号需要按需修改为6391~6396:
```
# 开启集群功能
cluster-enabled yes
# 设置运行端口
port 6391
# 设置节点超时时间,单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6391.conf"
```
- 然后我们需要编写docker-compose.yml文件用于编排6个Redis容器,具体属性的作用可以参考下面的注释。
- 为了体现集群的可用性,我们在两台服务器上部署6个redis节点,1台服务器部署3个节点。
---
- ++服务器1 docker-compose.yml 编排++
```
version: "3"
services:
redis-master1:
image: redis:latest # 基础镜像
container_name: redis-master1 # 容器名称
working_dir: /config # 切换工作目录
environment: # 环境变量
- PORT=6391 # 会使用config/nodes-${PORT}.conf这个配置文件
stdin_open: true # 标准输入打开
tty: true # 后台运行不退出
restart: always #服务器启动时会自动重启
network_mode: host # 使用host模式
privileged: true # 拥有容器内命令执行的权限
volumes:
- ./config:/config # 将同级目录下的config目录映射到容器/config目录
entrypoint: # 设置服务默认的启动程序
- /bin/bash
- redis.sh
redis-master2:
image: redis:latest
working_dir: /config
container_name: redis-master2
environment:
- PORT=6392
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- ./config:/config
entrypoint:
- /bin/bash
- redis.sh
redis-master3:
image: redis:latest
container_name: redis-master3
working_dir: /config
environment:
- PORT=6393
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- ./config:/config
entrypoint:
- /bin/bash
- redis.sh
```
---
- ++服务器2 docker-compose.yml 编排++
```
version: "3"
services:
redis-master1:
image: redis:latest # 基础镜像
container_name: redis-master1 # 容器名称
working_dir: /config # 切换工作目录
environment: # 环境变量
- PORT=6395 # 会使用config/nodes-${PORT}.conf这个配置文件
stdin_open: true # 标准输入打开
tty: true # 后台运行不退出
restart: always #服务器启动时会自动重启
network_mode: host # 使用host模式
privileged: true # 拥有容器内命令执行的权限
volumes:
- ./config:/config #配置文件目录映射到宿主机
entrypoint: # 设置服务默认的启动程序
- /bin/bash
- redis.sh
redis-master2:
image: redis:latest
working_dir: /config
container_name: redis-master2
environment:
- PORT=6396
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- ./config:/config # 将同级目录下的config目录映射到/config
entrypoint:
- /bin/bash
- redis.sh
redis-master3:
image: redis:latest
working_dir: /config
container_name: redis-master3
environment:
- PORT=6394
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- ./config:/config
entrypoint:
- /bin/bash
- redis.sh
```
- 从docker-compose.yml和redis配置文件中我们可以看到,我们的Redis容器分别运行在两台机器的6391~6396这6个端口之上,同时还以redis.sh脚本作为该容器的启动脚本。
- redis.sh脚本的作用是根据environment环境变量中的PORT属性,以指定配置文件来启动Redis容器,shell脚本如下:
```
redis-server /config/nodes-${PORT}.conf
```
- 将编排好的配置文件分别上传到服务器(10.10.1.114,10.10.1.49)的redis-cluster目录中
```
[runner_tts@cloud-nlp redis-cluster]$ tree
.
├── config
│ ├── nodes-6391.conf
│ ├── nodes-6392.conf
│ ├── nodes-6393.conf
│ ├── nodes-6394.conf
│ └── redis.sh
└── docker-compose.yml
```
- 使用docker-compose命令启动容器,并查看日志。
```
docker-compose up -d;docker-compose logs -f
```
- 如果成功启动,输出如下信息:
```
[runner@cloud-49 redis-cluster]$ docker-compose up -d;docker-compose logs -f
Creating redis-master2 ... done
Creating redis-master3 ... done
Creating redis-master1 ... done
Attaching to redis-master1, redis-master3, redis-master2
```
- 两台服务器成功启动后,进入一个Redis容器中,初始化容器Redis集群。
```
# 进入Redis容器
docker exec -it redis-master1 /bin/bash
# 初始化Redis集群命令
redis-cli --cluster create \
10.10.1.114:6391 10.10.1.114:6392 10.10.1.114:6393 \
10.10.1.49:6394 10.10.1.49:6395 10.10.1.49:6396 \
--cluster-replicas 1
```
- 集群创建过程中会让你确认配置,输入yes确认即可。
```
[runner_tts@cloud-nlp redis-cluster]$ docker exec -it redis-master1 bash
root@cloud-nlp:/config# redis-cli --cluster create \
> 10.10.1.114:6391 10.10.1.114:6392 10.10.1.114:6393 \
> 10.10.1.49:6394 10.10.1.49:6395 10.10.1.49:6396 \
> --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.10.1.49:6396 to 10.10.1.114:6391
Adding replica 10.10.1.114:6393 to 10.10.1.49:6394
Adding replica 10.10.1.49:6395 to 10.10.1.114:6392
M: 9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391
slots:[0-5460] (5461 slots) master
M: 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392
slots:[10923-16383] (5461 slots) master
S: c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393
replicates 059e3f7863e3af09af2ca086e4bbd05052116ce2
M: 059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394
slots:[5461-10922] (5462 slots) master
S: 15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395
replicates 653cdb539e3a75f14a8dd4fc375236f5c8233fdc
S: 7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396
replicates 9764989e0a38ba063e3740a933cb2c41ef20827a
Can I set the above configuration? (type 'yes' to accept): yes
```
- Redis集群创建成功后会输出如下信息。
```
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.......
>>> Performing Cluster Check (using node 10.10.1.114:6391)
M: 9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395
slots: (0 slots) slave
replicates 653cdb539e3a75f14a8dd4fc375236f5c8233fdc
S: c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393
slots: (0 slots) slave
replicates 059e3f7863e3af09af2ca086e4bbd05052116ce2
S: 7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396
slots: (0 slots) slave
replicates 9764989e0a38ba063e3740a933cb2c41ef20827a
M: 059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
- 我们可以看到:
```
10.10.1.114:6391,10.10.1.114:6392,10.10.1.49:6394 三个node为master
10.10.1.49:6395,10.10.1.114:6393,10.10.1.49:6396 三个node为slave
```
- 创建成功后我们可以使用redis-cli命令连接到其中一个Redis服务;
```
# 集群模式启动
redis-cli -c -p 6391
```
- 通过cluster nodes命令可以查看节点信息。
```
127.0.0.1:6391> cluster nodes
653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392@16392 master - 0 1586934357415 2 connected 10923-16383
15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395@16395 slave 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 0 1586934356412 5 connected
c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393@16393 master - 0 1586934355410 7 connected 5461-10922
7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396@16396 slave 9764989e0a38ba063e3740a933cb2c41ef20827a 0 1586934354908 6 connected
059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394@16394 slave c3d6364b03d848ac567cec713659c9304ea568e7 0 1586934355108 7 connected
9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391@16391 myself,master - 0 1586934355000 1 connected 0-5460
```
- 通过cluster info命令可以查看集群状态信息。
```
127.0.0.1:6391> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2919
cluster_stats_messages_pong_sent:54
cluster_stats_messages_fail_sent:3
cluster_stats_messages_sent:2976
cluster_stats_messages_ping_received:54
cluster_stats_messages_pong_received:33
cluster_stats_messages_fail_received:1
cluster_stats_messages_received:88
```
- 到此,Redis集群搭建完成。