Valkey哨兵(Sentinel)架构compose搭建

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

# 哨兵节点 (部署3个,配置基本一致)
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. 生产环境避坑指南

  1. Quorum(法定人数)配置: * 在 sentinel monitor <name> <host> <port> <quorum> 中,quorum 通常设置为 (N/2) + 1。3 个哨兵设为 2。
  2. 持久化: * 生产环境务必挂载数据卷(Volumes)到 /data,防止容器重启导致数据丢失。
  3. 网络隔离: * 不要将 6379 和 26379 端口直接暴露在公网。使用 Docker 网络或内网 VPC。
  4. 哨兵重写问题: * 哨兵启动后会修改 sentinel.conf(例如将 valkey-master 替换为实际 IP)。在容器环境中,建议将配置文件拷贝到容器内部可读写的地方,或者赋予宿主机文件写权限。
  5. 客户端连接方式: * 程序不能直接连接主节点的 6379 端口,必须连接哨兵的 26379 端口,由哨兵告知谁是当前的 Master