如何通过Docker Compose部署含Redis Stack模块的Redis Sentinel?
使用Docker Compose部署带Redis Stack模块的Redis Sentinel集群
架构说明
我们将部署包含1个主节点、2个从节点和3个哨兵节点的集群:
- 主节点采用
redis/redis-stack-server镜像(内置Redis Search、Redis JSON等Stack模块) - 从节点基于同镜像,自动同步主节点的模块与数据
- 哨兵节点使用官方
redis镜像,配置规则监控主节点状态
Docker Compose配置文件
创建docker-compose.yml文件,内容如下:
version: '3.8' services: # Redis 主节点(带Stack模块) redis-master: image: redis/redis-stack-server:latest container_name: redis-master ports: - "6379:6379" - "8001:8001" # Redis Insight 控制台端口 volumes: - redis-master-data:/data command: redis-server --port 6379 --appendonly yes --loadmodule /opt/redis-stack/lib/redisearch.so --loadmodule /opt/redis-stack/lib/rejson.so healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 3 # Redis 从节点1 redis-slave-1: image: redis/redis-stack-server:latest container_name: redis-slave-1 ports: - "6380:6379" volumes: - redis-slave-1-data:/data command: redis-server --port 6379 --appendonly yes --slaveof redis-master 6379 --loadmodule /opt/redis-stack/lib/redisearch.so --loadmodule /opt/redis-stack/lib/rejson.so depends_on: redis-master: condition: service_healthy # Redis 从节点2 redis-slave-2: image: redis/redis-stack-server:latest container_name: redis-slave-2 ports: - "6381:6379" volumes: - redis-slave-2-data:/data command: redis-server --port 6379 --appendonly yes --slaveof redis-master 6379 --loadmodule /opt/redis-stack/lib/redisearch.so --loadmodule /opt/redis-stack/lib/rejson.so depends_on: redis-master: condition: service_healthy # Sentinel 节点1 redis-sentinel-1: image: redis:latest container_name: redis-sentinel-1 ports: - "26379:26379" volumes: - ./sentinel.conf:/etc/redis/sentinel.conf command: redis-sentinel /etc/redis/sentinel.conf depends_on: redis-master: condition: service_healthy redis-slave-1: condition: service_started redis-slave-2: condition: service_started # Sentinel 节点2 redis-sentinel-2: image: redis:latest container_name: redis-sentinel-2 ports: - "26380:26379" volumes: - ./sentinel.conf:/etc/redis/sentinel.conf command: redis-sentinel /etc/redis/sentinel.conf depends_on: redis-master: condition: service_healthy redis-slave-1: condition: service_started redis-slave-2: condition: service_started # Sentinel 节点3 redis-sentinel-3: image: redis:latest container_name: redis-sentinel-3 ports: - "26381:26379" volumes: - ./sentinel.conf:/etc/redis/sentinel.conf command: redis-sentinel /etc/redis/sentinel.conf depends_on: redis-master: condition: service_healthy redis-slave-1: condition: service_started redis-slave-2: condition: service_started volumes: redis-master-data: redis-slave-1-data: redis-slave-2-data:
哨兵配置文件(sentinel.conf)
在同一目录下创建sentinel.conf文件,内容如下:
port 26379 dir /tmp sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
配置说明:
sentinel monitor mymaster redis-master 6379 2:监控名为mymaster的主节点,需至少2个哨兵同意才触发故障转移down-after-milliseconds:主节点无响应5秒后标记为不可用failover-timeout:故障转移超时时间10秒parallel-syncs:故障转移后同时同步数据的从节点数量
部署步骤
- 将上述两个文件(
docker-compose.yml和sentinel.conf)放在同一目录 - 启动集群:
docker-compose up -d - 查看容器运行状态:
docker-compose ps
验证部署
检查主节点的Stack模块是否加载:
docker exec -it redis-master redis-cli module list输出需包含
search和ReJSON模块验证从节点主从同步状态:
docker exec -it redis-slave-1 redis-cli info replication查看
master_link_status字段值应为up检查哨兵集群状态:
docker exec -it redis-sentinel-1 redis-cli -p 26379 sentinel master mymaster输出会显示主节点信息及哨兵集群状态
测试故障转移:
停止主节点容器:docker stop redis-master等待几秒后,查看哨兵选出的新主节点:
docker exec -it redis-sentinel-1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster输出会显示新主节点的IP和端口
内容的提问来源于stack exchange,提问作者nadavtsa
相关产品推荐
相关产品推荐

