Redis与Sentinel配置详解
目录
Redis Sentinel概述
Redis Sentinel是Redis官方推荐的高可用性解决方案,用于监控Redis主从集群的运行状况。当主节点出现故障时,Sentinel能够自动完成故障发现和故障转移,并通知客户端,实现真正的高可用。
Sentinel的主要功能
- 监控:持续检查主节点和从节点是否按预期工作
- 通知:当被监控的Redis实例出现问题时,Sentinel可以通过API向管理员或其他应用程序发送通知
- 自动故障转移:如果主节点不能正常工作,Sentinel会启动故障转移过程,将其中一个从节点提升为新的主节点
- 配置提供者:客户端连接到Sentinel获取当前Redis主节点的地址
Sentinel架构特点
Sentinel是一个分布式系统,通常建议部署奇数个Sentinel节点(至少3个),分布在不同的物理机器上,防止单点故障。Sentinel节点之间使用流言协议(gossip protocol)来交换信息,并使用投票机制决定是否执行故障转移。
Sentinel被设计为在多个Sentinel进程协作的配置中运行。多个Sentinel协作的优势包括:
- 当多个Sentinel认为主节点不可用时才进行故障检测,降低误判概率
- 即使部分Sentinel节点不工作,系统仍能正常运行,避免单点故障
- Sentinel与Redis实例和客户端共同构成一个更大的分布式系统
Redis基础配置
主节点配置示例
conf
# 基础网络设置
bind 192.168.1.100 # 绑定IP地址,使用实际服务器IP
port 6379 # 端口号
protected-mode yes # 保护模式,防止未授权访问
daemonize yes # 以守护进程方式运行
supervised systemd # 被systemd管理
# 日志和进程
pidfile /var/run/redis/redis.pid # PID文件路径
logfile /var/log/redis/redis.log # 日志文件
loglevel notice # 日志级别
# 数据存储
dir /var/lib/redis # 工作目录,数据文件存放位置
dbfilename dump.rdb # RDB文件名
# 性能设置
maxmemory 4gb # 最大内存限制
maxmemory-policy volatile-lru # 内存策略
databases 16 # 数据库数量
tcp-backlog 511 # TCP监听队列长度
tcp-keepalive 300 # TCP连接保活探测时间
io-threads 4 # IO线程数(Redis 6.0+)
# 持久化
save 900 1 # 900秒内至少1个key变化则保存
save 300 10 # 300秒内至少10个key变化则保存
save 60 10000 # 60秒内至少10000个key变化则保存
appendonly yes # 启用AOF持久化
appendfilename "appendonly.aof" # AOF文件名
appendfsync everysec # AOF同步策略
# 安全设置
requirepass "StrongPassword123" # 访问密码
masterauth "StrongPassword123" # 主节点认证密码(用于故障转移后)
从节点配置示例
conf
# 基础配置与主节点相同,但添加以下从节点特有配置
replicaof 192.168.1.100 6379 # 指定主节点地址和端口
masterauth "StrongPassword123" # 连接主节点的密码
replica-serve-stale-data yes # 主从断开时继续提供过期数据
replica-read-only yes # 从节点只读模式
replica-priority 100 # 从节点优先级,值越小优先级越高
Redis主从复制配置
主从复制关键配置
配置项 说明 推荐值 影响replicaof 指定主节点地址和端口
<masterip> <masterport> 将本实例设置为从节点
masterauth 主节点密码 与主节点密码一致 从节点访问主节点的认证
replica-serve-stale-data 是否提供过期数据 yes 断开连接时是否继续服务
replica-read-only 从节点只读 yes 从节点是否允许写操作
replica-priority 优先级 100 故障转移时的选举权重
min-replicas-to-write 最少写从节点 1 至少要有几个可用从节点才接受写入
min-replicas-max-lag 最大延迟时间 10 从节点延迟超过此值视为不可用
Redis的主从复制对于实现高可用性至关重要。当配置了主从模式时,最好在所有节点(包括主节点)上设置masterauth参数,这样在故障转移后,原主节点能够作为从节点重新加入集群。
重点说明
- 主节点配置
masterauth:即使是主节点也需要配置masterauth,这样在故障转移后,原主节点可以作为从节点重新加入集群。 - 从节点优先级:
replica-priority值越小,优先级越高;设置为0表示永不提升为主节点。 - 主从延迟控制:通过
min-replicas-max-lag和min-replicas-to-write可以防止主节点在从节点延迟过高或数量不足时接受写入,提高数据安全性。
Sentinel基础配置
Sentinel配置文件示例
conf
# 基础设置
port 26379 # Sentinel端口号
bind 192.168.1.100 # 绑定IP地址
daemonize yes # 以守护进程方式运行
protected-mode no # 关闭保护模式
dir /var/lib/redis # 工作目录
logfile /var/log/redis/sentinel.log # 日志文件
# 主节点监控设置
sentinel monitor mymaster 192.168.1.100 6379 2 # 监控配置
sentinel auth-pass mymaster StrongPassword123 # 主节点密码
sentinel down-after-milliseconds mymaster 5000 # 主观下线时间
sentinel failover-timeout mymaster 60000 # 故障转移超时
sentinel parallel-syncs mymaster 1 # 并行同步数量
# 通知设置(可选)
# sentinel notification-script mymaster /var/redis/notify.sh
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
关键配置参数说明
配置项 说明 推荐值 影响
sentinel monitor 监控主节点 <name> <ip> <port> <quorum> 指定监控目标和法定票数
sentinel auth-pass 主节点密码 与Redis密码一致 Sentinel访问Redis的密码
sentinel down-after-milliseconds 主观下线时间 5000-30000 多久无响应视为下线(毫秒)
sentinel failover-timeout 故障转移超时 60000 故障转移过程超时时间(毫秒)
sentinel parallel-syncs 并行同步数 1 故障转移时可同时同步的从节点数
在Sentinel配置中,sentinel monitor mymaster 192.168.1.100 6379 2表示监控名为mymaster的主节点,其中最后的数字2表示当有2个Sentinel检测到Master异常时才会判定其失效。只有当达到这个"最少法定人数"时,才会执行自动故障迁移。
Sentinel监控配置
主观下线和客观下线
Sentinel使用两种不同的下线状态来判断Redis节点的可用性:
- 主观下线(SDOWN) : 单个Sentinel实例认为某个节点不可用
- 客观下线(ODOWN) : 多个Sentinel实例达成共识,认为某个节点不可用
Sentinel之间的通信
Sentinel节点会定期互相发送消息,交换关于被监控Redis实例的信息。这种交流机制基于Redis的发布/订阅系统,具体通过以下方式实现:
- 每个Sentinel以每秒一次的频率向每个被监控的Redis实例发送PING命令
- 每个Sentinel订阅所有Redis实例的
__sentinel__:hello频道 - 每个Sentinel以每两秒一次的频率向被监控的每个Redis实例的
__sentinel__:hello频道发送自己的信息
故障检测流程
- 当Sentinel在
down-after-milliseconds毫秒内无法收到Redis实例的有效回复,将该实例标记为主观下线 - 如果下线的是主节点,Sentinel会向其他Sentinel询问他们是否也认为该主节点已下线
- 当足够数量(大于等于
quorum配置)的Sentinel同意主节点下线,该主节点被标记为客观下线 - 领导者选举开始,Sentinel之间投票选出一个领导者来执行故障转移
- 被选出的领导者Sentinel执行故障转移过程
Sentinel高可用机制详解
领导者选举与故障转移
当主节点被认定为客观下线后,Sentinel集群会选举出一个领导者负责执行故障转移,选举过程基于Raft算法。每个试图进行故障转移的Sentinel都会获得一个独特的配置版本号,防止同时有多个Sentinel执行故障转移。
故障转移步骤
-
选择一个从节点作为新的主节点
- 过滤不健康或长时间未响应的从节点
- 按优先级(replica-priority)排序,选择优先级高的
- 如果优先级相同,选择复制偏移量最大的(数据最新的)
- 如果仍相同,选择运行ID最小的
-
将选定的从节点升级为主节点
- 向选定的从节点发送
SLAVEOF NO ONE命令 - 等待从节点转变为主节点(通过INFO命令监控)
- 向选定的从节点发送
-
重新配置其他从节点
- 向其他从节点发送
SLAVEOF命令,让它们复制新的主节点 - 根据
parallel-syncs配置决定一次重新配置多少个从节点
- 向其他从节点发送
-
更新原主节点配置
- 当原主节点恢复时,将其配置为新主节点的从节点
客观下线状态只适用于主节点。对于从节点,Sentinel在将它们判断为下线前不需要进行协商,所以从节点永远不会达到客观下线状态。只有当主节点被认定为客观下线时,才会发生故障迁移操作。
配置传播
Sentinel会自动更新配置信息,并通过以下机制确保集群内的一致性:
- 每次执行故障转移时,执行的Sentinel会获得一个新的配置版本号
- 故障转移完成后,新的配置会广播给其他Sentinel
- 所有Sentinel最终会达成一致,采用最高版本号的配置
生产环境最佳实践
Sentinel部署建议
- Sentinel数量:至少部署3个Sentinel实例,并使用奇数个
- 物理分布:将Sentinel部署在不同的物理机器上,避免单点故障
- 法定人数(quorum)设置:对于N个Sentinel,建议设置为(N/2)+1
- 监控多个主节点:一个Sentinel集群可以监控多个主节点,复用Sentinel资源
将服务器标记为客观下线所需的Sentinel数量由对主服务器的配置决定。parallel-syncs参数指定了故障转移时,最多可以有多少个从服务器同时对新主服务器进行同步。这个数字越小,完成故障转移所需的时间就越长,但可以避免所有从服务器同时不可用的情况。
参数优化建议
-
down-after-milliseconds:
- 不要设置太短,避免网络抖动导致误判
- 不要设置太长,影响故障检测速度
- 生产环境建议5000-30000毫秒
-
failover-timeout:
- 控制故障转移的超时时间
- 建议设置为较大值(如60000毫秒),确保有足够时间完成故障转移
-
parallel-syncs:
- 影响故障转移期间的服务可用性
- 设置为1可避免多个从节点同时不可用
- 大型集群可以适当增加,加快故障恢复速度
安全加固建议
-
网络安全:
- 将Sentinel和Redis部署在私有网络中
- 使用防火墙限制访问范围
- 关闭Redis实例的protected-mode设置
-
认证安全:
- 所有Redis实例都设置强密码
- 在Sentinel配置中设置auth-pass参数
- Redis 6.0+版本可以配置ACL增强安全性
-
监控告警:
- 建立Sentinel的日志监控
- 配置notification-script实现故障告警
高级配置示例
conf
# 在多数据中心环境下的Sentinel配置
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster StrongPassword123
# 故障转移后的客户端通知脚本
sentinel notification-script mymaster /opt/redis/scripts/notify.sh
# 故障通知设置,可通过邮件、短信等方式告警
sentinel notification-script mymaster /path/to/notification.sh
# Sentinel可以监控多个主节点
sentinel monitor resque 192.168.1.200 6380 2
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
sentinel auth-pass resque DifferentPassword456
总结
Redis Sentinel提供了一个强大而灵活的高可用解决方案,通过自动故障检测和故障转移,确保Redis服务的可靠性。正确配置Redis主从复制和Sentinel,对于构建高可用的Redis环境至关重要。
根据实际的业务需求和环境特点,调整相关参数,可以更好地平衡系统的可用性、一致性和性能。同时,了解Sentinel的工作原理,有助于在遇到问题时进行正确的故障排查和解决。