1.背景
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集都有一个NameNode,如果该机器或进程变得不可用,整个群集将无法使用,直到NameNode重新启动或在单独的计算机上启动。
这在两个主要方面影响了HDFS集群的总体可用性:
对于计划外事件(例如计算机崩溃),在重新启动NameNode之前,群集将不可用。
计划维护事件(如NameNode计算机上的软件或硬件升级)将导致群集停机时间窗口。
HDFS高可用性功能通过提供在具有热备用的主动/被动配置中的同一群集中运行两个冗余NameNode的选项来解决上述问题。这允许在机器崩溃的情况下快速故障转移到新的NameNode,或者为了计划维护而优雅地管理员启动的故障转移。
2.架构
两个名称节点,一个active(激活态),一个是standby(slave待命),slave节点维护足够多状态以便于容灾。
两个节点都和JN守护进程构成组的进行通信。
数据节点配置两个名称节点,分别报告各自的信息。
同一时刻只能有一个激活态名称节点。
为防止脑裂(两个节点都是激活态),JNs只允许同一时刻只有一个节点向其写数据。容灾发生时,active节点的namenode
接管,向jn写入工作。
3.硬件资源
名称节点:硬件配置相同。
JN节点:轻量级进程,至少3个节点,允许挂掉的节点数 (n - 1) / 2.
不需要再运行辅助名称节点。
4.部署
(1)准备工作
在之前的基础上我们一共有5台客户机,s200(主节点)、s201(从节点)、s202(从节点)、s203(从节点)、s204(辅助名称节点),对应的ip分别为192.168.231.200、192.168.231.201、192.168.231.202、192.168.231.203、192.168.231.204。
保证主节点s200(名称节点)能通过ssh命令无密登录s200(localhost)、201、s202、s203、s204,保证s204(辅助名称节点)能通过ssh命令无密登录s200、s201、s202、s203、s204(localhost)。
我们把之前的/soft/hadoop/etc/目录下的full(完全分布式)文件拷贝并更名为ha,放到/soft/hadoop/etc/目录下。
(2)配置hdfs-site.xml文件
vi /soft/hadoop/etc/hdfs-site.xml
加入以下配置:
<!--配置 nameservice -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- myucluster下的名称节点两个id -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置每个nn的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.231.200:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.231.204:8020</value>
</property>
<!-- 配置webui端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.231.200:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.231.204:50070</value>
</property>
<!-- 名称节点共享编辑目录 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.231.201:8485;192.168.231.202:8485;192.168.231.203:8485/mycluster</value>
</property>
<!-- java类,client使用它判断哪个节点是激活态 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 脚本列表或者java类,在容灾保护激活态的nn -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/gao/.ssh/id_rsa</value>
</property>
<!-- 配置JN存放edit的本地路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/gao/hadoop/journal</value>
</property>
(3)配置core-site.xml文件
vi /soft/hadoop/etc/core-site.xml
加入以下配置:
<!-- 配置hdfs文件系统名称服务 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
(4)通过之前的脚本文件xcall.sh把ha文件分发到所有的客户机。
cd /soft/hadoop/etc/
xcall.sh ha
(5)在jn节点(s201、s202、s203)分别启动jn进程
hadoop-daemon.sh start journalnode
(6)启动jn之后,在两个NN(名称节点)之间进行disk元数据同步
(a)如果是全新集群,先格式化文件系统,只需要在一个名称节点(s200)上执行。
hadoop namenode -format
(b)如果将非HA集群转换成HA集群,复制原nn(名称节点)的metadata到另一个nn.
步骤一
scp -r /home/gao/hadoop/dfs gao@s204:/home/gao/hadoop/
步骤二
在新的nn(未格式化的名称节点)上运行一下命令,实现待命状态引导。
hdfs namenode -bootstrapStandby //需要s200为启动状态,提示是否格式化,选择N.
在一个NN(名称节点)上执行以下命令,完成edit日志到jn节点的传输。
hdfs namenode -initializeSharedEdits
查看s202,s203是否有edit数据.
启动所有节点.
在名称节点s200中:
hadoop-daemon.sh start namenode //启动名称节点
hadoop-daemons.sh start datanode //启动所有数据节点
在辅助名称节点s204中:
hadoop-daemon.sh start namenode //启动名称节点
5.HA管理
hdfs haadmin -transitionToActive nn1 //切成激活态
hdfs haadmin -transitionToStandby nn1 //切成待命态