一、引言
Redis作为高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景。但在生产环境中,单节点Redis存在单点故障风险,一旦宕机可能导致服务中断。为此,Redis提供了**主从复制(Replication)和哨兵模式(Sentinel)**两种核心机制,共同构建高可用架构。本文将深入解析这两种技术,并提供详细配置指南。
二、Redis主从复制(Replication)
1. 什么是主从复制?
主从复制通过将一台Redis服务器(主节点/Master)的数据实时复制到多个从节点(Slave),实现数据冗余和读写分离。主节点负责写操作,从节点默认只读。
2. 主从复制的核心作用
-
数据冗余:防止数据丢失。
-
读写分离:主节点写,从节点读,提升并发能力。
-
故障恢复:主节点故障后,从节点可升级为主节点。
3. 主从复制工作原理
-
全量复制(首次同步):
-
从节点向主节点发送
SYNC
命令。 -
主节点执行
BGSAVE
生成RDB文件,并将期间的写命令缓存。 -
传输RDB文件到从节点,从节点加载数据。
-
主节点发送缓存命令,从节点执行增量同步。
-
-
增量复制(后续同步):
-
主节点维护环形缓冲区(
repl_backlog
)记录写命令。 -
从节点断线重连后,发送
PSYNC
命令携带偏移量(offset)。 -
主节点根据偏移量发送增量数据。
-
4. 主从复制配置示例
步骤1:配置从节点
修改从节点的redis.conf
:
# 6380端口为从节点
port 6380
replicaof 127.0.0.1 6379 # 主节点IP和端口
步骤2:启动并验证
# 启动主节点
redis-server --port 6379
# 启动从节点
redis-server redis.conf
# 查看主从状态
redis-cli -p 6379 info replication
输出结果示例:
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1234,lag=0
三、Redis哨兵模式(Sentinel)
1. 哨兵模式的作用
哨兵是独立进程,用于监控Redis节点的健康状态,主要功能包括:
-
监控:检测主从节点是否正常运行。
-
自动故障转移:主节点故障时,选举新主节点。
-
通知:通过API向管理员发送告警。
-
配置中心:客户端通过哨兵获取当前主节点地址。
2. 哨兵工作原理
-
主观下线(SDOWN):单个哨兵认为节点不可达。
-
客观下线(ODOWN):多个哨兵(需达成
quorum
共识)确认主节点下线。 -
选举Leader哨兵:由Leader执行故障转移。
-
故障转移流程:
-
选择优先级高、偏移量最新的从节点。
-
将其升级为主节点,其他从节点切换为新主节点的副本。
-
3. 哨兵模式配置示例
步骤1:创建哨兵配置文件
sentinel.conf
内容:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点,2表示至少2个哨兵同意
sentinel down-after-milliseconds mymaster 5000 # 5秒无响应视为下线
sentinel failover-timeout mymaster 60000 # 故障转移超时时间
步骤2:启动哨兵
redis-sentinel sentinel.conf
步骤3:查看哨兵状态
redis-cli -p 26379 info sentinel
输出示例:
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=3
四、主从复制 + 哨兵模式:高可用架构实战
1. 架构示意图
+------------+ +------------+ +------------+
| Master |<-------+ Sentinel +------->| Slave 1 |
| (Redis 6379)| | (26379) | | (Redis 6380)|
+------------+ +------------+ +------------+
^
|
+------------+
| Slave 2 |
| (Redis 6381)|
+------------+
2. 客户端连接方式
客户端通过哨兵获取主节点地址:
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinelSet);
Jedis jedis = pool.getResource();
五、常见问题与解决方案
-
主从复制延迟:
-
优化主节点配置(如关闭AOF的
appendfsync everysec
)。 -
使用
WAIT
命令强制同步(但会阻塞客户端)。
-
-
脑裂问题(Split-Brain):
-
设置
min-replicas-to-write 1
,主节点需至少有一个从节点才能写入。
-
-
哨兵部署建议:
-
至少部署3个哨兵节点,跨物理机分布。
-
quorum
值设置为超过半数(如3个哨兵设置quorum=2
)。
-
六、总结
Redis主从复制与哨兵模式共同构建了高可用的基础架构,适用于大多数业务场景。然而,对于更大规模的数据分布,可进一步研究Redis Cluster分片方案。掌握这些技术后,可有效提升系统稳定性,为业务保驾护航。
附录:相关命令速查
# 手动切换主从
REPLICAOF NEW_MASTER_IP PORT
# 查看哨兵日志
tail -f /var/log/redis/sentinel.log