基于Docker搭建Redis7.0主从哨兵集群高可用模式

Docker搭建Redis主从哨兵模式

本文基于docker-compose、Redis7.0版本搭建Redis1主2从3哨兵高可用集群,不同版本redis配置文件略有差异,请参考官方文档Github地址Redis官网地址

如下图可以看出Sentinel的主要职责是监控redis集群状态然后告诉客户端,当master不可用时自动选举slave为master实现集群高可用,客户端最终操作的是redis服务
在这里插入图片描述

目录结构如下

redis-sentinel
├── redis
│   └── docker-compose.yml
└── sentinel
    ├── docker-compose.yml
    ├── sentinel1.conf
    ├── sentinel2.conf
    ├── sentinel3.conf
    └── sentinel.conf

一、主从搭建

1、在redis目录下创建docker-compose.yml,具体内容如下

########## 集群 DOCKER/NAT 支持 ##############
这里的slave-announce-ip、slave-announce-port是宿主机IP与端口,不设置的话哨兵模式下访问的是容器内IP端口,不能为外部应用提供服务

version: '3'
services:
  master:
    image: redis:7.0
    container_name: redis-master
    command: bash -c "redis-server  --requirepass 123456  --masterauth 123456 --protected-mode no --slave-announce-ip 192.168.0.110 --slave-announce-port 6379"
    ports:
      - 6379:6379
  slave1:
    image: redis:7.0
    container_name: redis-slave-1
    ports:
      - 6380:6379
    command:  bash -c "redis-server --slaveof redis-master 6379 --masterauth 123456  --requirepass 123456 --protected-mode no --slave-announce-ip 192.168.0.110 --slave-announce-port 6380"
  slave2:
    image: redis:7.0
    container_name: redis-slave-2
    ports:
      - 6381:6379
    command: bash -c "redis-server --slaveof redis-master 6379 --masterauth 123456 --requirepass 123456 --protected-mode no --slave-announce-ip 192.168.0.110 --slave-announce-port 6381"

2、启动并验证Redis主从是否创建成功

在终端redis目录下执行docker-compose up -d,docker ps可查看服务,docker exec -it redis-master bash 进入容器可查看redis主从信息,此时master负责写,slave只读
s

二、部署sentinel哨兵集群

在sentinel目录下创建docker-compose.yml、sentinel1.conf、sentinel2.conf、sentinel3.conf,具体内容如下

1、编写sentinel.conf配置文件

protected-mode no
port 26379
dir "/tmp"
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.0.110 6379 2
# 用于验证主节点和副本的密码
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

2、将编sentinel.conf复制3份

sentinel1.conf
sentinel2.conf
sentinel3.conf

目前运行哨兵必须指定配置文件sentinel.conf,以下截图为官方说明
在这里插入图片描述

3、编写哨兵docker-compose.yml内容

version: '3'
services:
  sentinel1:
    image: redis:7.0
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis:7.0
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis:7.0
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
    
networks:
  default:
    external:
      name: redis_default

哨兵和副本自动发现

Sentinel 使用 Redis 的 Pub/Sub 功能来发现监控master的其他Sentinel并与其他 Sentinel 保持连接,以便相互检查彼此的可用性并交换消息。因此,您不需要在运行的每个 Sentinel 实例中配置其他 Sentinel 地址信息。

同样,您也不需要配置master的slave节点列表,因为 Sentinel 会自动发现此列表以查询 Redis

4、启动并验证sentinel是否创建成功

在sentinel目录下执行docker-compose up -d,docker ps可查看服务,docker exec -it redis-sentinel-1 bash 进入容器可查看哨兵集群信息
在这里插入图片描述

# 最上面的是主节点IP端口与集群名称等信息
# num-slaves 表示有2个从节点
# num-other-sentinels 表示除此之外还有两个哨兵

5、集群高可用验证

停掉mysql-master服务,等待10秒,再次查看集群信息,发现mysql-salve-2升级成了master节点
在这里插入图片描述


版权声明:本文为weixin_43972854原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。