HDFS NameNode HA部署(Quorum Journal Manager方案) 2015-05-26 22:00

版本信息

Hadoop版本:2.4.1

介绍

HDFS集群中只有一个NameNode,这就会引入单点问题。为解决NameNode单点问题,Apache社区提供了Quorum Journal Manager(QJM)方案和NFS方案。本文介绍QJM方案。

此方案中,在两个节点上部署NameNode。任何时刻,只有一个NameNode处于Active状态,另一个处于Standby状态。

Active NameNode用于接收Client端请求,Standy NameNode作为Slave保持集群的状态数据以便快速Failover接管业务。

为了让Standby Node与Active Node保持同步,这两个Node都与一组互相独立的进程保持通信(Journal Nodes)。当Active Node上更新了Namespace,它将记录修改日志发送给Journal Nodes。Standby noes将会从Journal Nodes中读取这些Edits。Standby Node将日志变更应用在自己的Namespace中。当Failover发生时,Standby将会在提升自己为Active之前,确保能够从JNS中读取所有的Edits。即在failover发生之前,Standy持有的namespace应该与Active保持完全同步。

  • 社区的NameNode HA方案

社区的NameNode HA包括两个NameNode,主(active)与备(standby),ZKFC,ZK,share editlog。流程:集群启动后一个NN处于active状态,并提供服务,处理客户端和datanode的请求,并把editlog写到本地和share editlog(可以是NFS,QJM等)中。另外一个NN处于Standby状态,它启动的时候加载fsimage,然后周期性的从share editlog中获取editlog,保持与active的状态同步。为了实现standby在sctive挂掉后迅速提供服务,需要DN同时向两个NN汇报,使得Stadnby保存block to datanode信息,因为NN启动中最费时的工作是处理所有datanode的blockreport。为了实现热备,增加FailoverController和ZK,FailoverController与ZK通信,通过ZK选主,FailoverController通过RPC让NN转换为active或standby。

部署方案

各进程所部署的物理节点关系如下:

  • NameNode: ctrl, data01
  • ZKFC:ctrl, data01
  • DataNode: data01, data02, data03
  • JournalNode: data01, data02, data03
  • Zookeeper:data01, data02, data03(本文假设已经部署)

NameService和NameNodeID规划如下:

  • NameService: myns
  • NameNodeID: mynn1,mynn2

hdfs-site.xml配置

配置NameService和NameNodeID

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<property>
    <name>dfs.nameservices</name>
    <value>myns</value>
    <description>提供服务的NameService逻辑名称,与core-site.xml里的对应</description>
</property>
<property>
    <name>dfs.ha.namenodes.myns</name>
    <value>mynn1,mynn2</value>
    <description>列出该逻辑名称下的NameNode逻辑名称</description>
</property>
<property>
    <name>dfs.namenode.rpc-address.myns.mynn1</name>
    <value>ctrl:9000</value>
    <description>指定第一个NameNode的RPC位置</description>
</property>
<property>
    <name>dfs.namenode.http-address.myns.mynn1</name>
    <value>ctrl:50070</value>
    <description>指定第一个NameNode的Web Server位置</description>
</property>
<property>
    <name>dfs.namenode.rpc-address.myns.mynn2</name>
    <value>data01:9000</value>
    <description>指定第二个NameNode的RPC位置</description>
</property>
<property>
    <name>dfs.namenode.http-address.myns.mynn2</name>
    <value>data01:50070</value>
    <description>指定第二个NameNode的Web Server位置</description>
</property>

配置EditLog的共享目录

1
2
3
4
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://data01:8485;data02:8485;data03:8485/namenode-ha-data</value>
</property>

Zookeeper相关配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<property>
    <name>ha.zookeeper.quorum</name>
    <value>data01:2181,data02:2181,data03:2181</value>
    <description>指定用于HA的ZooKeeper集群机器列表</description>
</property>
<property>
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>5000</value>
    <description>指定ZooKeeper超时间隔,单位毫秒</description>
</property>
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
    <description>切换到ssh登录到另一台NameNode杀死旧的主进程.缺省是ssh,可设为shell.</description>
</property>
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

配置JournalNode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<property>
    <name>dfs.journalnode.rpc-address</name>
    <value>0.0.0.0:8485</value>
</property>
<property>
    <name>dfs.journalnode.http-address</name>
    <value>0.0.0.0:8480</value>
</property>
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/hadoop/dfs/journal</value>
</property>

需要在三个JournalNode上配置。

客户端所需的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    <description>或者false</description>
</property>
<property>
    <name>dfs.client.failover.proxy.provider.myns</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    <description>指定客户端用于HA切换的代理类,不同的NS可以用不同的代理类
        以上示例为Hadoop 2.0自带的缺省代理类</description>
</property>

删除SecondaryNameNode配置

采用HA方案后,已经不再需要SecondaryNameNode,所以需要删除此配置。

1
2
3
4
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>ctrl:50090</value>
</property>

core-site.xml

1
2
3
4
5
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://myns</value>
    <description>缺省文件服务的协议和NS逻辑名称,和hdfs-site里的对应</description>
</property>

默认FS由原来的指定节点,现在改为指定NameService。

部署

说明

默认的"sbin/start-dfs.sh"脚本会根据"dfs.namenode.shared.edits.dir"配置,在相应的节点上启动JournalNodes。一般情况下,无需手工启动JournalNode。如果需要手工启动,命令是:

bin/hdfs start journalnode

非HA改造为HA场景

  • 将原NameNode上的MetaData复制到另一台Name上

即复制配置项[dfs.namenode.name.dir]目录下的数据。

[root@ctrl dfs]# scp -r /opt/hadoop/dfs/name data01:/opt/hadoop/dfs/
  • 新加入的namenode上执行"hdfs namenode -bootstrapStandby"

运行这个指令需要确保JournalNodes中持有足够多的edits。

[root@data01 dfs]# hdfs namenode -bootstrapStandby
  • 旧的NameNode上初始化JournalNode

这个指令会使用本地NameNode中的edits来初始化JournalNodes。

[root@ctrl dfs]# hdfs namenode -initializeSharedEdits

注意: 执行此命令需要stop-dfs.sh后执行。而执行此命令时,需要连接到JournalNode。所以,需要先手工在三个JournalNode节点上启动JournalNode:

hadoop-daemon.sh start journalnode
  • 初始化ZK
hdfs zkfc -formatZK

新建HDFS集群场景

新建的HDFS集群需要在每个Namenode上执行"hdfs namenode -format"指令格式化NameNode。

然后继续完成[非HA改造为HA场景]中的操作。

启动

[root@ctrl dfs]# start-dfs.sh

jps查看已启动进程:

  • ctrl: NameNode、DFSZKFailoverController
  • data01: NameNode、DFSZKFailoverController、JournalNode、QuorumPeerMain、DataNode
  • data02: JournalNode、QuorumPeerMain、DataNode
  • data01: JournalNode、QuorumPeerMain、DataNode
  • 查看哪一个节点是Master
  • http://ctrl:50070
  • http://data01:50070
    首页会显示节点是active还是standby。

维护

  • 查看节点状态
hdfs haadmin -getServiceState mynn1
hdfs haadmin -getServiceState mynn2
  • 测试故障切换

kill -9杀掉active NameNode,再查看原Standby NameNode的状态。

注意事项

  1. 在HA集群中不需要运行SecondaryNameNode、CheckpointNode或者BackupNode。事实上,HA架构中运行上述节点,将会出错(不允许)
  2. 新的配置中,要求集群中所有的Nodes都有相同的配置文件(包括客户端),而不是根据不同的Node设定不同的配置文件.

参考文档

  1. Hadoop 2.0 NameNode HA和Federation实践
  2. HDFS HA与QJM[官网整理]
  3. Namenode HA原理详解
  4. Hadoop2.0 Namenode HA实现方案介绍及汇总
Tags: #HDFS    Post on Hadoop