1 概述
- 所谓HA(High Available),即高可用(7*24小时不中断服务)。
- 实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
- Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
- NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
hdfs的HA方案官网
可以大概看一下官网,这里配置双namenode节点则不再需要secondary Namenode 节点
2 部署hdfs HA集群
2.1 机器列表
机器 | 角色 |
---|---|
wyl01 | nn1、JournalNode |
wyl02 | nn2、JournalNode |
wyl03 | JournalNode、其他角色 |
2.2 安装包位置和文件内容
前面我们介绍过hadoop集群的部署,所以这里我们只是部署hdfs集群的namenode的高可用。
三台机器,每台机器存放路径为下图所示
根据官网描述的我们需要修改两个配置为文件core-site.xml
和hdfs-site.xml
# core-site.xml 的配置文件
[root@wyl01 hadoop]# cat core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/HA/hadoop/data/tmp</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/HA/hadoop/data/jndata</value>
</property>
</configuration>
# hdfs-site.xml的配置文件
[root@wyl01 hadoop]# cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>wyl01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>wyl02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>wyl01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>wyl02:50070</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://wyl01:8485;wyl02:8485;wyl03:8485/mycluster</value>
</property>
<property>
<!--代理类,将nn2变成active-->
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--关闭权限检查 -->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!--fencing隔离机制当nn2试图active不让起-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
</configuration>
2.3 拷贝到其他两台机器
[root@wyl01 HA]# rsync -av hadoop hadoop-2.9.2 wyl02:/opt/HA
[root@wyl01 HA]# rsync -av hadoop hadoop-2.9.2 wyl03:/opt/HA
2.4 启动各个节点
启动顺序:先生成JournalNode服务—>nn1初始化—>nn1启动—>nn2同步—>nn2启动
在各个JournalNode节点上,输入以下命令启动JournalNode服务
[root@wyl03 hadoop]# ./sbin/hadoop-daemon.sh start journalnode
在[nn1]上,对其进行格式化,并启动
# 初始化
[root@wyl01 hadoop]# ./bin/hadoop namenode -format
格式化后,我们看到会自动生成data目录存储数据
# 启动
[root@wyl01 hadoop]# ./sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/HA/hadoop-2.9.2/logs/hadoop-root-namenode-wyl01.out
[root@wyl01 hadoop]# jps
25399 Jps
25018 JournalNode
25339 NameNode
启动后我们打开web页面,查看到节点是状态时standby;
在[nn2]上,同步nn1的元数据信息
# 同步数据
[root@wyl02 hadoop]# ./bin/hdfs namenode -bootstrapStandby
[root@wyl02 hadoop]# ./sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/HA/hadoop-2.9.2/logs/hadoop-root-namenode-wyl02.out
[root@wyl02 hadoop]# jps
28146 Jps
27747 JournalNode
28052 NameNode
启动后我们打开web页面,查看到节点是状态时standby;
将nn1切换成active
[root@wyl01 hadoop]# bin/hdfs haadmin -transitionToActive nn1
官网还提供其他的指令检查集群的状态
当我们把nn1给停掉,查看nn2是否切换成active,通过下图沃恩可以看到hadoop官网直接屏蔽掉了nn2切换成active,避免了脑裂问题
重启nn1,然后我们再切换namenode的active状态
# 切换
[root@wyl01 hadoop]# bin/hdfs haadmin -transitionToActive nn2
结论: 在手动模式下两个namenode都存在才能做到切换。