Linux 部署 Redis:一主一从 + Sentinel 完整实战

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-server
  • redis-cli
  • redis-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 的情况下,你通常需要手动做这些事:

  1. 找到从节点
  2. 提升从节点为新主
  3. 修改应用连接地址
  4. 修改其他从节点的复制关系

而 Sentinel 的作用就是:

  • 监控主从实例
  • 发现主节点故障
  • 自动选举新主
  • 自动故障转移
  • 向客户端提供当前主节点地址

十二、Sentinel 部署规划

这里使用 3 个 Sentinel:

  • 192.168.1.20:26379
  • 192.168.1.21:26379
  • 192.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,而不是继续只靠一主一从扩展。

相关推荐
爱学习的小囧3 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
NCIN EXPE3 小时前
redis 使用
数据库·redis·缓存
坚持就完事了3 小时前
Linux中的变量
linux·运维·服务器
hERS EOUS3 小时前
nginx 代理 redis
运维·redis·nginx
handler013 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky3 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志4 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子4 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
Qbw20044 小时前
【Linux】进程地址空间
linux·c++
NoSi EFUL5 小时前
redis存取list集合
windows·redis·list