本文档用于在一台 Linux 服务器上部署 Redis 主从复制 + Redis Sentinel:

  • Redis Master:6379
  • Redis Replica:6380、6381
  • Redis Sentinel:26379、26380、26381
  • Sentinel Master Name:mymaster
  • Sentinel Quorum:2

重要说明:单机哨兵模式只适合开发、测试、演练或资源受限场景。因为 Master、Replica 和 3 个 Sentinel 都在同一台服务器上,服务器宕机时整套 Redis 仍会不可用。生产环境应至少使用 3 个互相独立的节点部署 Sentinel,并把 Redis 主从放在不同故障域。

1. 架构说明

1.1 单机部署拓扑

┌─────────────────────────────────────────────┐
│ Linux Server                                │
│                                             │
│  Redis Master   127.0.0.1:6379             │
│       ├── replication ──> Redis Replica 1   │
│       │                    127.0.0.1:6380   │
│       └── replication ──> Redis Replica 2   │
│                            127.0.0.1:6381   │
│                                             │
│  Sentinel 1    127.0.0.1:26379             │
│  Sentinel 2    127.0.0.1:26380             │
│  Sentinel 3    127.0.0.1:26381             │
└─────────────────────────────────────────────┘

1.2 工作机制

Redis Replica 通过 replicaof 复制 Master 数据。Sentinel 负责监控 Master 和 Replica,当 Sentinel 达成故障判断并完成投票后,会把 Replica 提升为新的 Master,并重新配置旧 Master 或其他 Replica。

应用不要固定连接 6379,而应通过支持 Sentinel 的 Redis 客户端连接 Sentinel 地址列表,并使用 mymaster 发现当前 Master。

2. 环境准备

2.1 示例环境

项目示例值
操作系统Ubuntu 22.04 / Debian 12 / Rocky Linux 9
Redis 版本Redis 7.x 或 8.x
Redis 用户redis
配置目录/etc/redis
数据目录/var/lib/redis
日志目录/var/log/redis

2.2 端口规划

进程端口用途
Redis Master6379写入和读取,初始主节点
Redis Replica 16380复制节点,故障时可提升为主节点
Redis Replica 26381复制节点,故障时可提升为主节点
Sentinel 126379Sentinel 监控和服务发现
Sentinel 226380Sentinel 监控和服务发现
Sentinel 326381Sentinel 监控和服务发现

如果应用和 Redis 在同一台机器,可以使用 127.0.0.1。如果应用在其他机器,不要在 Sentinel 配置里使用 127.0.0.1,应改为 Redis 服务器的内网 IP,否则客户端从 Sentinel 获取到的 Master 地址也会是 127.0.0.1。

3. 安装 Redis

3.1 Ubuntu / Debian

sudo apt-get update
sudo apt-get install -y lsb-release curl gpg

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install -y redis

3.2 Rocky Linux / RHEL / CentOS

sudo yum install -y redis

3.3 检查版本并关闭默认服务

不同发行版默认服务名可能是 redis-server 或 redis。本文使用自定义多实例 systemd 服务,因此先停掉默认服务,避免端口冲突。

redis-server --version
redis-cli --version

sudo systemctl disable --now redis-server 2>/dev/null || true
sudo systemctl disable --now redis 2>/dev/null || true

4. 创建目录和权限

sudo useradd -r -s /sbin/nologin redis 2>/dev/null || true

sudo mkdir -p /etc/redis
sudo mkdir -p /var/lib/redis/6379 /var/lib/redis/6380 /var/lib/redis/6381
sudo mkdir -p /var/log/redis

sudo chown -R redis:redis /var/lib/redis /var/log/redis
sudo chmod 750 /var/lib/redis /var/log/redis

5. 配置 Redis Master

创建 /etc/redis/redis-6379.conf:

port 6379
bind 127.0.0.1
protected-mode yes
tcp-keepalive 300
daemonize no

pidfile /run/redis/redis-6379.pid
logfile /var/log/redis/redis-6379.log
loglevel notice
dir /var/lib/redis/6379
dbfilename dump-6379.rdb

appendonly yes
appendfilename "appendonly-6379.aof"
appendfsync everysec

requirepass <REDIS_PASSWORD>
masterauth <REDIS_PASSWORD>
replica-priority 100

replica-announce-ip 127.0.0.1
replica-announce-port 6379

说明:

  • <REDIS_PASSWORD> 替换为 Redis 数据节点访问密码。
  • masterauth 在当前节点是 Master 时不会使用,但当它故障恢复后被 Sentinel 改为 Replica 时会用到,所以主从节点都建议配置。
  • 如果应用在其他机器,将 bind 127.0.0.1 和 replica-announce-ip 127.0.0.1 改成服务器内网 IP,例如 10.0.0.10。

6. 配置 Redis Replica

6.1 配置 Redis Replica 1

创建 /etc/redis/redis-6380.conf:

port 6380
bind 127.0.0.1
protected-mode yes
tcp-keepalive 300
daemonize no

pidfile /run/redis/redis-6380.pid
logfile /var/log/redis/redis-6380.log
loglevel notice
dir /var/lib/redis/6380
dbfilename dump-6380.rdb

appendonly yes
appendfilename "appendonly-6380.aof"
appendfsync everysec

requirepass <REDIS_PASSWORD>
masterauth <REDIS_PASSWORD>
replica-priority 100

replicaof 127.0.0.1 6379
replica-read-only yes
replica-announce-ip 127.0.0.1
replica-announce-port 6380

6.2 配置 Redis Replica 2

创建 /etc/redis/redis-6381.conf:

port 6381
bind 127.0.0.1
protected-mode yes
tcp-keepalive 300
daemonize no

pidfile /run/redis/redis-6381.pid
logfile /var/log/redis/redis-6381.log
loglevel notice
dir /var/lib/redis/6381
dbfilename dump-6381.rdb

appendonly yes
appendfilename "appendonly-6381.aof"
appendfsync everysec

requirepass <REDIS_PASSWORD>
masterauth <REDIS_PASSWORD>
replica-priority 100

replicaof 127.0.0.1 6379
replica-read-only yes
replica-announce-ip 127.0.0.1
replica-announce-port 6381

如果使用内网 IP,replicaof 和 replica-announce-ip 也要同步调整。

replica-read-only yes 是 Redis Replica 的默认行为,显式写入配置文件可以避免误写从节点,也方便后续配置审计。除非有非常明确的历史兼容需求,不建议设置为 no。

补充说明:

  • appendfsync everysec 是 AOF 的常用策略,性能和可靠性比较均衡;极端故障下可能丢失约 1 秒写入。always 更安全但性能代价明显,no 依赖操作系统刷盘,不建议用于需要数据安全的场景。
  • replica-priority 100 用于 Sentinel 选择可提升的 Replica。值为 0 表示该节点永远不参与提升;多个 Replica 优先级相同时,Sentinel 还会结合复制偏移量等信息选择候选节点。
  • tcp-keepalive 300 用于让系统定期探测空闲 TCP 连接,帮助更快清理异常断开的连接。
  • loglevel notice 适合普通部署。排障时可临时调为 verbose,长期不建议使用过高日志级别。

设置配置文件权限:

sudo chown redis:redis /etc/redis/redis-6379.conf /etc/redis/redis-6380.conf /etc/redis/redis-6381.conf
sudo chmod 640 /etc/redis/redis-6379.conf /etc/redis/redis-6380.conf /etc/redis/redis-6381.conf

7. 配置 Sentinel

Sentinel 需要 3 个配置文件。Sentinel 会自动重写自己的配置文件来保存当前状态,所以这些配置文件必须对 redis 用户可写。

7.1 Sentinel 26379

创建 /etc/redis/sentinel-26379.conf:

port 26379
bind 127.0.0.1
protected-mode yes
daemonize no

pidfile /run/redis/sentinel-26379.pid
logfile /var/log/redis/sentinel-26379.log
loglevel notice
dir /tmp

requirepass <SENTINEL_PASSWORD>

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster <REDIS_PASSWORD>
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

7.2 Sentinel 26380

复制 /etc/redis/sentinel-26379.conf 为 /etc/redis/sentinel-26380.conf,并修改端口、pid、日志:

port 26380
bind 127.0.0.1
protected-mode yes
daemonize no

pidfile /run/redis/sentinel-26380.pid
logfile /var/log/redis/sentinel-26380.log
loglevel notice
dir /tmp

requirepass <SENTINEL_PASSWORD>

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster <REDIS_PASSWORD>
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

7.3 Sentinel 26381

复制 /etc/redis/sentinel-26379.conf 为 /etc/redis/sentinel-26381.conf,并修改端口、pid、日志:

port 26381
bind 127.0.0.1
protected-mode yes
daemonize no

pidfile /run/redis/sentinel-26381.pid
logfile /var/log/redis/sentinel-26381.log
loglevel notice
dir /tmp

requirepass <SENTINEL_PASSWORD>

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster <REDIS_PASSWORD>
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

设置权限:

sudo chown redis:redis /etc/redis/sentinel-26379.conf /etc/redis/sentinel-26380.conf /etc/redis/sentinel-26381.conf
sudo chmod 640 /etc/redis/sentinel-26379.conf /etc/redis/sentinel-26380.conf /etc/redis/sentinel-26381.conf

参数说明:

参数说明
sentinel monitor mymaster 127.0.0.1 6379 2监控名为 mymaster 的 Master,Quorum 为 2
sentinel auth-passSentinel 连接 Redis Master / Replica 使用的密码
down-after-millisecondsSentinel 多久收不到有效响应后主观判定节点下线
failover-timeout故障转移流程超时时间
parallel-syncs故障转移后同时向新 Master 同步的 Replica 数量
loglevel noticeSentinel 常规日志级别,便于观察故障转移事件

8. 创建 systemd 服务

8.1 Redis 多实例服务

创建 /etc/systemd/system/redis-node@.service:

[Unit]
Description=Redis Server Instance %i
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/%i.conf --daemonize no
RuntimeDirectory=redis
Restart=always
RestartSec=3
LimitNOFILE=65535
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

8.2 Sentinel 多实例服务

创建 /etc/systemd/system/redis-sentinel@.service:

[Unit]
Description=Redis Sentinel Instance %i
After=network-online.target redis-node@redis-6379.service redis-node@redis-6380.service redis-node@redis-6381.service
Wants=network-online.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/sentinel-%i.conf --sentinel --daemonize no
RuntimeDirectory=redis
Restart=always
RestartSec=3
LimitNOFILE=65535
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

重新加载 systemd:

sudo systemctl daemon-reload

9. 启动服务

先启动 Redis Master 和 Replica:

sudo systemctl enable --now redis-node@redis-6379
sudo systemctl enable --now redis-node@redis-6380
sudo systemctl enable --now redis-node@redis-6381

再启动 3 个 Sentinel:

sudo systemctl enable --now redis-sentinel@26379
sudo systemctl enable --now redis-sentinel@26380
sudo systemctl enable --now redis-sentinel@26381

查看状态:

sudo systemctl status redis-node@redis-6379
sudo systemctl status redis-node@redis-6380
sudo systemctl status redis-node@redis-6381
sudo systemctl status redis-sentinel@26379
sudo systemctl status redis-sentinel@26380
sudo systemctl status redis-sentinel@26381

10. 部署验证

10.1 验证 Redis 主从

redis-cli -p 6379 -a <REDIS_PASSWORD> PING
redis-cli -p 6380 -a <REDIS_PASSWORD> PING
redis-cli -p 6381 -a <REDIS_PASSWORD> PING

预期返回:

PONG

查看复制状态:

redis-cli -p 6379 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6380 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6381 -a <REDIS_PASSWORD> INFO replication

Master 侧应看到:

role:master
connected_slaves:2

两个 Replica 侧都应看到:

role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
slave_read_only:1

写入测试:

redis-cli -p 6379 -a <REDIS_PASSWORD> SET sentinel:test ok
redis-cli -p 6380 -a <REDIS_PASSWORD> GET sentinel:test
redis-cli -p 6381 -a <REDIS_PASSWORD> GET sentinel:test

预期返回:

ok

10.2 验证 Sentinel

查询当前 Master:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL get-master-addr-by-name mymaster

预期返回:

1) "127.0.0.1"
2) "6379"

查看 Sentinel 是否发现两个 Replica:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL replicas mymaster

查看 Sentinel 是否发现另外两个 Sentinel:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL sentinels mymaster

检查 Quorum 和多数派是否满足:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL ckquorum mymaster

预期返回类似:

OK 3 usable Sentinels. Quorum and failover authorization can be reached

11. 故障转移演练

11.1 停止当前 Master

sudo systemctl stop redis-node@redis-6379

观察 Sentinel 日志:

sudo tail -f /var/log/redis/sentinel-26379.log

正常情况下会看到 +sdown、+odown、+try-failover、+switch-master 等事件。

11.2 查看新的 Master

等待数秒后执行:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL get-master-addr-by-name mymaster

预期新 Master 变为其中一个 Replica,例如:

1) "127.0.0.1"
2) "6380"

也可能返回 6381。以 Sentinel 返回的端口为准,检查新 Master 角色:

redis-cli -p 6380 -a <REDIS_PASSWORD> INFO replication

预期:

role:master

11.3 恢复旧 Master

重新启动 6379:

sudo systemctl start redis-node@redis-6379

等待 Sentinel 自动重配置后,检查 6379:

redis-cli -p 6379 -a <REDIS_PASSWORD> INFO replication

预期 6379 会变成新 Master 的 Replica。下面以新 Master 是 6380 为例:

role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up

11.4 可选:切回原始端口

如果需要让 6379 再次成为 Master,确认当前复制状态正常后,可以执行一次手动 failover:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL failover mymaster

等待完成后再次确认:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL get-master-addr-by-name mymaster
redis-cli -p 6379 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6380 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6381 -a <REDIS_PASSWORD> INFO replication

不要频繁切换主从。每次切换后都应确认复制链路恢复正常。

12. 应用接入方式

应用侧应使用支持 Sentinel 的 Redis 客户端,配置内容通常包括:

masterName = mymaster
sentinelNodes = 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
redisPassword = <REDIS_PASSWORD>
sentinelPassword = <SENTINEL_PASSWORD>

接入要求:

  • 不要把应用固定写死到 127.0.0.1:6379。
  • 应用必须支持 Sentinel 服务发现。
  • 如果应用不在 Redis 同机部署,Sentinel 返回的 Master 地址必须是应用可访问的内网 IP。
  • 如果 Sentinel 配了 requirepass,客户端也必须支持 Sentinel 认证。

13. 日常运维命令

查看服务:

systemctl status redis-node@redis-6379
systemctl status redis-node@redis-6380
systemctl status redis-node@redis-6381
systemctl status redis-sentinel@26379

查看日志:

journalctl -u redis-node@redis-6379 -f
journalctl -u redis-sentinel@26379 -f
tail -f /var/log/redis/redis-6379.log
tail -f /var/log/redis/sentinel-26379.log

查看当前 Master:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL get-master-addr-by-name mymaster

查看主从复制:

redis-cli -p 6379 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6380 -a <REDIS_PASSWORD> INFO replication
redis-cli -p 6381 -a <REDIS_PASSWORD> INFO replication

检查 Sentinel 健康:

redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL ckquorum mymaster
redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL master mymaster
redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL replicas mymaster
redis-cli -p 26379 -a <SENTINEL_PASSWORD> SENTINEL sentinels mymaster

14. 安全建议

14.1 绑定地址和防火墙

如果只允许本机应用访问,保持:

bind 127.0.0.1
protected-mode yes

如果允许内网访问,示例:

bind 127.0.0.1 10.0.0.10
protected-mode yes

同时只放通可信来源:

sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="6379" protocol="tcp" accept' --permanent
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="6380" protocol="tcp" accept' --permanent
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="6381" protocol="tcp" accept' --permanent
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="26379-26381" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload

不要把 Redis 或 Sentinel 端口暴露到公网。

14.2 密码和 ACL

本文用 requirepass 演示,配置简单。生产环境建议使用 Redis ACL,为应用、运维、Sentinel 分配不同账号和最小权限。

14.3 配置文件保护

配置文件包含密码,必须限制权限:

sudo chown redis:redis /etc/redis/*.conf
sudo chmod 640 /etc/redis/*.conf

Sentinel 会重写自己的配置文件,不要用配置管理工具无脑覆盖 Sentinel 配置,否则可能丢失 Sentinel 发现到的状态信息。

15. 可选增强参数

下面这些参数不是单机哨兵模式启动所必需,但在准生产或生产环境中建议评估后启用。

15.1 内存上限和淘汰策略

如果 Redis 用作缓存,应明确配置内存上限和淘汰策略,避免 Redis 占满服务器内存:

maxmemory 4gb
maxmemory-policy allkeys-lru

如果 Redis 用作不能丢数据的存储,不要随意启用淘汰策略,应优先扩容、拆分实例或限制写入。

15.2 主节点写入保护

Redis 复制是异步复制。为了减少 Master 和 Replica 断联时继续写入带来的数据丢失窗口,可以在 Master 配置中评估启用:

min-replicas-to-write 1
min-replicas-max-lag 10

含义是至少有 1 个延迟不超过 10 秒的 Replica 时,Master 才接受写入。该配置会提高数据安全性,但在 Replica 异常、网络抖动或单机资源紧张时可能导致 Master 拒写。开发测试环境通常不建议默认开启。

15.3 慢查询和延迟监控

建议保留慢查询记录,便于定位大 Key、慢命令和异常访问:

slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 100

slowlog-log-slower-than 10000 表示记录执行时间超过 10 毫秒的命令。阈值应按业务延迟要求调整。

15.4 RDB 快照策略

本文默认开启 AOF。是否额外开启 RDB 快照,取决于恢复策略和磁盘空间。常见配置示例:

save 900 1
save 300 10
save 60 10000

同时使用 AOF 和 RDB 可以让恢复方式更灵活,但会增加磁盘 I/O。写入压力大的实例应结合压测评估。

16. 常见问题

16.1 Sentinel 启动失败

检查配置文件是否存在且可写:

ls -l /etc/redis/sentinel-26379.conf
sudo -u redis test -w /etc/redis/sentinel-26379.conf && echo writable

Sentinel 必须使用配置文件启动,并且该文件必须可写。

16.2 Replica 一直无法同步

检查:

  • replicaof 地址和端口是否正确。
  • Master 和 Replica 的 <REDIS_PASSWORD> 是否一致。
  • Replica 是否配置了 masterauth <REDIS_PASSWORD>。
  • Master 日志和 Replica 日志是否有认证失败或连接失败。
  • 两个 Replica 的数据目录是否独立,例如 /var/lib/redis/6380 和 /var/lib/redis/6381。

16.3 SENTINEL ckquorum 不通过

常见原因:

  • 3 个 Sentinel 没有全部启动。
  • Sentinel 之间密码不一致。
  • Sentinel 配置文件里的 bind 或端口不正确。
  • Sentinel 配置文件不可写,导致状态无法持久化。

16.4 应用通过 Sentinel 拿到 127.0.0.1

这是因为 sentinel monitor 或 Redis replica-announce-ip 使用了 127.0.0.1。如果应用在其他机器,需要改为 Redis 服务器的内网 IP,并重启或重新配置 Sentinel。

16.5 Master 停止后没有故障转移

检查:

  • 是否有至少 3 个可用 Sentinel。
  • SENTINEL ckquorum mymaster 是否返回 OK。
  • 至少一个 Replica 是否在线且复制状态正常。
  • 两个 Replica 是否都配置了 replica-priority 0,如果是,则不会有节点被提升为 Master。
  • Sentinel 日志中是否出现 no-good-slave、认证失败或网络连接失败。

17. 生产环境调整建议

单机哨兵模式迁移到生产时,至少调整为:

Server A: Redis Master   + Sentinel 1
Server B: Redis Replica  + Sentinel 2
Server C: Redis Replica  + Sentinel 3

生产检查项:

  • 至少 3 个 Sentinel,部署在独立主机或独立可用区。
  • Redis 主从不要放在同一台服务器。
  • 应用客户端必须支持 Sentinel。
  • 定期演练故障转移。
  • 监控 SENTINEL ckquorum、INFO replication、内存、连接数、慢查询、AOF/RDB 持久化状态。
  • 使用内网访问控制、ACL、TLS 或专用网络隔离。
  • 设计备份和恢复流程,不要把 Sentinel 当成备份方案。

18. 参考资料

  • Redis 官方文档:High availability with Redis Sentinel
    https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/
  • Redis 官方文档:Install Redis on Linux
    https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/install-redis-on-linux/
  • Redis 官方文档:Redis replication
    https://redis.io/docs/latest/operate/oss_and_stack/management/replication/
  • Redis 官方文档:Redis security
    https://redis.io/docs/latest/operate/oss_and_stack/management/security/
  • Redis 官方文档:Sentinel client spec
    https://redis.io/docs/latest/develop/reference/sentinel-clients/
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐