面试题答案
一键面试故障检测
- 心跳机制:
- 集群中的每个节点定期向其他节点发送心跳包,其他节点收到心跳包后,确认发送节点的存活状态。
- 若在一定时间间隔(如
heartbeat_timeout
毫秒)内未收到某个节点的心跳包,则将该节点标记为疑似故障。
- 主观下线与客观下线:
- 当一个节点标记另一个节点为疑似故障时,这是主观下线(
PFAIL
)。 - 该节点会向集群中的其他节点询问被标记节点的状态,若超过半数的节点都认为该节点故障,则将其标记为客观下线(
FAIL
),正式判定该节点故障。
- 当一个节点标记另一个节点为疑似故障时,这是主观下线(
数据同步
- 从节点复制:
- 每个主节点都有对应的从节点,从节点通过
REPLICAOF
命令复制主节点的数据。 - 当主节点发生故障后,从节点晋升为主节点。晋升的从节点会保留故障主节点故障前的数据,保证数据的部分完整性。
- 每个主节点都有对应的从节点,从节点通过
- 全量同步与部分同步:
- 全量同步:新晋升的主节点需要与其他从节点进行数据同步。新主节点会生成一个
RDB
文件发送给从节点,从节点清空原有数据并加载RDB
文件。 - 部分同步:在网络断开等情况下,若从节点与主节点断开连接时间较短,主节点会记录断开期间的数据变化,通过
PSYNC
命令只将这部分增量数据同步给从节点,减少数据同步量。
- 全量同步:新晋升的主节点需要与其他从节点进行数据同步。新主节点会生成一个
消息重路由
- 客户端感知:
- 客户端在连接集群时,会维护一个节点映射表。当检测到某个节点故障后,客户端从集群配置中获取新的节点映射关系,将原本发送到故障节点的消息重路由到新的主节点或其他相关节点。
- 代理层处理:
- 若架构中有代理层(如 Twemproxy 等),代理层负责监控节点状态。当节点故障时,代理层重新计算哈希槽与节点的映射关系,将消息重路由到正确的节点。
- 代理层还可以缓存部分数据,在故障恢复期间,若客户端请求的数据在缓存中,直接返回缓存数据,减少对后端节点的压力。
对系统性能和可用性的影响
- 性能影响:
- 故障检测:心跳机制和故障判定过程会占用一定的网络带宽和节点 CPU 资源,但这是保证系统可用性的必要开销。
- 数据同步:全量同步时,生成和传输
RDB
文件会占用大量的网络带宽和磁盘 I/O 资源,可能导致系统性能短暂下降。部分同步在一定程度上减轻了这种性能损耗。 - 消息重路由:客户端或代理层重新计算路由关系以及可能的缓存操作,会增加一定的处理时间,但相比数据丢失或服务中断,这种性能影响是可接受的。
- 可用性影响:
- 提高可用性:通过上述故障恢复机制,系统能够快速检测到节点故障,并进行数据同步和消息重路由,确保消息处理的连续性,大大提高了系统的可用性。
- 短暂不可用:在故障检测、数据同步和消息重路由过程中,可能会存在短暂的服务不可用时间,但通过合理设置参数和优化机制,可以将这段时间压缩到最短,满足大多数应用场景的需求。