目的
总结HDFS-HA实施步骤及细节(概述HDFS高可用性(HA)功能以及如何使用Quorum Journal Manager(QJM)功能配置和管理HA HDFS群集)
背景
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集只有一个NameNode,并且如果该计算机或进程不可用,则整个群集将不可用,直到NameNode重新启动或在单独的计算机上启动。
这从两个方面影响了HDFS群集的总可用性:
如果发生意外事件(例如机器崩溃),则在操作员重新启动NameNode之前,群集将不可用。
计划内的维护事件,例如NameNode计算机上的软件或硬件升级,将导致群集停机时间的延长。
HDFS高可用性功能通过提供以下选项来解决上述问题:在具有热备用功能的主动/被动配置中,可以在同一群集中运行两个(自3.0.0起,超过两个)冗余NameNode。这可以在计算机崩溃的情况下快速故障转移到新的NameNode,或出于计划维护的目的由管理员发起的正常故障转移。
在典型的HA群集中,将两个或更多单独的计算机配置为NameNode。在任何时间点,一个NameNode都恰好处于Active状态,其他NameNode 处于Standby状态。Active NameNode负责群集中的所有客户端操作,而Standby则仅充当工作程序,并保持足够的状态以在必要时提供快速故障转移。
硬件资源
- 虚拟Linux服务器:机器1(192.168.40.112),机器2号(192.168.40.113),机器3(192.168.40.114)
- 操作系统:CentOs 6.x
- CPU:8核
- 内存:8G以上
部署
1.前提
1.1 机器1,2,3 实现免密钥登录(彼此可互相登录)
(参考:https://blog.csdn.net/ReyzeLamp/article/details/102978351)
1.2 机器1,2,3 的hosts文件配置彼此的域名映射
192.168.40.112 bigdata-trianing01.com
192.168.40.113 bigdata-trianing02.com
192.168.40.114 bigdata-trianing03.com1.3 Hadoop-2.5.0 (测试)及zookeeper-3.4.5分布式环境已安装(其中一些配置在后面提及)
1.4 集群规划
机器1:namendoe(active),datanode,journalnode
机器2:namenode(standby),datanode,journalnode
机器3:datanode,journalnode
2.部署细节
路径:在bigdata-trianing01.com.zookeeper家目录(/opt/modules/zookeeper-3.4.5)下
2.1 在Zookeeper中的zoo.cfg添加,路径(/opt/modules/zookeeper-3.4.5/conf),参数如下:
dataDir=/opt/modules/zookeeper-3.4.5/datas(新建该文件)
在文件末尾添加
server.1=bigdata-trianing01.com:2888:3888
server.2=bigdata-trianing02.com:2888:3888
server.3=bigdata-trianing03.com:2888:3888
2.2 新建/opt/modules/zookeeper-3.4.5/datas/myid
在机器1,2,3中 ,/opt/modules/zookeeper-3.4.5/datas/路径新建myid,
机器1中,myid内容:1
机器2中,myid内容:2
机器3中,myid内容:3
路径:在bigdata-trianing01.com.hadoop家目录(/opt/modules/hadoop-2.5.0_ha)下
2.3 清空datas、logs目录
rm -rf datas/*; rm -rf logs/*;
2.4 修改hdfs-site.xml,参数如下:
<!-- HA OPTION -->
<!--配置namenode对外统一的逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property><!--配置namenode rpc 内部通信端口-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>bigdata-trianing01.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>bigdata-trianing02.com:8020</value>
</property><!--配置namenode http网页地址服务端口-->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>bigdata-trianing01.com:50070</value>
</property><property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>bigdata-trianing02.com:50070</value>
</property><!--配置元数据日志文件及存储方式为journalnode-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata-trianing01.com:8485;bigdata-trianing02.com:8485;bigdata-trianing03.com:8485/ns1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0_ha/journal-node</value>
</property><!--配置standby 切换 到active-->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置自动故障转移--><property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property><!--配置隔离机制类型和对应的配置-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property><name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/Leizedeng/.ssh/id_rsa</value>
</property>
<!--通用配置 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
2.5 修改core-site.xml,参数如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata-trianing01.com:2181,bigdata-trianing02.com:2181,bigdata-trianing03.com:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0_ha/datas</value>
</property>
</configuration>
2.6 修改slaves文件,一行一个,配置如下:
bigdata-trianing01.com
bigdata-trianing02.com
bigdata-trianing03.com
2.7 集群分发(机器1,2,3文件安装路径要保持一致)
scp -r /opt/modules/hadoop-2.5.0_ha/ 192.168.40.113:/opt/modules/
scp -r /opt/modules/hadoop-2.5.0_ha/ 192.168.40.114:/opt/modules/
2.8 启动
2.8.0 启动机器1,2,3 的zookeeper,journalnode(如需再次格式化,建议清空日志文件logs和datas下的文件)
/opt/modules/zookeeper-3.4.5/bin/zkServer.sh start
/opt/modules/hadoop-2.5.0_ha/sbin/hadoop-daemon.sh start journalnode
2.8.1 格式化namenode(在机器1,2中,谁格式化,它的状态将预估为active)
因集群规划,在机器1上格式化
bin/hdfs namenode -format
2.8.2 在机器1上启动namenode
sbin/hadoop-daemon.sh start namenode
2.8.3 将机器1格式化后的数据同步到机器2中,在机器2上
bin/hdfs namenode -bootstrapsstandby
2.8.4 格式化zookeeper之间的连接zookeeperFailoverController(zkfc),在机器1上
bin/hdfs -zkfc -formatZK
2.8.5 启动机器1,2,3的namenode和datanode
sbin/hadoop-daemon.sh start datanode
此时http://192.168.40.112:50070、http://192.168.40.113:50070该2个namenode状态都为standby
2.8.6 启动ZKFC(在机器1,2中,谁先启动,谁的状态即转换为active)
因集群规划,在机器1上,启动zkfc
sbin/hadoop-daemon.sh start zkfc
此时http://192.168.40.112:50070 的namenode状态 为active
2.9 测试
2.9.1 关闭机器1 namenode的进程
kill -9 PID
此时http://192.168.40.112:50070 无法访问
而http://192.168.40.113:50070的namenode状态自动切换为active
到此部署完毕!
经验之谈:不论大家在部署过程中,是否参照以上配置操作,可能会遇到以下一些问题:
1. 当部署完毕后,开启进程后,发现2个namenode 状态都为standby。
解决:检查配置slaves、hdfs-site、core-site及zookeeper配置,如果有误, 修改完,
清空datas和logs文件,重走 2.8步骤。
2. 当部署完毕后,测试发现,关闭状态为active的namenode1,另一个namenode2状态为standby并未切换为active。
解决:检查namenode的 zkfc及namenode 的日志文件,找到问题后,
再次清空datas和logs文件,重走2.8步骤。
末尾简述:
客户端通过在hdfs-site配置namenode的逻辑服务名称知道新active的namenode的地址,
所有的datanode通过zookeeper来获取新的namenode地址;
而的新的namendoe所在机器通过journalnode来获取元数据!