HDFS故障恢复技术

什么是lease?

client write请求之前需要申请一个lease,类似于一个锁,此锁有超时时间,如果client需要持续更新的话,需要定期renew lease,达到长期占有写锁的期望。

如果client lease到期,但是没有正常close文件,那么master就会强制关闭client的连接,并对之前client操作的replica进行lease recovery.

lease recovery

lease recovery是client过了lease的租期后,被master回收写权限,同时需要对之前client的写操作进行处理的过程。

  1. 获取涉及文件f的最后一个block的所有datanode节点。
  2. 指定其中一个节点作为主节点p
  3. p从master获取新的generation stamp
  4. p从各个datanode获取block info
  5. 计算所有datanode节点last block的最小长度
  6. 更新所有的datanode,以最小长度作为block长度
  7. 通知master更新block信息
  8. master更新block信息
  9. master清除client的lease,让其它client可以进行写入操作
  10. master写WAL

HDFS write pipeline

HDFS为了达到高可用,一条数据会写多个副本,写数据采用了pipeline方式。

HDFS Write Pipeline

管道写的三个流程:

  1. Pipeline setup.客户端给datanode发送写请求,pipeline最后一个datanode返回响应才算成功
  2. Data streaming.客户端将写操作缓存,buffer满或者调用了flush之后,缓存数据才会写到datanode
  3. Close. 结束写入,等待所有datanode写入完成的通知,然后发送close命令给datanode,datanode接收到命令后,将状态设置为FINALIZED.

DataNode recovery

Recovery from Pipeline Setup Failure

  1. 如果是申请写新的block失败,则向master重新申请新的block,以及新的datanodes列表。
  2. 如果是写老block失败,则用正常的datanodes重建datanodes链表,并更新generation stamp

Recovery from Data Streaming Failure

  1. 当某个datanode出现问题,比如宕机或者磁盘故障,所有的TCP/IP连接都会断开。
  2. client感知某个datanode故障,停止发送写请求,利用正常的datanodes重建datanodes链表,同时更新GS
  3. client重新发送buffered data。如果一些datanode已经接受过此数据,则此datanode只会作为数据的跳板,不再重复写入,而是讲数据顺序下发。

Recovery from Close Failure

  1. client重建datanode链表,每个datanode提升GS,同时没有进入FINALIZED状态的进入FINALIZED状态

个人思考

  1. datanode的写入是通过pipeline方式管道写入,性能存在瓶颈
  2. 故障恢复依赖了master和client的相互作用
  3. 如果第一次三个节点失败,需要client请求重建datanode,重新写请求
  4. 可以借鉴raft、paxos等一致性协议,多数写入成功就算成功,避免client频繁与datanodes交互

本文标题:HDFS故障恢复技术

文章作者:Louis

发布时间:2017年09月20日 - 15:09

最后更新:2017年09月25日 - 14:09

原始链接:/2017/09/20/hdfs-recovery/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。