Hdfs的HA模式搭建验证

搭建准备(全分布式到HA模式)
节点规划
在这里插入图片描述
拓展:
journalNode与NFS(A机子与B机子相同目录挂载到C机子目录)

HA模式下:有一个问题,你的NN是2台?在某一时刻,谁是Active呢?
client是只能连接Active的,那么怎么配置呢?

core-site.xml
fs.defaultFs -> hdfs://node01:9000
改为下面的配置
hdfs://mycluster
用zk中的前缀(nameservice代替)

配置:
《core-site.xml》

	    <property>
		  <name>fs.defaultFS</name>
		  <value>hdfs://mycluster</value>
		</property>

		 <property>
		   <name>ha.zookeeper.quorum</name>
		   <value>node02:2181,node03:2181,node04:2181</value>
		 </property>

《hdfs-site.xml

		#以下是  一对多,逻辑到物理节点的映射
		<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>node01:8020</value>
		</property>
		<property>
		  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
		  <value>node02:8020</value>
		</property>
		<property>
		  <name>dfs.namenode.http-address.mycluster.nn1</name>
		  <value>node01:50070</value>
		</property>
		<property>
		  <name>dfs.namenode.http-address.mycluster.nn2</name>
		  <value>node02:50070</value>
		</property>

		#以下是JN在哪里启动,数据存那个磁盘,同时也把JN的作用在参数名称上体现了
		#(dfs.namenode.shared.edits.dir=>分享nn的edits的dir)
		<property>
		  <name>dfs.namenode.shared.edits.dir</name>
		  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
		</property>
		<property>
		  <name>dfs.journalnode.edits.dir</name>
		  <value>/var/bigdata/hadoop/ha/dfs/jn</value>
		</property>
		
		#HA角色切换的代理类和实现方法,我们用的ssh免密
		#因为ZKFC有三只手,要连zk、自己的nn、对面的nn
		#所以必须自己对自己免密,自己跟对面nn的机子免密
		<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>
		</property>
		<property>
		  <name>dfs.ha.fencing.ssh.private-key-files</name>
		  <value>/root/.ssh/id_dsa</value>
		</property>

##Hadoop中ssh免密的作用有如下两点:
1:管理集群间脚本调用
2:HA中zkfc调用本机,调用对面的nn

		#开启自动化: 启动zkfc
		 <property>
		   <name>dfs.ha.automatic-failover.enabled</name>
		   <value>true</value>
		 </property>

流程:

  • 基础设施

    • ssh免密:
      • 1)启动start-dfs.sh脚本的机器需要将公钥分发给别的节点
      • 2)在HA模式下,每一个NN身边会启动ZKFC,
        ZKFC会用免密的方式控制自己和其他NN节点的NN状态
  • 应用搭建

    • HA 依赖 ZK 搭建ZK集群
    • 修改hadoop的配置文件,并集群同步
  • 初始化启动(由HA 架构从里到外)

    • 1)先启动JN hadoop-daemon.sh start journalnode

    • 2)选择一个NN 做格式化:hdfs namenode -format <只有第一次搭建做,以后不用做>

    • 3)启动这个格式化的NN ,以备另外一台同步 hadoop-daemon.sh start namenode

    • 4)在另外一台机器中: hdfs namenode -bootstrapStandby

    • 5)格式化zk: hdfs zkfc -formatZK <只有第一次搭建做,以后不用做>

    • 6)start-dfs.sh

  • 使用


  • 使用验证:
    • 1)去看jn的日志和目录变化:
    • 2)node04
      • zkCli.sh
        • ls /
        • 启动之后可以看到锁:
        • get /hadoop-ha/mycluster/ActiveStandbyElectorLock
    • 3)杀死namenode 杀死zkfc
      • kill -9 xxx

      • a)杀死第一台active NN

        • 查看zk的hadoop-ha节点下的lock信息
          • 锁持有者变成了第二台
        • 查看webUI,发现主备变了
          • 第一台挂,第二台是主
        • 最后再启动第一台hadoop-daemon.sh start namenode
          • 发现第一台是备,第二台是主
      • b)杀死第二台active NN身边的zkfc

        • 查看zk的hadoop-ha节点下的lock信息
          • 锁持有者变成了第一台
        • 恢复第二台的zkfc hadoop.daemon.sh start zkfc
          • 第一台是主,第二台是备
      • c)shutdown activeNN 主机的网卡 : ifconfig eth0 down

        • 2节点一直阻塞降级(zk中的锁持有者的节点不一定是active,因为另外那个正常nn主机上的ZKFC要去被杀掉网卡的nn主机探查nn状态的,但是网卡被杀连接拒绝,所以另外那个正常nn主机上的ZKFC也就蒙了,一直在报错)

        • 如果恢复1上的网卡 ifconfig eth0 up

        • 最终 2变成active

猜你喜欢

转载自blog.csdn.net/qq_37865420/article/details/106367278