面试题答案
一键面试第一阶段:准备阶段(Prepare Phase)
- 协调者(Coordinator):在HBase的Snapshot操作中,协调者通常是发起Snapshot请求的RegionServer。协调者会向所有参与Snapshot操作的RegionServer发送Prepare请求,这些RegionServer负责管理不同的HBase Region。
- 参与者(RegionServer):每个接收到Prepare请求的RegionServer会执行以下步骤:
- Region冻结:停止对Region的写入操作,防止在Snapshot过程中有新的数据写入,确保数据的一致性。这通常通过暂停MemStore的刷写(flush)和HLog的写入来实现。
- 生成预写日志(WAL)标记:在HLog中记录一个特殊的标记,标记当前Snapshot操作的开始位置。这个标记用于后续恢复和验证Snapshot的完整性。
- 准备数据文件:对当前Region内的所有StoreFile(HFile)进行标记,记录它们在文件系统中的位置和元数据信息。这些信息将用于后续创建Snapshot。
- 回复准备结果:RegionServer向协调者回复Prepare响应,告知协调者自己已经完成准备工作,或者报告准备过程中遇到的任何错误。
第二阶段:提交阶段(Commit Phase)
- 协调者(Coordinator):
- 决策提交:如果协调者收到所有参与者(RegionServer)的成功Prepare响应,意味着所有Region都已准备好进行Snapshot,协调者会决定进入提交阶段,并向所有RegionServer发送Commit请求。如果有任何一个参与者回复失败,协调者会发送Abort请求,取消Snapshot操作。
- 参与者(RegionServer):
- 创建Snapshot:接收到Commit请求的RegionServer会根据准备阶段记录的信息,在文件系统层面创建Snapshot。这通常涉及创建一个指向原始数据文件的硬链接(hard link)或者元数据引用,而不是复制实际的数据文件内容,从而实现快速创建Snapshot。
- 更新元数据:RegionServer在HBase的元数据(如.META.表)中记录新创建的Snapshot的相关信息,包括Snapshot的名称、包含的Region范围、关联的时间戳等。
- 完成操作:RegionServer完成Snapshot创建和元数据更新后,向协调者发送Commit响应,表示Snapshot操作成功完成。如果接收到的是Abort请求,RegionServer会取消准备阶段的操作,恢复Region的正常写入,并向协调者发送Abort响应。
- 协调者(Coordinator):协调者在收到所有参与者的Commit响应(或Abort响应)后,完成整个Snapshot操作的处理。如果所有RegionServer都成功提交,Snapshot操作完成;否则,协调者会处理失败情况,可能包括记录错误日志、通知相关组件等。