概述
本文依赖:docker部署redis
其实这些容器依赖的镜像,是同一个,只定制一个镜像即可:
- 准备哨兵架构
三个哨兵节点。一个主节点。三个从节点。
下面会定义一个网段是192.168.1.0。
名称 | IP | 外部映射端口 | 内部端口 | 容器名称 |
---|---|---|---|---|
master_1 | 192.168.1.11 | 6381 | 6379 | redis_master1 |
slave_1 | 192.168.1.12 | 6382 | 6379 | redis_slave1 |
slave_2 | 192.168.1.13 | 6383 | 6379 | redis_slave2 |
slave_3 | 192.168.1.14 | 6384 | 6379 | redis_slave1 |
sentinel_1 | 192.168.1.15 | 26381 | 26379 | redis_sentinel1 |
sentinel_2 | 192.168.1.16 | 26382 | 26379 | redis_sentinel2 |
sentinel_3 | 192.168.1.17 | 26383 | 26379 | redis_sentinel3 |
- 准备Dockerfile
FROM redis:5.0.7-alpine
#声明匿名卷,用于外部docker run时绑定
RUN mkdir /log && chown redis:redis /log &&mkdir /conf && chown redis:redis /conf
VOLUME ["/log","/conf"]
CMD [ "redis-server", "/conf/redis.conf" ]
编译镜像
cd /root/dockersrc/dockerfile/dcp
docker build -t redis_sentinel:v1 .
- 准备网络
docker network create --subnet=192.168.1.0/24 redis_network
docker network ls
- 准备宿主机的映射目录
我的目录放在/root/dockersrc/dockerfile/dcp中,你们自己选择自己的目录。
哨兵架构,我准备了三个哨兵,一个主节点,三个从节点
cd /root/dockersrc/dockerfile/dcp
#哨兵1 sentinel1目录
mkdir -p sentinel1/redislog sentinel1/redisdata sentinel1/redisconf
#哨兵2 sentinel2目录
mkdir -p sentinel2/redislog sentinel2/redisdata sentinel2/redisconf
#哨兵3 sentinel3目录
mkdir -p sentinel3/redislog sentinel3/redisdata sentinel3/redisconf
#主节点master目录
mkdir -p master/redislog master/redisdata master/redisconf
#从节点1 slave1目录
mkdir -p slave1/redislog slave1/redisdata slave1/redisconf
#从节点2 slave2目录
mkdir -p slave2/redislog slave2/redisdata slave2/redisconf
#从节点3 slave3目录
mkdir -p slave3/redislog slave3/redisdata slave3/redisconf
- 准备配置文件
主节点和从节点准备redis.conf
哨兵节点准备sentinel.conf
这些文件可以在源码中直接复制出来:redis.5.0.7源码
修改哨兵的通用配置:sentinel.conf。然后放在对应创建的redisconf目录下。
#master_1是主节点服务的名称,在docker-compose.yml文件中定义
#哨兵1
#哨兵2
#哨兵3
protected-mode no
bind 0.0.0.0
logfile "/log/sentinel.log"
dir /data
port 26379
daemonize no
sentinel monitor mymaster master_1 6379 2
# sentinel auth-pass必须在sentinel monitor后面
sentinel auth-pass mymaster abc123
修改主节点的配置:redis.conf。然后放在对应创建的redisconf目录下。
#主节点
logfile "/log/redis.log"
dir /data
requirepass abc123 #自身密码
daemonize no
修改所以从节点的配置:redis.conf。然后放在对应创建的redisconf目录下。
#从节点1
#从节点2
#从节点3
logfile "/log/redis.log"
dir /data
requirepass abc123 #自身密码
daemonize no
masterauth abc123 #主机密码
日志文件,日志文件的目录是映射进去的,所以log文件也要在外部创建好放在redislog 目录下,给加上容器可操作的权限:
cd sentinel1/redislog
touch sentinel.log
chmod 666 sentinel.log
cd sentinel2/redislog
touch sentinel.log
chmod 666 sentinel.log
cd sentinel2/redislog
touch sentinel.log
chmod 666 sentinel.log
cd master1/redislog
touch redis.log
chmod 666 redis.log
cd slave1/redislog
touch redis.log
chmod 666 redis.log
cd slave2/redislog
touch redis.log
chmod 666 redis.log
cd slave3/redislog
touch redis.log
chmod 666 redis.log
- 准备docker-compose.yml文件
redis_sentinel:v1 是我们最开始编译的镜像。
其中镜像默认的cmd是redis-server conf/redis.conf
但是对于sentinel节点来说,需要重定义cmd:redis-sentinel conf/sentinel.conf
docker-compose.yml文件
#Docker version 19.03.5, build 633a0ea
version: '3.7'
services:
master_1:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_master1
restart: always
ports:
- "6380:6379"
- "16380:16379"
volumes:
- "/root/dockersrc/dockerfile/dcp/master/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/master/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/master/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.11
slave_1:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_slave1
restart: always
links:
- master_1
ports:
- "6381:6379"
volumes:
- "/root/dockersrc/dockerfile/dcp/slave1/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/slave1/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/slave1/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.21
slave_2:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_slave2
restart: always
links:
- master_1
ports:
- "6382:6379"
volumes:
- "/root/dockersrc/dockerfile/dcp/slave2/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/slave2/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/slave2/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.22
slave_3:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_slave3
restart: always
links:
- master_1
ports:
- "6383:6379"
volumes:
- "/root/dockersrc/dockerfile/dcp/slave3/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/slave3/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/slave3/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.23
sentinel_1:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_sentinel1
restart: always
links:
- master_1
ports:
- "26381:26379"
volumes:
- "/root/dockersrc/dockerfile/dcp/sentinel1/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/sentinel1/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/sentinel1/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.31
command: ["redis-sentinel","/conf/sentinel.conf"]
sentinel_2:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_sentinel2
restart: always
links:
- master_1
ports:
- "26382:26379"
volumes:
- "/root/dockersrc/dockerfile/dcp/sentinel2/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/sentinel2/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/sentinel2/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.32
command: ["redis-sentinel","/conf/sentinel.conf"]
sentinel_3:
stdin_open: true
tty: true
image: redis_sentinel:v1
container_name: redis_sentinel3
restart: always
links:
- master_1
ports:
- "26383:26379"
volumes:
- "/root/dockersrc/dockerfile/dcp/sentinel3/redisconf:/conf"
- "/root/dockersrc/dockerfile/dcp/sentinel3/redislog:/log"
- "/root/dockersrc/dockerfile/dcp/sentinel3/redisdata:/data"
networks:
redis-network:
ipv4_address: 192.168.1.33
command: ["redis-sentinel","/conf/sentinel.conf"]
#设置网络
networks:
# #自定义网络
# app_net:
# ipam:
# driver: default
# config:
# - subnet: "192.168.1.0/24"
# - subnet: "2001:3984:3989::/64"
#引用预先定义好的网段,在networks下面
redis-network: #内部名称
external:
name: redis_network #外部名称
- 编排服务
docker-compose up -d
docker-compose ps -a
- 验证
- 进入一个哨兵
#进入一个哨兵
docker exec -it redis_sentinel1 sh
redis-cli -p 26379
info
=》
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.11:6379,slaves=0,sentinels=3
sentinel_masters:1表示监控一个主节点
master0:name=mymaster,status=ok,address=192.168.1.11:6379,slaves=0,sentinels=3表示名称是mymaster,状态ok,从节点为0个,哨兵三个。
进入一个slave连接主节点
docker exec -it redis_slave1 sh
redis-cli
auth abc123
slaveof master_1 6379
此时再在sentinel中查看info,会发现slaves=1,
三个slave都配置完,在查看info会发现,salves=3
总结
主节点密码和从节点密码还有哨兵监控的主节点的密码一定要相同,否则,会让你的从节点主观下线的。