Valkey 的哨兵(Sentinel)架构与 Redis 哨兵完全一致,其核心目的是实现高可用性(High Availability)。在主节点故障时,哨兵会自动进行故障转移(Failover),将其中一个从节点提升为新的主节点。
1. Valkey 哨兵架构原理
哨兵模式通常由两部分组成:Valkey 数据节点(Master/Slave)和 Valkey Sentinel 节点。
核心功能:
- 监控(Monitoring): 哨兵会不断检查主节点和从节点是否运作正常。
- 通知(Notification): 当某个节点出现问题时,哨兵可以通过 API 通知管理员或其他应用程序。
- 自动故障转移(Automatic Failover): 如果主节点宕机,哨兵会推选出一个从节点,并将其升级为主节点。
- 配置提供者(Configuration Provider): 客户端连接哨兵来获取当前主节点的地址。
2. Docker Compose 生产部署方案
在生产环境中,建议至少部署 3 个哨兵节点以避免脑裂(Split-brain)问题。以下是一个包含 1 主、1 从、3 哨兵的经典高可用部署示例。
2.1目录结构
1 2 3 4 5 6 7 8
| valkey-deploy/ ├── docker-compose.yml ├── valkey/ │ └── valkey.conf └── sentinel/ └── s1/sentinel.conf └── s2/sentinel.conf └── s3/sentinel.conf
|
2.2docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| services: valkey-master: image: valkey/valkey:7.2 container_name: valkey-master command: valkey-server /usr/local/etc/valkey/valkey.conf ports: - "6379:6379" volumes: - ./data/master:/data - ./valkey/valkey.conf:/usr/local/etc/valkey/valkey.conf networks: - valkey-net
valkey-replica: image: valkey/valkey:7.2 container_name: valkey-replica command: valkey-server /usr/local/etc/valkey/valkey.conf --replicaof valkey-master 6379 ports: - "6380:6379" depends_on: - valkey-master volumes: - ./data/replica:/data - ./valkey/valkey.conf:/usr/local/etc/valkey/valkey.conf networks: - valkey-net
sentinel1: &sentinel image: valkey/valkey:7.2 container_name: valkey-sentinel-1 command: valkey-sentinel /etc/valkey/sentinel.conf ports: - "26379:26379" volumes: - ./sentinel/s1:/etc/valkey depends_on: - valkey-master networks: - valkey-net
sentinel2: <<: *sentinel container_name: valkey-sentinel-2 ports: - "26380:26379" volumes: - ./sentinel/s2:/etc/valkey sentinel3: <<: *sentinel container_name: valkey-sentinel-3 ports: - "26381:26379" volumes: - ./sentinel/s3:/etc/valkey networks: valkey-net: driver: bridge
|
3. 核心配置文件
valkey/valkey.conf (基础配置)
1 2 3 4 5 6 7 8
| bind 0.0.0.0 port 6379 protected-mode no # 生产环境建议开启持久化 appendonly yes # 如果有密码则开启如下配置 # requirepass yourpassword # masterauth yourpassword
|
sentinel/sentinel.conf (关键配置)
注意: 哨兵会自动重写此文件,确保容器运行用户有写权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| port 26379 dir /tmp
# 允许解析 hostname sentinel resolve-hostnames yes # 宣告 hostname sentinel announce-hostnames yes
# 监控名为 mymaster 的主节点,2 表示至少需要 2 个哨兵同意才能判定主节点客观下线 sentinel monitor mymaster valkey-master 6379 2 # 判定节点下线的毫秒数 sentinel down-after-milliseconds mymaster 5000 # 故障转移超时时间 sentinel failover-timeout mymaster 60000 # 同时同步新主节点的从节点数量 sentinel parallel-syncs mymaster 1 # 如果有密码则配置如下 #sentinel auth-pass mymaster yourpassword
|
4. 生产环境避坑指南
- Quorum(法定人数)配置: * 在
sentinel monitor <name> <host> <port> <quorum> 中,quorum 通常设置为 (N/2) + 1。3 个哨兵设为 2。
- 持久化: * 生产环境务必挂载数据卷(Volumes)到
/data,防止容器重启导致数据丢失。
- 网络隔离: * 不要将 6379 和 26379 端口直接暴露在公网。使用 Docker 网络或内网 VPC。
- 哨兵重写问题: * 哨兵启动后会修改
sentinel.conf(例如将 valkey-master 替换为实际 IP)。在容器环境中,建议将配置文件拷贝到容器内部可读写的地方,或者赋予宿主机文件写权限。
- 客户端连接方式: * 程序不能直接连接主节点的 6379 端口,必须连接哨兵的 26379 端口,由哨兵告知谁是当前的 Master。