Docker部署Redis集群详解【主从复制 + 哨兵模式】

前言

注意:该文章不会讲解Redis集群搭建的原理,只讲述如何通过Docker容器快速部署搭建Redis主从 + 哨兵模式的集群

准备工作:

  • 一台云服务器 or 本地虚拟机(CentOS和Ubuntu都可以)
  • 安装好Docker环境(Docker、DockerCompose),参考6.3章节:https://blog.csdn.net/weixin_46594796/article/details/122750009
  • 关闭防火墙、开放将要使用的安全组(6379,6380,6381)

主从复制(1主2从)

这个操作很简单,在opt目录下创建docker-compose.yml文件,注释很详细,就不啰嗦了,内容如下:

version: '3.3'

# Docker网络:bridge驱动(默认) 
networks:
  redis-net:
    driver: bridge

services:
  # 主Redis
  redis-master:
    # Docker镜像版本
    image: redis:6.2.5
    # Docker容器名称
    container_name: redis-master
    # 主库Redis启动命令,密码为:123456
    command: redis-server --requirepass 123456
    # 宿主机与Docker容器的端口映射
    ports:
      - "6379:6379"
    # 容器所在的网络
    networks:
      - redis-net
  
  # 从Redis1
  redis-slave1:
    # Docker镜像版本
    image: redis:6.2.5
    # Docker容器名称
    container_name: redis-slave1
    # 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
    command: redis-server --slaveof redis-master 6379 --masterauth 123456
    # 宿主机与Docker容器的端口映射
    ports:
      - "6380:6379"
    # 启动该服务前先启动 redis-master
    depends_on:
      - redis-master
    # 容器所在的网络
    networks:
      - redis-net

  # 从Redis2
  redis-slave2:
    # Docker镜像版本
    image: redis:6.2.5
    # Docker容器名称
    container_name: redis-slave2
    # 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
    command: redis-server --slaveof redis-master 6379 --masterauth 123456
    # 启动该服务前先启动 redis-master
    depends_on:
      - redis-master
    # 宿主机与Docker容器的端口映射
    ports:
      - "6381:6379"
    # 容器所在的网络
    networks:
      - redis-net

直接启动Redis主从集群:

docker-compose up -d

查看三个Redis节点启动状态:

docker ps

通过Redis客户端为主Redis库插入一条数据后发现,从库也会同步主库中的数据了!

2、哨兵模式(3哨兵)

首先,在opt目录下创建config文件夹:

# 创建config目录
cd opt
mkdir config

重新调整docker-compose.yml,加入3个哨兵节点配置,然后docker-compose up -d启动:

version: '3.3'

# Docker网络:bridge驱动(默认) 
networks:
  redis-net:
    driver: bridge

services:
  # 主Redis
  redis-master:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-master
    # 主库Redis启动命令,密码为:123456
    command: redis-server --requirepass 123456
    # 宿主机与Docker容器的端口映射
    ports:
      - "6379:6379"
    volumes:
      - /opt/config/master.conf:/etc/redis/master.conf
    # 容器所在的网络
    networks:
      - redis-net
  
  # 从Redis1
  redis-slave1:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-slave1
    # 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
    command: redis-server --slaveof redis-master 6379 --masterauth 123456
    # 宿主机与Docker容器的端口映射
    ports:
      - "6380:6379"
    volumes:
      - /opt/config/slave1.conf:/etc/redis/slave1.conf
    # 启动该服务前先启动 redis-master
    depends_on:
      - redis-master
    # 容器所在的网络
    networks:
      - redis-net

  # 从Redis2
  redis-slave2:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-slave2
    # 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
    command: redis-server --slaveof redis-master 6379 --masterauth 123456
    # 启动该服务前先启动 redis-master
    depends_on:
      - redis-master
    # 宿主机与Docker容器的端口映射
    ports:
      - "6381:6379"
    volumes:
      - /opt/config/slave2.conf:/etc/redis/slave2.conf
    # 容器所在的网络
    networks:
      - redis-net

  # Redis哨兵1
  redis-sentinel1:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-sentinel-1
    # 启动命令:配置哨兵节点,监控主节点redis-master
    command: redis-sentinel /etc/redis/sentinel.conf
    # 宿主机与Docker容器的端口映射
    ports:
      - "26379:26379"
    volumes:
      - /opt/config/sentinel1.conf:/etc/redis/sentinel.conf
    # 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    # 容器所在的网络
    networks:
      - redis-net

  # Redis哨兵2
  redis-sentinel2:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-sentinel-2
    # 启动命令:配置哨兵节点,监控主节点redis-master
    command: redis-sentinel /etc/redis/sentinel.conf
    # 宿主机与Docker容器的端口映射
    ports:
      - "26380:26379"
    volumes:
      - /opt/config/sentinel2.conf:/etc/redis/sentinel.conf
    # 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    # 容器所在的网络
    networks:
      - redis-net

  # Redis哨兵3
  redis-sentinel3:
    # Docker镜像版本
    image: redis:latest
    # Docker容器名称
    container_name: redis-sentinel-3
    # 启动命令:配置哨兵节点,监控主节点redis-master
    command: redis-sentinel /etc/redis/sentinel.conf
    # 宿主机与Docker容器的端口映射
    ports:
      - "26381:26379"
    volumes:
      - /opt/config/sentinel3.conf:/etc/redis/sentinel.conf
    # 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    # 容器所在的网络
    networks:
      - redis-net

在opt目录下创建sentinel.conf哨兵配置文件,将下方内容拷贝到文件中(根据情况自行调整):

port 26379
dir /tmp

# Sentinel 监视一个名为 mymaster 的主服务器(主Redis判断为失效至少需要 2 个 Sentinel 投票)
sentinel monitor mymaster <主Redis的IP> 6379 2 

# 授权主Redis密码
sentinel auth-pass mymaster 123456

# 指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 30000

# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

将该配置文件拷贝三份(如果有同名文件先删除),文件名分别是:

  • sentinel1.conf
  • sentinel2.conf
  • sentinel3.conf

重启DockerCompose文件,依次执行下方命令:

docker-compose down
docker-compose up -d

接下来准备测试,通过docker ps查看一下6个节点运行情况:
Docker部署Redis集群详解【主从复制 + 哨兵模式】_第1张图片
停掉Redis主机点,看看是否会选举从节点为主节点:

# 停止主Redis节点
docker stop redis-master

# 查看哨兵节点日志
docker logs -f c277bfa6f0a8

下图可以看到,哨兵节点进行了投票选举,端口为6381的Redis从节点晋升为主节点
Docker部署Redis集群详解【主从复制 + 哨兵模式】_第2张图片
进入到6381的Redis容器内部,通过info命令查看当前节点身份:

# 进入Docker容器内部
docker exec -it 9b13c3a74734 redis-cli

# 查看身份
info

可以看到,6381的Redis节点变成了Master身份,哨兵进行了故障转移,重新选举
Docker部署Redis集群详解【主从复制 + 哨兵模式】_第3张图片

你可能感兴趣的:(docker,redis,docker-compose,主从复制)