MST

星途 面试题库

面试题:Redis Sentinel 获取从服务器信息时如何处理网络故障及数据一致性

当 Redis Sentinel 在获取从服务器信息过程中遇到网络故障,可能会影响数据一致性。请阐述如何检测这类网络故障,以及在故障恢复后如何确保数据的一致性,包括 Sentinel 的相关配置和工作机制。
11.4万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

检测网络故障

  1. 心跳检测
    • Sentinel 通过定期向主从服务器发送 PING 命令来检测连接状态。默认情况下,Sentinel 每 10 秒会对主服务器和从服务器执行一次 INFO 命令,在 INFO 命令执行间隙,每 1 秒会向主从服务器发送 PING 命令。如果在一定时间内(可配置,如 down - after - milliseconds 参数)没有收到回复,就认为服务器主观下线(Subjectively Down,SDOWN)。
    • 例如,配置 sentinel down - after - milliseconds mymaster 30000,表示如果 Sentinel 在 30000 毫秒(30 秒)内没有收到名为 mymaster 的主服务器的回复,就将其标记为主观下线。
  2. 多 Sentinel 交互检测
    • 多个 Sentinel 之间会相互通信,交换关于主从服务器的状态信息。当一个 Sentinel 认为某个服务器主观下线后,会询问其他 Sentinel 的意见。如果达到一定数量(可配置,如 sentinel quorum mymaster 2,表示至少 2 个 Sentinel 都认为 mymaster 下线,才会判定为主观下线)的 Sentinel 都认为该服务器下线,那么就会将其标记为客观下线(Objectively Down,ODOWN)。

故障恢复后确保数据一致性

  1. 自动故障转移
    • 当主服务器被判定为客观下线后,Sentinel 会从从服务器中选举一个作为新的主服务器。选举过程如下:
      • 每个 Sentinel 会向其他 Sentinel 发送 SENTINEL is - master - down - by - addr 命令,表明自己认为某个主服务器已经下线,并请求其他 Sentinel 支持自己进行故障转移。
      • Sentinel 会根据从服务器的优先级(可通过 slave - priority 配置,值越低优先级越高)、复制偏移量(复制的进度,偏移量越大表示数据越新)、运行 ID 等因素来选举新的主服务器。例如,优先级为 100 的从服务器优先于优先级为 200 的从服务器被选举为新主。
      • 选举出的新主服务器会向其他从服务器发送 SLAVEOF NO ONE 命令,使其成为自己的从服务器,重新建立主从关系。
  2. 数据同步
    • 新主服务器选举完成后,其他从服务器会通过 SYNCPSYNC 命令与新主服务器进行数据同步。如果从服务器之前已经与主服务器有过同步,并且复制偏移量在主服务器的复制积压缓冲区(可通过 repl - backlog - size 配置)内,就会使用 PSYNC 进行部分同步,只同步缺失的数据;否则使用 SYNC 进行全量同步,从主服务器完整地复制数据。
    • 例如,配置 repl - backlog - size 1mb,表示复制积压缓冲区大小为 1MB,如果从服务器的偏移量与主服务器相差的数据量在这个 1MB 范围内,就可以进行部分同步。
  3. Sentinel 相关配置
    • sentinel monitor <master - name> <ip> <port> <quorum>:用于配置要监控的主服务器,<master - name> 是主服务器的名称,<ip><port> 是主服务器的地址和端口,<quorum> 是判定主服务器客观下线所需的 Sentinel 数量。
    • sentinel down - after - milliseconds <master - name> <milliseconds>:设置判定服务器主观下线的时间。
    • sentinel failover - timeout <master - name> <milliseconds>:设置故障转移的超时时间,如果在这个时间内故障转移没有完成,Sentinel 会尝试重新进行故障转移。
    • sentinel parallel - syncs <master - name> <num>:设置在故障转移后,同时与新主服务器进行同步的从服务器数量,避免过多从服务器同时同步对新主服务器造成过大压力。例如,设置为 1 表示依次进行同步。