面试题答案
一键面试1. 检测数据一致性破坏
- WAL(Write - Ahead Log)检查:HBase使用WAL来记录所有数据修改操作。故障发生后,系统会重放WAL日志,通过对比日志记录与实际存储的数据状态,检测是否存在不一致。例如,日志中有数据插入记录,但对应的数据在Region中不存在,这就表明出现了一致性问题。
- 心跳机制:正常工作的节点会定期向Master节点发送心跳信息。Master节点通过心跳来监控各个RegionServer的状态。当某个RegionServer未按时发送心跳,Master节点会判定该节点可能出现故障。同时,RegionServer在心跳中也会汇报自身管理的Region状态,若Master发现不同RegionServer对同一数据的版本信息存在差异,也能检测到一致性破坏。
- 数据校验和:HBase在存储数据时,会为每个数据块计算校验和(如CRC32等)。当读取数据时,重新计算校验和并与存储的校验和对比。如果校验和不一致,说明数据在存储或传输过程中可能出现错误,导致一致性被破坏。
2. 恢复数据一致性的算法和流程
- Region重新分配:Master节点检测到某个RegionServer故障后,会将该故障节点管理的Region重新分配到其他正常的RegionServer上。Master根据负载均衡算法,选择合适的RegionServer接收这些Region。例如,会优先选择负载较低且与故障节点地理位置较近(减少网络传输开销)的RegionServer。
- WAL重放:新接管Region的RegionServer会从故障节点的WAL日志中读取未完成的操作,并重新应用这些操作。以数据插入操作为例,重放WAL日志时,会根据日志记录将相应的数据插入到新的Region中。在重放过程中,RegionServer会根据数据的时间戳和版本号等信息,确保操作的顺序性和正确性,避免出现数据覆盖错误。
- 合并操作:如果故障节点上的部分数据已经写入了MemStore但还未Flush到磁盘,新接管的RegionServer会将这些MemStore数据与自身已有的数据进行合并。合并时,会根据数据的键值对和版本号等信息进行排序和合并,保证最新版本的数据被保留。
3. 故障节点恢复后的数据同步
- 数据版本对比:故障节点恢复后,它会向Master节点汇报自己的状态。Master节点会协调故障节点与当前管理对应Region的RegionServer进行数据版本对比。两个节点会交换数据的版本号和时间戳等信息,确定哪些数据需要同步。
- 增量同步:根据版本对比结果,采用增量同步的方式进行数据同步。即只同步那些在故障期间发生变化的数据。例如,故障节点上的数据版本较旧,而当前RegionServer上有更新的数据,就将这些新数据同步到故障节点。同步过程中,会使用类似于块传输的方式,将数据块从源节点传输到故障节点。
- 一致性验证:数据同步完成后,故障节点和当前管理Region的RegionServer会再次进行数据一致性验证。通过重新计算数据校验和、对比关键数据的版本号等方式,确保数据完全一致。若验证不通过,会重新进行同步操作,直到数据一致性得到保证。