MST

星途 面试题库

面试题:Redis Sentinel 获取主服务器信息的一致性与容错性设计

在分布式环境下,网络分区、节点故障等情况时常发生。请深入分析 Redis Sentinel 在获取主服务器信息过程中,是如何保证信息一致性和容错性的,包括在不同故障场景下 Sentinel 的应对机制,结合底层原理和实际应用场景进行阐述。
26.6万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis Sentinel 获取主服务器信息保证一致性和容错性的原理

  1. 多 Sentinel 节点协作
    • Sentinel 采用多节点模式,多个 Sentinel 节点共同监控 Redis 主从集群。每个 Sentinel 节点都定期向主服务器和从服务器发送 PING 命令来检测其健康状态。例如,假设有三个 Sentinel 节点 S1、S2、S3 监控一个主服务器 M 和两个从服务器 Sla、Slb。
    • 当一个 Sentinel 节点发现主服务器故障时,不会立即进行故障转移,而是先在 Sentinel 节点之间进行信息交换。比如 S1 发现 M 故障,它会向 S2 和 S3 发送自己对主服务器状态的判断信息,通过这种多节点协作,避免单个 Sentinel 节点误判。
  2. 主观下线和客观下线
    • 主观下线(SDOWN - Subjective Down):当一个 Sentinel 节点在一定时间内(可配置的 down - after - milliseconds 参数)没有收到主服务器的回复(例如 PING 命令的回复),该 Sentinel 节点会将主服务器标记为主观下线。这只是该 Sentinel 节点自身的判断。
    • 客观下线(ODOWN - Objective Down):多个 Sentinel 节点通过互相交换信息,当超过一定数量(可配置的 quorum 参数)的 Sentinel 节点都认为主服务器主观下线时,主服务器就会被标记为客观下线。例如,设置 quorum 为 2,当 S1 和 S2 都标记主服务器主观下线后,经过信息交换,主服务器就会被标记为客观下线。这一机制保证了对主服务器故障判断的一致性。
  3. 故障转移过程中的信息一致性
    • 选举领头 Sentinel:当主服务器被标记为客观下线后,Sentinel 节点之间会进行选举,选出一个领头 Sentinel 来执行故障转移操作。选举采用 Raft 算法的变种。每个 Sentinel 节点会向其他 Sentinel 节点发送 SENTINEL is - master - down - by - addr 命令,请求对方给自己投票。获得超过半数(包括自身)投票的 Sentinel 节点成为领头 Sentinel。例如,三个 Sentinel 节点,至少需要两个节点投票才能成为领头 Sentinel。
    • 选择新主服务器:领头 Sentinel 从从服务器列表中选择一个从服务器晋升为主服务器。选择规则主要考虑从服务器的优先级(可配置的 slave - priority 参数)、复制偏移量(复制数据的进度)等因素。例如,优先级高且复制偏移量较大的从服务器更有可能被选中。在这个过程中,所有 Sentinel 节点会同步新主服务器的信息,保证信息一致性。
    • 重新配置从服务器:领头 Sentinel 会向其他从服务器发送 SLAVEOF 命令,让它们成为新主服务器的从服务器,同时更新自己的配置文件和内存中的状态信息,其他 Sentinel 节点也会更新对新主从关系的认知,从而在整个分布式环境中保证主服务器信息的一致性。

不同故障场景下 Sentinel 的应对机制

  1. 网络分区故障场景
    • Sentinel 节点间网络分区:如果部分 Sentinel 节点之间出现网络分区,被分隔的 Sentinel 节点集可能会各自独立运行。例如,S1 和 S2 组成一个分区,S3 单独在一个分区。在这种情况下,只要每个分区内的 Sentinel 节点数量没有达到 quorum,就不会进行错误的故障转移。当网络恢复后,Sentinel 节点会重新交换信息,调整状态,恢复一致的认知。
    • 主从服务器与 Sentinel 节点间网络分区:若主服务器与部分 Sentinel 节点网络隔离,被隔离的 Sentinel 节点可能会将主服务器标记为主观下线。但由于没有足够数量的 Sentinel 节点达成客观下线的共识(未达到 quorum),不会进行故障转移。当网络恢复后,Sentinel 节点会重新确认主服务器状态,调整到正确状态。
  2. 节点故障场景
    • Sentinel 节点故障:某个 Sentinel 节点故障不会影响整个 Sentinel 系统的运行。因为其他 Sentinel 节点仍能继续监控 Redis 主从集群,并在需要时进行故障转移。例如,S1 故障,S2 和 S3 仍可以协作完成对主服务器的监控和故障转移操作。当故障的 Sentinel 节点恢复后,它会从其他 Sentinel 节点获取最新的状态信息,重新加入 Sentinel 集群。
    • 主服务器故障:如前面所述,当主服务器故障时,Sentinel 节点通过主观下线、客观下线、选举领头 Sentinel 等步骤进行故障转移,选择新的主服务器,保证 Redis 服务的可用性。例如,主服务器 M 故障,Sentinel 节点会选举出领头 Sentinel,从从服务器 Sla 和 Slb 中选择一个晋升为主服务器,继续提供服务。
    • 从服务器故障:Sentinel 节点会检测到从服务器故障,并将其标记为下线。在故障转移时,故障的从服务器不会被选为新主服务器。同时,Sentinel 会监控从服务器的恢复情况,当故障从服务器恢复后,会重新将其加入到从服务器列表,作为新主服务器的从服务器进行数据同步。

实际应用场景

  1. 高可用性要求的业务场景:如电商系统的用户登录模块,需要保证 Redis 存储的用户登录状态信息始终可用。使用 Redis Sentinel 可以在主服务器出现故障时,快速进行故障转移,确保登录验证等操作不受影响,保证业务的连续性。
  2. 数据一致性敏感的场景:例如金融交易系统,在处理交易数据时,Redis 中存储的账户余额等信息必须保证一致性。Sentinel 通过上述机制保证主服务器信息的一致性,在故障转移过程中,能尽量减少数据丢失和不一致的情况,确保交易数据的准确性。