Redis与Sentinel配置详解

533 阅读11分钟

Redis与Sentinel配置详解

目录

  1. Redis Sentinel概述
  2. Redis基础配置
  3. Redis主从复制配置
  4. Sentinel基础配置
  5. Sentinel监控配置
  6. Sentinel高可用机制详解
  7. 生产环境最佳实践

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参数,这样在故障转移后,原主节点能够作为从节点重新加入集群。

重点说明

  1. 主节点配置masterauth:即使是主节点也需要配置masterauth,这样在故障转移后,原主节点可以作为从节点重新加入集群。
  2. 从节点优先级replica-priority值越小,优先级越高;设置为0表示永不提升为主节点。
  3. 主从延迟控制:通过min-replicas-max-lagmin-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的发布/订阅系统,具体通过以下方式实现:

  1. 每个Sentinel以每秒一次的频率向每个被监控的Redis实例发送PING命令
  2. 每个Sentinel订阅所有Redis实例的__sentinel__:hello频道
  3. 每个Sentinel以每两秒一次的频率向被监控的每个Redis实例的__sentinel__:hello频道发送自己的信息

故障检测流程

  1. 当Sentinel在down-after-milliseconds毫秒内无法收到Redis实例的有效回复,将该实例标记为主观下线
  2. 如果下线的是主节点,Sentinel会向其他Sentinel询问他们是否也认为该主节点已下线
  3. 当足够数量(大于等于quorum配置)的Sentinel同意主节点下线,该主节点被标记为客观下线
  4. 领导者选举开始,Sentinel之间投票选出一个领导者来执行故障转移
  5. 被选出的领导者Sentinel执行故障转移过程

Sentinel高可用机制详解

领导者选举与故障转移

当主节点被认定为客观下线后,Sentinel集群会选举出一个领导者负责执行故障转移,选举过程基于Raft算法。每个试图进行故障转移的Sentinel都会获得一个独特的配置版本号,防止同时有多个Sentinel执行故障转移。

故障转移步骤

  1. 选择一个从节点作为新的主节点

    • 过滤不健康或长时间未响应的从节点
    • 按优先级(replica-priority)排序,选择优先级高的
    • 如果优先级相同,选择复制偏移量最大的(数据最新的)
    • 如果仍相同,选择运行ID最小的
  2. 将选定的从节点升级为主节点

    • 向选定的从节点发送SLAVEOF NO ONE命令
    • 等待从节点转变为主节点(通过INFO命令监控)
  3. 重新配置其他从节点

    • 向其他从节点发送SLAVEOF命令,让它们复制新的主节点
    • 根据parallel-syncs配置决定一次重新配置多少个从节点
  4. 更新原主节点配置

    • 当原主节点恢复时,将其配置为新主节点的从节点

客观下线状态只适用于主节点。对于从节点,Sentinel在将它们判断为下线前不需要进行协商,所以从节点永远不会达到客观下线状态。只有当主节点被认定为客观下线时,才会发生故障迁移操作。

配置传播

Sentinel会自动更新配置信息,并通过以下机制确保集群内的一致性:

  1. 每次执行故障转移时,执行的Sentinel会获得一个新的配置版本号
  2. 故障转移完成后,新的配置会广播给其他Sentinel
  3. 所有Sentinel最终会达成一致,采用最高版本号的配置

生产环境最佳实践

Sentinel部署建议

  1. Sentinel数量:至少部署3个Sentinel实例,并使用奇数个
  2. 物理分布:将Sentinel部署在不同的物理机器上,避免单点故障
  3. 法定人数(quorum)设置:对于N个Sentinel,建议设置为(N/2)+1
  4. 监控多个主节点:一个Sentinel集群可以监控多个主节点,复用Sentinel资源

将服务器标记为客观下线所需的Sentinel数量由对主服务器的配置决定。parallel-syncs参数指定了故障转移时,最多可以有多少个从服务器同时对新主服务器进行同步。这个数字越小,完成故障转移所需的时间就越长,但可以避免所有从服务器同时不可用的情况。

参数优化建议

  1. down-after-milliseconds

    • 不要设置太短,避免网络抖动导致误判
    • 不要设置太长,影响故障检测速度
    • 生产环境建议5000-30000毫秒
  2. failover-timeout

    • 控制故障转移的超时时间
    • 建议设置为较大值(如60000毫秒),确保有足够时间完成故障转移
  3. parallel-syncs

    • 影响故障转移期间的服务可用性
    • 设置为1可避免多个从节点同时不可用
    • 大型集群可以适当增加,加快故障恢复速度

安全加固建议

  1. 网络安全

    • 将Sentinel和Redis部署在私有网络中
    • 使用防火墙限制访问范围
    • 关闭Redis实例的protected-mode设置
  2. 认证安全

    • 所有Redis实例都设置强密码
    • 在Sentinel配置中设置auth-pass参数
    • Redis 6.0+版本可以配置ACL增强安全性
  3. 监控告警

    • 建立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的工作原理,有助于在遇到问题时进行正确的故障排查和解决。