hdfs可靠性设计

hdfs能够提到如此广泛的使用,跟hdfs是分不开的。作为一个能够在成千上万个服务器上运行的分布式文件系统,hdfs在可靠性设计上是考虑非常周全的

hdfs数据块多副本存储设计

hdfs分布式文件系统采用多副本方式来存储数据块,且同同个数据块的多个副本会存储在不同的服务器中(如果有机架区分会存储在不同的机架上)。采用多副本有如下几个优势。

  • 1、采用多副本,可以让客户端从不同的数据块读取数据,加快传输速度。
  • 2、hdfs和datanode是通过网络传输,采用多副本可以判断传输是否报错。
  • 3、多副本保证一个datanode失效的情况下,数据还可用。

hdfs可靠性的设计实现

1、安全模式

hdfs刚启动的时候会进入到安全模式(safe mode)。处于安全模式的namenode不能做任何文件操作,甚至内部副本创建都是不允许的。namenode此时会和datanode进行通信 ,回去datanode数据块,并且对数据块进行检测。只有通过了namenode的检测,一个数据块才被认为是安全的。当认为安全的数据块超过一定阈值之后,namenode才退出 安全模式。

2、secondaryNameNode

hadoop使用secondaryNameNode来备份namenode的元数据,以便在namenode出现故障的时候可以从secondaryNameNode恢复元数据。secondaryNameNode充当namenode的一个 副本,他本身不处理任何请求,因为这些请求都是通过namenode来访问。

namenode中保存了整个文件系统的元数据,而secondaryNameNode的作用就是周期性的保存namenode的元数据。这些元数据包括文件镜像数据FsImage和编辑日志数据Editlog。 FsImage相当于hdfs的检查点,namenode启动的时候会读取FsImage日志信息到内存中,并将与其Editlog日志数据进行合并生成新的FsImage。在namenode运行期间,关于hdfs的所 有修改都会记录到Editlog日志文件中。如果namenode失效,可以从secondaryNameNode保存的FsImage和Editlog日志数据恢复出namenode的最新状态,尽量减少损失。

3、心跳、副本重新创建

hdfs启动心跳机制保存hdfs在运行期间namenode和datanode之前连通性。namenode周期性的向datanode发送心跳请求,收到心跳请求的datanode会发送回复信息,如果侦探到datanode 失去连接,那么保存在这个datanode的数据块就不可用,那么这些数据块就会重新创建新的副本。

4、数据一致性

hdfs分布式文件系统使用校验和(checksum)来校验文件传输过程中文件是否出现损坏,如果出现损坏就从其他的副本来传递数据。

5、租约

当多个进程同时写入一个文件的时候,为了保持数据一致性,使用到了租约(lease)来保证只有一个进程能够写数据。当进程写入文件的时候,首先从namenode获取一个租约(租约存在过期时间), 当文件名称存在租约的时候,其他进程就不能够写入文件。当租约过期的时候,客户端就要重新生成新的租约。如果客户端超时没有重新获取租约,namenode就会收回租约。

5、回滚

当对hdfs进行版本升级的时候,如果新版本出现了问题,可以对版本进行回滚。因为hdfs在升级的时候会备份原来版本的信息。