hdfs 原有架构
hdfs ha 通常由两个NameNode 组成,一个是active状态,一个是standby(备份)状态,active状态的nameNode 对外提供服,比如处理来自客户端的rpc请求,standby则不提供服务,只同步数据状态.
clent ->访问 nameservice(存储nameNode状态) --》通过zookeeper(自动故障转移)--> 活动的(actice)nameNode 调用dataNode
架构图如下:
JournalNodde 机器运行JournalNodes 机器,Journalnode 相当轻量,可以和hadoop的其它进程部署在一起,比如NameNode,DataNode,ResourceManager等,至少需要3个且为奇数,它允许(N-1)/2个JNS进程失效并且不影响工作。
hdfs-site.xml 重要配置
根据上述文档地址,进行安装配置:
1.修改hdfs-site.xml
<!-- 指定hdfs的namerservice 名称-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--- 制定上述nameservice 对应的两个namenode名称 nn1 ,nn2-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置nn1,nn2对应的rpc通信端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
<!-- 配置nn1,nn2 访问的web端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:50070</value>
</property>
<!---- namenode 元数据存储在journalnode中的路径 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
<!-- 配置失败,自动切换的方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<!-- 配置密钥位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/exampleuser/.ssh/id_rsa</value>
</property>
<!-- 数据备份个数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限验证 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!---- 开启失败故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置zookeeper 地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
隔离机制,除了ssh 还有shell等配置,一般采用ssh
<!-- 端口 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<--- shell -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>
2.修改core-site.xml
<!-- 配置nameservice 名称 必须与hdfs-site.xml中的一致 -- >
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 编辑日志文件存储的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<!-- 配置hadoo 缓存文件目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/sw/hadoop/data/tmp</value>
</property>
中间启动测试journalnode:
这两项配置去掉
<!---- 开启失败故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置zookeeper 地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
1.在每一台机器上启动journalnode:hadoop-daemon.sh start journalnode
2.在namenode节点机器启动namenode :hadoop-daemon.sh start namenode ,并执行格式化: hdfs namenode -format
3.在其它机器进行同步:hdfs namenode -bootstrapStandby (--help ) 出现以下则成功:
About to bootstrap Standby ID nn2 from:
Nameservice ID: mycluster
Other Namenode ID: nn1
Other NN's HTTP address: http://sw1:50070
Other NN's IPC address: sw1/192.168.56.103:8020
Namespace ID: 1397706359
Block pool ID: BP-199940621-192.168.56.103-1525943430914
Cluster ID: CID-c3a672de-5fb9-43b8-910f-0a42de357215
Layout version: -63
isUpgradeFinalized: true
4.启动datanode ,三台机器全部启动
页面访问namenode所在机器 ip:port ,两个节点都是standby
测试:手动启动一个为active ,,,,hdfs 有个haadmin命令:
Usage: haadmin
[-transitionToActive [--forceactive] <serviceId>] 转为actice 状态
[-transitionToStandby <serviceId>] 转为standby 状态 下面的不常用
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>] 查看集群状态
[-checkHealth <serviceId>]
[-help <command>]
启动命令:
1.启动zookeeper ./zkServer.sh start (有多少台机器就启动多少,也可以写安全脚本,一次启动)
2.启动nameNode sbin/hadoop-daemon.sh start namenode (启动次数同上)
3.格式化ZKFC bin/hdfs zkfc -formatZK(zk目录下会多出hadoop的信息)
4.停止hdfs集群 sbin/stop-dfs.sh
5.启动hadoop集群 sbin/start-dfs.sh
测试,kill掉actiive节点 发现standby 节点没有自动转为active
解决问题:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<!-- 新增该value 但是却不清楚为什么,因为上面配置了ssh的-->
<value>shell(true)</value>
</property>