Linux 部署 Redis:一主一从 + Sentinel 完整实战
一、前言
本文记录 Linux 环境下 Redis 一主一从 + Sentinel 的完整部署过程,适合以下场景:
- 学习 Redis 主从复制
- 搭建 Redis 读写分离环境
- 验证 Sentinel 自动故障切换
- 作为线上部署前的基础演练文档
本文主要内容包括:
- Linux 安装 Redis
- 一主一从部署
- 主从复制验证
- Sentinel 部署
- Sentinel 参数说明
- 故障切换验证
- 常见问题排查
二、环境说明
本文示例采用 5 台 Linux 机器,分别如下:
- Redis Master:
192.168.1.10 - Redis Slave:
192.168.1.11 - Sentinel1:
192.168.1.20 - Sentinel2:
192.168.1.21 - Sentinel3:
192.168.1.22
Redis 端口统一使用:
- Redis:
6379 - Sentinel:
26379
如果你机器数量不够,也可以把 Sentinel 部署到 Redis 节点上测试,但正式生产环境建议分开部署。
三、Redis 读写分离原理简介
Redis 的读写分离,本质上就是:
- 写请求发到主节点
- 读请求发到从节点
- 主从之间通过复制保持数据同步
需要注意两点:
1)Redis 不会自动做业务读写路由
Redis 主从复制负责数据同步,但不会自动把你的读请求转发到从节点。
真正的"读主还是读从",通常由客户端代码、连接池或中间件实现。
2)主从复制不等于高可用
只有主从复制的话,主节点挂了以后,客户端仍然会连旧主。
Sentinel 才负责监控、故障发现和自动切主。
四、安装 Redis
这里以常见 Linux 环境为例,演示源码安装方式。
如果你已经通过包管理器安装好 Redis,可以跳过本节。
4.1 下载 Redis
bash
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.5.tar.gz
tar -zxvf redis-7.2.5.tar.gz
cd redis-7.2.5
4.2 编译安装
bash
make
make install
安装完成后,常用命令一般会在 /usr/local/bin/ 下:
redis-serverredis-cliredis-sentinel
验证:
bash
redis-server -v
redis-cli -v
五、目录规划
建议先创建 Redis 运行所需目录。
5.1 主节点目录
在主节点机器 192.168.1.10 上执行:
bash
mkdir -p /data/redis/6379
mkdir -p /etc/redis
mkdir -p /var/log/redis
5.2 从节点目录
在从节点机器 192.168.1.11 上执行:
bash
mkdir -p /data/redis/6379
mkdir -p /etc/redis
mkdir -p /var/log/redis
5.3 Sentinel 目录
在三台 Sentinel 机器上都执行:
bash
mkdir -p /etc/redis
mkdir -p /var/log/redis
六、部署 Redis 主节点
主节点机器:192.168.1.10
6.1 主节点配置文件
文件路径:
text
/etc/redis/redis-6379.conf
配置内容如下:
conf
bind 192.168.1.10 127.0.0.1
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis-6379.log
dir /data/redis/6379
dbfilename dump.rdb
appendonly no
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
6.2 参数说明
bind 192.168.1.10 127.0.0.1
绑定主节点内网 IP 和本地回环地址。
protected-mode yes
开启保护模式。生产环境建议保持开启。
port 6379
Redis 监听端口。
daemonize yes
后台运行。
pidfile /var/run/redis_6379.pid
保存进程 PID 文件。
loglevel notice
日志级别。
logfile /var/log/redis/redis-6379.log
Redis 日志文件。
dir /data/redis/6379
RDB 工作目录。
dbfilename dump.rdb
RDB 快照文件名。
appendonly no
关闭 AOF,仅使用 RDB。
save 900 1
900 秒内至少 1 次写入触发快照。
save 300 10
300 秒内至少 10 次写入触发快照。
save 60 10000
60 秒内至少 10000 次写入触发快照。
rdbcompression yes
开启 RDB 压缩。
rdbchecksum yes
开启 RDB 校验。
七、部署 Redis 从节点
从节点机器:192.168.1.11
7.1 从节点配置文件
文件路径:
text
/etc/redis/redis-6379.conf
配置内容如下:
conf
bind 192.168.1.11 127.0.0.1
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis-6379.log
dir /data/redis/6379
dbfilename dump.rdb
appendonly no
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
replicaof 192.168.1.10 6379
replica-read-only yes
7.2 关键参数说明
replicaof 192.168.1.10 6379
把当前 Redis 实例配置为 192.168.1.10:6379 的从节点。
replica-read-only yes
从节点只读,避免误写。
八、启动 Redis 主从
8.1 启动主节点
在主节点机器执行:
bash
redis-server /etc/redis/redis-6379.conf
8.2 启动从节点
在从节点机器执行:
bash
redis-server /etc/redis/redis-6379.conf
8.3 查看进程
分别在主从机器上执行:
bash
ps -ef | grep redis
正常情况下可以看到 Redis 进程监听 6379 端口。
九、验证主从复制
9.1 查看主节点复制状态
在主节点机器执行:
bash
redis-cli -h 192.168.1.10 -p 6379 INFO replication
正常时一般能看到:
text
role:master
connected_slaves:1
slave0:ip=192.168.1.11,port=6379,state=online,offset=...
9.2 查看从节点复制状态
在从节点机器执行:
bash
redis-cli -h 192.168.1.11 -p 6379 INFO replication
正常时一般能看到:
text
role:slave
master_host:192.168.1.10
master_port:6379
master_link_status:up
9.3 测试数据同步
在主节点写入数据:
bash
redis-cli -h 192.168.1.10 -p 6379
执行:
redis
set user:name redis_test
get user:name
然后到从节点读取:
bash
redis-cli -h 192.168.1.11 -p 6379
执行:
redis
get user:name
如果能读到相同值,说明主从同步正常。
十、配置密码认证(可选但推荐)
如果你线上要提升安全性,建议配置密码认证。
10.1 主节点加密码
主节点配置增加:
conf
requirepass 123456
10.2 从节点增加复制认证
从节点配置增加:
conf
masterauth 123456
从节点完整关键部分如下:
conf
replicaof 192.168.1.10 6379
masterauth 123456
replica-read-only yes
10.3 连接时带密码
连接主节点:
bash
redis-cli -h 192.168.1.10 -p 6379 -a 123456
连接从节点:
bash
redis-cli -h 192.168.1.11 -p 6379 -a 123456
十一、Sentinel 是什么
Redis 主从复制只能同步数据,不能自动切主。
当主节点挂掉时,没有 Sentinel 的情况下,你通常需要手动做这些事:
- 找到从节点
- 提升从节点为新主
- 修改应用连接地址
- 修改其他从节点的复制关系
而 Sentinel 的作用就是:
- 监控主从实例
- 发现主节点故障
- 自动选举新主
- 自动故障转移
- 向客户端提供当前主节点地址
十二、Sentinel 部署规划
这里使用 3 个 Sentinel:
192.168.1.20:26379192.168.1.21:26379192.168.1.22:26379
原因很简单:
- Sentinel 是分布式投票机制
- 至少 3 个才有多数派意义
- 一个或两个 Sentinel 都不够稳妥
十三、Sentinel 配置文件
三台 Sentinel 的配置内容基本一致,只需要分别放到各自机器即可。
文件路径:
text
/etc/redis/sentinel-26379.conf
配置内容如下:
conf
port 26379
bind 0.0.0.0
protected-mode yes
daemonize yes
pidfile /var/run/redis-sentinel-26379.pid
logfile /var/log/redis/sentinel-26379.log
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
如果主节点设置了密码,再额外加入:
conf
sentinel auth-pass mymaster 123456
十四、Sentinel 参数说明
14.1 sentinel monitor mymaster 192.168.1.10 6379 2
含义如下:
mymaster:主节点逻辑名称192.168.1.10 6379:当前主节点地址2:法定票数 quorum
表示至少需要足够多的 Sentinel 共同确认主节点异常,才能继续后续流程。
14.2 sentinel down-after-milliseconds mymaster 5000
表示 Sentinel 连续 5000 毫秒无法正常联系主节点时,将其标记为主观下线。
14.3 sentinel failover-timeout mymaster 60000
故障转移相关的超时时间窗口。
14.4 sentinel parallel-syncs mymaster 1
故障转移后,允许多少个从节点同时重新同步新主。
值越小,对新主冲击越小,但同步完成速度也越慢。
14.5 sentinel auth-pass mymaster 123456
如果 Redis 有密码,Sentinel 连接 Redis 也必须认证。
十五、启动 Sentinel
在 3 台 Sentinel 机器上分别执行:
bash
redis-server /etc/redis/sentinel-26379.conf --sentinel
如果你的安装里有单独命令,也可以使用:
bash
redis-sentinel /etc/redis/sentinel-26379.conf
十六、验证 Sentinel 是否正常
16.1 查看进程
在 Sentinel 机器上执行:
bash
ps -ef | grep redis
16.2 连接 Sentinel
bash
redis-cli -p 26379
16.3 查看当前主节点地址
redis
SENTINEL get-master-addr-by-name mymaster
16.4 查看所有主节点信息
redis
SENTINEL masters
16.5 查看某个主节点下的从节点
redis
SENTINEL replicas mymaster
16.6 查看监控当前主节点的 Sentinel
redis
SENTINEL sentinels mymaster
十七、故障切换验证
这是整套部署中最重要的一步。
17.1 先确认当前状态正常
确认以下都正常:
- 主节点运行正常
- 从节点运行正常
- 3 个 Sentinel 都在运行
SENTINEL masters能看到主节点
17.2 模拟主节点宕机
在主节点机器执行:
bash
redis-cli -h 192.168.1.10 -p 6379 shutdown
或者直接停服务。
17.3 观察 Sentinel 日志
在任一 Sentinel 机器查看日志:
bash
tail -f /var/log/redis/sentinel-26379.log
通常会看到类似流程:
- 标记主节点下线
- 多个 Sentinel 协同确认
- 选举 leader Sentinel
- 提升从节点为新主
- 修改复制拓扑
17.4 再次查询主节点地址
进入 Sentinel:
bash
redis-cli -p 26379
执行:
redis
SENTINEL get-master-addr-by-name mymaster
如果返回变成:
text
192.168.1.11
6379
说明原从节点已经被提升为新主。
17.5 验证新主角色
在原从节点机器执行:
bash
redis-cli -h 192.168.1.11 -p 6379 INFO replication
如果看到:
text
role:master
说明故障切换成功。
十八、systemd 配置(可选但推荐)
正式环境建议用 systemd 管理 Redis 服务。
18.1 Redis 服务文件
文件路径:
text
/etc/systemd/system/redis-6379.service
内容如下:
ini
[Unit]
Description=Redis 6379
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis-6379.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown
PIDFile=/var/run/redis_6379.pid
Restart=always
[Install]
WantedBy=multi-user.target
18.2 Sentinel 服务文件
文件路径:
text
/etc/systemd/system/redis-sentinel-26379.service
内容如下:
ini
[Unit]
Description=Redis Sentinel 26379
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/sentinel-26379.conf --sentinel
ExecStop=/usr/bin/pkill -f "redis-server.*sentinel"
PIDFile=/var/run/redis-sentinel-26379.pid
Restart=always
[Install]
WantedBy=multi-user.target
18.3 重新加载并启动
bash
systemctl daemon-reload
systemctl enable redis-6379
systemctl start redis-6379
systemctl enable redis-sentinel-26379
systemctl start redis-sentinel-26379
18.4 查看状态
bash
systemctl status redis-6379
systemctl status redis-sentinel-26379
十九、客户端如何实现真正的读写分离
这里必须强调:
19.1 Redis 不会自动转发读请求
Redis 只做复制,不做应用请求路由。
19.2 客户端需要自己区分
一般做法是:
- 写请求连主节点
- 读请求连从节点
- Sentinel 用于发现当前主节点地址
19.3 建议的线上规则
建议至少这样区分:
- 强一致接口:只读主
- 普通缓存接口:读从
- 写后马上读的接口:短时间强制读主
- 普通写请求:写主
因为 Redis 主从复制默认是异步的,从节点可能存在短暂延迟。
二十、常见问题排查
20.1 从节点一直连不上主节点
检查项:
replicaof地址是否正确- 主节点是否已启动
- 网络是否互通
- 防火墙是否放行 6379
- 主节点是否配置了密码而从节点没写
masterauth
20.2 从节点不能写
这是正常现象,因为配置了:
conf
replica-read-only yes
20.3 Sentinel 启动了但没有切主
排查以下内容:
- Sentinel 数量不够
monitor配置错了quorum设置过大- Sentinel 到 Redis 网络不通
- Redis 有密码但没写
auth-pass - 主节点只是短暂抖动,没有达到
down-after-milliseconds
20.4 主从同步慢
常见原因:
- 网络延迟高
- 首次全量同步数据量大
- 主节点压力高
- 磁盘写入性能不足
20.5 同机部署可不可以
可以,但只适合:
- 学习
- 测试
- 验证配置
- 本地演练
不适合生产高可用,因为宿主机一挂,主从和 Sentinel 可能一起挂。
二十一、线上部署建议
如果是一主一从 + Sentinel 的最小可用架构,线上建议至少做到:
- 主从分开机器
- Sentinel 至少 3 个
- Redis 开启认证
- 只开放内网访问
- 配置日志
- 做复制监控和延迟监控
- 业务上区分强一致读和普通读
- 不要把关键强一致数据完全依赖在从节点读取上
二十二、总结
本文完整整理了 Linux 下 Redis 一主一从 + Sentinel 的部署过程,包含:
- Redis 安装
- 主节点配置
- 从节点配置
- 主从复制验证
- Sentinel 配置
- Sentinel 启动与验证
- 故障切换测试
- systemd 服务配置
- 常见问题排查
最后总结一句:
- 主从复制 解决读扩展和数据同步
- Sentinel 解决高可用和自动切主
- 客户端 负责真正的读写分离路由
- 异步复制 决定了从节点天然存在短暂延迟
如果后续数据量、写入压力或单机容量继续增加,下一步就应该考虑 Redis Cluster,而不是继续只靠一主一从扩展。