面试题答案
一键面试- 心跳检测机制:
- Sentinel通过定期向主服务器发送PING命令来检测其存活状态。如果主服务器在规定时间内没有响应,Sentinel会标记主服务器为“主观下线”(SDOWN)。这是一种基本的健康检查,虽然不是直接验证数据一致性,但确保主服务器处于可正常交互状态是数据一致性验证的前提。
- 多Sentinel协作验证:
- 多个Sentinel节点会互相交换信息。当一个Sentinel标记主服务器为“主观下线”后,它会向其他Sentinel询问对该主服务器的状态判断。如果达到一定数量(quorum)的Sentinel都认为主服务器下线,那么主服务器会被标记为“客观下线”(ODOWN)。这种协作机制可以避免单个Sentinel因为自身故障或短暂网络问题而误判。同时,在判断过程中,Sentinel之间也会交换从主服务器获取的一些元数据信息(如运行ID等),间接对获取信息的一致性进行验证。
- 数据校验和:
- 可以在主服务器端为关键数据生成校验和(如CRC32、MD5等),并定期将校验和发送给Sentinel。Sentinel获取数据后,自行计算数据的校验和,并与主服务器发送的校验和进行对比。如果两者一致,则说明获取的数据大概率是准确的;如果不一致,说明数据在传输过程中可能发生了错误。
- 版本号机制:
- 主服务器为数据维护一个版本号,每次数据发生变更,版本号递增。Sentinel获取数据时,同时获取版本号。下次获取数据时,对比版本号,如果版本号没有变化且数据内容相同,则可认为数据一致性良好;如果版本号变化了,但数据内容未变,可能存在数据传输错误等问题。
- 基于时间戳的验证:
- 主服务器在数据上标记时间戳,每次数据更新时更新时间戳。Sentinel获取数据时记录时间戳,后续再次获取时对比时间戳,结合数据内容来判断数据是否在正确的时间顺序下进行了更新,以此验证数据一致性。
- 全量对比与增量对比:
- 全量对比:Sentinel可以定期请求主服务器的全量数据,并与本地缓存的数据进行逐字节对比,这种方式能全面验证数据一致性,但开销较大。
- 增量对比:主服务器记录数据变更日志,Sentinel获取变更日志并应用到本地缓存,然后对比应用前后的数据状态是否与主服务器一致。这种方式开销相对较小,适用于频繁数据更新场景。