6、docker-compose编排Redis哨兵,实现高可用

概述

本文依赖: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

总结

主节点密码和从节点密码还有哨兵监控的主节点的密码一定要相同,否则,会让你的从节点主观下线的。
在这里插入图片描述

发布了264 篇原创文章 · 获赞 23 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Edu_enth/article/details/103679784