使用NFS实现HA(HDFS High Availability With NFS)

本文介绍了如何使用NFS实现HDFS的High Availability (HA),包括架构、部署步骤、自动迁移机制以及BookKeeper作为共享存储的扩展方案。在HA集群中,NameNode在活动和备份状态间切换,共享存储确保状态同步。部署时,需要配置共享存储、NameNode硬件以及特定的HDFS参数。BookKeeper提供了一种高可用的存储解决方案,但目前存在一些限制。
摘要由CSDN通过智能技术生成
               

目的

本指南概述HDFS的高可用性(HA)的特性,以及如何配置和管理HA HDFS集群,使用NFS实现NameNode共享存储
本文假设读者有一个大致了解通用组件和一个HDFS集群中的节点类型。 详情请参阅HDFS架构指南。

注意:QJM或者共享存储

本指南讨论如何配置使用HDFS HA使用NFS目录在活跃的和备份的NameNode之间分享edit日志,对于如何通过QJM实现HA请参考上篇博客。

背景

Hadoop 2.0.0之前,NameNode是在一个HDFS集群一个单点故障(SPOF)。 每个集群有一个NameNode,如果那台机器坏掉,集群作为一个整体将不可用,直到NameNode启动或在另一个单独的机器上配置的。
这种设计将影响HDFS集群的可用性在两个主要方面:
计划外的事件,如NameNode宕机导致集群不可用。
计划内的维护活动,比如NameNode机器上的软件或硬件升级导致集群停机。
HDFS高可用性特性解决了上面的问题,可以通过在同一集群上配置运行两个冗余的NameNodes,做到主动/被动的热备份。这将允许当一个机器宕机时,快速转移到一个新的NameNode,或管理员进行利用故障转移达到优雅的系统升级的目的。

架构

一个典型的HA集群,NameNode会被配置在两台独立的机器上.在任何的时间上,一个NameNode处于活动状态,而另一个在备份状态,活动状态的NameNode会响应集群中所有的客户端,同时备份的只是作为一个副本,保证在必要的时候提供一个快速的转移。

为了备份节点和活跃的节点状态同步,当前的实现要求两个节点可以连接到一个共享设备上的目录(例如网络存储的网络文件系统)。这个架构会在以后的版本中实现。

当任何的namespace被活动状态的节点修改,他会记录在共享文件夹的edit日志文件中。备份节点观察共享文件夹的edit,他允许拥有自己的namespace。在执行自动迁移之前,备份节点在转换为活动的节点之前确认已经读取到共享存储当中所有的edit。这将确保和迁移之前完全同步。

为了提供一个快速的转移,备份NameNode要求保存着最新的block在集群当中的信息。为了能够得到这个,DataNode都被配置了所有的NameNode的地址,并且发送block的地址信息和心跳给两个node。

保证只有一个活跃的NameNode在集群当中是一个十分重要的一步。否则namespace状态在两个节点间不同会导致数据都是或者其他一些不正确的结果。为了确保这个,防止所谓split - brain场景,管理员至少为共享存储配置一个过滤方法。故障转移期间,如果前一个活跃节点不再是活跃状态那么他将无法通过过滤,过滤过程负责切断前一活跃的节点写入共享存储edits的权限。这会有效防止其他NameNode持续处于活跃状态,允许新的活动节点安全进行故障转移。

硬件资源

为了部署一个HA集群,你应该按照以下准备:


NameNode机器:机器负责运行活动和和备份的NameNode,两台机器应该有着完全一样的硬件,同样的硬件应该和没有HA的硬件完全一致。


共享存储:需要有一个共享文件夹并且所有的NameNode机器都有读写权限。通常这是一个远程文件,支持NFS并安装挂载在每个NameNode机器。目前只有单一的共享edits文件夹被支持。因此,系统的可用性被共享的edits文件夹所限制,为了解决这个单点则需要edits文件夹的冗余。具体来说,多个网络的存储路径和冗余存储本身(磁盘、网络、和权力)。因为这个原因,建议共享存储服务器是一个高质量的专用NAS设备而不是一个简单的Linux服务器。
注意:在一个HA集群中备份的NameNode也要坚持namespace的状态,那么就没有必要去运行一个Secondary NameNode, CheckpointNode, 或者是BackupNode在集群当中,事实上这么做的话有可能会是一个错误。为了允许有一个重新配置的非HA的集群可以实现HA,并且实现硬件的重用,所以把以前的secondary NameNode的机器作为这样一个机器。

部署


配置综述

HA的配置向后兼容允许既存的单NameNode配置在没有任何改动的情况下工作,新的配置被设计成集群当中的所有节点拥有着相同的配置并且并不需要为不同的机器设置不同的配置文件。

如HDFS Federation,HA集群重用nameserviceID去标示一个HDFS实例这个实例可能实际上包含了很多的HA NameNodes。另外一个新的抽象叫做NameNode ID被添置到了HA。在集群中每个不同的NameNode有着不同的NameNode ID 去标示他,所有的NameNode采用同一个配置文件,相关的配置参数都被用nameservice ID和NameNode ID作为后缀。

配置细节

配置HA NameNodes,你必须添加几个配置选项到你的hdfs-site.xml配置文件当中。
这是这些配置的顺序并不重要,但是你为dfs.nameservices和dfs.ha.namenodes.[nameservice ID] 设置的值将要决定下面步骤的key,因此,你应该决定这些值在设置这些选项之前。
dfs.nameservices -新的nameservice的逻辑名字
为nameservice选择一个名字,例如“mycluster”,并且用这个名字的值来作为一些配置项的值,这个名字是任意的。他将被用来配置在集群中作为HDFS的绝对路径组件。
注意如果你也采用HDFS系统,这个设置应该也包括一个包含其他nameservices,HA或者一个逗号分隔的列表
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

dfs.ha.namenodes.[nameservice ID] -为在nameservice中的每一个NameNode设置唯一标示符。

配置一个逗号分隔的 NameNode ID列表。这将是被DataNode识别为所有的NameNode。例如,如果使用“mycluster”作为nameservice ID,并且使用“nn1”和“nn2”作为NameNodes标示符,你应该如下配置:
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
注意:在每一个nameservice中最多只能有两个NameNode可以被配置

dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 每个NameNode监听的完整正确的RPC地址
对于先前配置的NameNode ID,设置全地址和IP端口的NameNode进程,注意配置两个独立的配置选项例如:
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</pr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值