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

  • Redis Master:6379
  • Redis Replica:63806381
  • Redis Sentinel:263792638026381
  • 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 Master 6379 写入和读取,初始主节点
Redis Replica 1 6380 复制节点,故障时可提升为主节点
Redis Replica 2 6381 复制节点,故障时可提升为主节点
Sentinel 1 26379 Sentinel 监控和服务发现
Sentinel 2 26380 Sentinel 监控和服务发现
Sentinel 3 26381 Sentinel 监控和服务发现

如果应用和 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-serverredis。本文使用自定义多实例 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.1replica-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,replicaofreplica-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-pass Sentinel 连接 Redis Master / Replica 使用的密码
down-after-milliseconds Sentinel 多久收不到有效响应后主观判定节点下线
failover-timeout 故障转移流程超时时间
parallel-syncs 故障转移后同时向新 Master 同步的 Replica 数量
loglevel notice Sentinel 常规日志级别,便于观察故障转移事件

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 ckquorumINFO 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

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐