ZooKeeper实现HA HDFS

单节点NameNode存在问题:


 

  • NameNode宕机,metadata数据消失;
  • 单节点出现故障,如何进行故障转移?
  • 如果增加一个NameNode节点,会出现脑裂问题(一个集群有多个管理者),如何解决?

ZK搭建高可用(HA High Aliavble)HDFS集群


 

  • QJM(Quorum Jouranl Manager)是Hadoop转为为NameNode共享存储开发的组件。其集群运行一组Journal Node,每个Journal节点暴露一个简单的RPC接口,允许NameNode读取和写入数据,数据存放在Journal节点的本地磁盘。
  • 故障转移问题上,引入了监控NameNode状态的ZookeeperFailController(ZKFC)。ZKFC一般运行在NameNode宿主机器上,与Zookkeeper集群写作完成故障的自动转移。

Journal Node两大作用

  • 同步NameNode们的editlog
  • 当出现脑裂情况时,触发隔离机制,将其中一个NameNode节点kill掉(例如,NameNode1出现网络延迟,ZooKeeper认为它宕机了,ZKFC将NameNode2由standby转为active状态,此时,就有两个NameNode处于active状态,出现脑裂情况,Journal Node就会触发隔离机制,将剩余NameNode1的写入操作执行完毕之后,会通过SSH登录NameNode1节点将其进程关闭)

ZK集群

通常需要开辟三个独立端口

  • 1:处理client请求
  • 2:集群内部原子广播
  • 3:集群内部选举投票

ZK集群创建

1.安装zookeeper

2.在每个zk节点创建数据目录,每个数据目录中必须有myid文件,用来唯一标识zk节点

3.数据目录中创建zoo.cfg的配置文件

启动zk服务

1 ./zkServer.sh start /root/zkdata/zoo.cfg

查看集群状态

1 ./zkServer.sh status /root/zkdata/zoo.cfg

HA HDFS集群启动前提


 

在hdfs集群各个节点中的core-site.xml配置namenode,因为已经不是单namenode节点,所以要将hdfs入口稍作修改。以及添加zk监控hadoop的配置。

 1  <property>
 2                 <name>fs.defaultFS</name>
 3                 <value>hdfs://ns</value>
 4         </property>
 5          <property>
 6                 <name>hadoop.tmp.dir</name>
 7                 <value>/home/zqzhen/hadoop-2.9.2/data</value>
 8         </property>
 9         <property>
10                 <name>ha.zookeeper.quorum</name>
11                 <value>zk1:3001,zk2:3001</name>
12         </property>
View Code

在hdfs-site.xml中修改相应的namenode别名,启动journal,以及启动隔离机制等等配置。

 1 <property>
 2     <name>dfs.nameservices</name>
 3     <value>ns</value>
 4 </property>
 5 <property>
 6     <name>dfs.ha.namenodes.ns</name>
 7     <value>nn1,nn2</value>
 8 </property>
 9 <property>
10     <name>dfs.namenode.rpc-address.ns.nn1</name>
11     <value>hadoop120:9000</value>
12 </property>
13 <property>
14     <name>dfs.namenode.http-address.ns.nn1</name>
15     <value>hadoop120:50070</value>
16 </property>
17 <property>
18     <name>dfs.namenode.rpc-address.ns.nn2</name>
19     <value>hadoop121:9000</value>
20 </property>
21 <property>
22     <name>dfs.namenode.http-address.ns.nn2</name>
23     <value>hadoop121:50070</value>
24 </property>
25 <property>
26     <name>dfs.namenode.shared.edits.dir</name>
27     <value>qjournal://hadoop120:8485;hadoop121:8485;hadoop122:8485/ns</value>
28 </property>
29 <property>
30     <name>dfs.journalnode.edits.dir</name>
31     <value>/home/zqzhen/journal</value>
32 </property>
33 <property>
34     <name>dfs.ha.automatic-failover.enabled</name>
35     <value>true</value>
36 </property>
37 <property>
38     <name>dfs.client.failover.proxy.provider.ns</name>
39     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
40 </property>
41 <property>
42     <name>dfs.ha.fencing.methods</name>
43     <value>sshfence</value>
44 </property>
45 <property>
46     <name>dfs.ha.fencing.ssh.private-key-files</name>
47     <value>/root/.ssh/id_rsa</value>
48 </property>
View Code

启动集群步骤


 

首先要在namenode的任意节点启动zk集群

hdfs zkfc -formatZK

其次启动journalnode节点,必须要比namenode先启动,这样才能保证同步namenode的写入与读取操作

hadoop-daemon.sh start journalnode

接着在namenode active节点执行namenode的格式化,其中xx为之前在core-site.xml中为namenode们起的别名

hdfs namenode -format xx

然后启动hdfs集群

start-dfs。sh

在namenode standby节点执行预备格式化操作,否则该机器启动不了namenode

hdfs namenode -bootstrapStandby

 在namenodestandby机器上启动namenode

hadoop-daemon.sh start namenode

参考文章:https://www.cnblogs.com/jokerq/p/10032932.html

原文地址:https://www.cnblogs.com/zqzhen/p/12720441.html