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只读
二、部署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节点