HA高可用手动故障转移

版权声明:Please make the source marked https://blog.csdn.net/qq_31807385/article/details/84584461

目录

HA相关概念:

同步问题:

脑裂问题:

手动故障转移:

为什么要先启动journalnode?


HA相关概念:

1)所谓HA(high available),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障(single point of failureSPOF)。

3)单点故障是一个组件发生故障,就会导致整个系统无法运行。

4)HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA

5)NameNode主要在以下两个方面影响HDFS集群

扫描二维码关注公众号,回复: 4339801 查看本文章

      ① NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

      ② NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

概述:

HDFS的namenode,如果只有一台的话,升级的时候和nodenode 宕机的时候都无法提供正常的服务。 所有应该有两个namenode,如果有两个namenode,一个服役,一个备用,但是如果有两个namenode的话,就会涉及到两个问题:

1,两个namenode的数据同步问题

2,脑裂的问题

3,是否需要2nn   ——> 不需要

同步问题:

如果两者要实现高可用的话,两 个namenode一个active,一个standby ,standby需要有active中的元数据,否则在active宕机的时候无法完成替换的效果。 所以两台namenode面临的第一个问题就是数据的一致性问题 即元数据的同步,active定时给standby拷数据,假设active宕机,standby中的数据是不全的。

解决方案是:弄一个第三方,这个第三方记录active 的edits文件,active的fsimage文件不能写入这个第三方,因为这会导致大量的io,但是standby需要active的fsimage文件,解决的办法是,namenode在第一次格式化之后,同步到standby。 active向第三方进行写操作,standby对这个第三方读 如此一来,我们实现了数据的同步,所以,standby和active的唯一区别是edit_process文件的有无。

脑裂问题:

假设namenode active宕机,此时standby 变成 active,但是这个时候namenode是假死,这时候就会出现两个namenode active, 防止脑裂的方法:在切换之前,两者配置ssh,在standby切换的时候,首先登录active 之后,不管死没死,直接杀死,这样一来,standby就能进行切换了。

下图是帮助理解的图片:

手动故障转移:

首先需要一个hadoop集群:如果没有请参见下面这篇文章:

十分钟搭建hadoop集群手册

集群的规划:

 

hadoop101

hadoop102

hadoop103

HDFS

 

NameNode

DataNode

JournalNode

NameNode

DataNode

JournalNode

 

DataNode

JournalNode

YARN

 

NodeManager

ResourceManager

NodeManager

 

NodeManager

手动配置的故障转移,仅仅配置HDFS的高可用。下面开始配置:

首先在/opt/module/下有hadoop
[isea@hadoop101 hadoop-2.7.2]$ pwd
/opt/module/hadoop-2.7.2

1,在module目录下创建HA文件夹,并将hadoop拷贝到该目录下:(这是比较耗时的)
[isea@hadoop101 module]$ mkdir HA
[isea@hadoop101 module]$ ll
总用量 12
drwxrwxr-x.  2 isea isea 4096 11月 28 15:04 HA
drwxr-xr-x. 11 isea isea 4096 11月 28 15:03 hadoop-2.7.2
drwxr-xr-x.  8 isea isea 4096 7月  22 2017 jdk1.8.0_144
[isea@hadoop101 module]$ cp -r hadoop-2.7.2/ HA/
[isea@hadoop101 module]$ ll HA/
总用量 4
drwxr-xr-x. 11 isea isea 4096 11月 28 15:05 hadoop-2.7.2

2,配置core-site-xml如下:
[isea@hadoop101 hadoop]$ vim core-site.xml 
<configuration>
<!-- 把两个NameNode的地址组装成一个集群mycluster -->
	<property>
		<name>fs.defaultFS</name>
        	<value>hdfs://mycluster</value>
	</property>

	<!-- 声明journalnode服务本地文件系统存储目录-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/module/HA/hadoop-2.7.2/data/jn</value>
	</property>

	<!-- 指定hadoop运行时产生文件的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
	</property>
</configuration>

3,配置hdfs-site.xml如下 :
[isea@hadoop101 hadoop]$ vim hdfs-site.xml 
<configuration>
	<!-- 完全分布式集群名称 -->
	<property>
		<name>dfs.nameservices</name>
		<value>mycluster</value>
	</property>

	<!-- 该nameservice下NameNode节点都有哪些 -->
	<property>
		<name>dfs.ha.namenodes.mycluster</name>
		<value>nn1,nn2</value>
	</property>

	<!-- nn1的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
		<value>hadoop101:8020</value>
	</property>

	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
		<value>hadoop102:8020</value>
	</property>

	<!-- nn1的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.mycluster.nn1</name>
		<value>hadoop101:50070</value>
	</property>

	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.mycluster.nn2</name>
		<value>hadoop102:50070</value>
	</property>

	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>
	</property>

	<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>

	<!-- 使用隔离机制时需要ssh无秘钥登录-->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/isea/.ssh/id_rsa</value>
	</property>

	<!-- 关闭权限检查-->
	<property>
		<name>dfs.permissions.enable</name>
		<value>false</value>
	</property>

	<!-- 客户端访问代理类:客户端通过该类判断哪个namenode是active -->
	<property>
  		<name>dfs.client.failover.proxy.provider.mycluster</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
</configuration>

4,将该节点上的data 和 log目录删掉
[isea@hadoop101 hadoop-2.7.2]$ rm -rf data/ logs/
[isea@hadoop101 hadoop-2.7.2]$ ll
总用量 52
drwxr-xr-x. 2 isea isea  4096 11月 28 15:05 bin
drwxr-xr-x. 3 isea isea  4096 11月 28 15:05 etc
drwxr-xr-x. 2 isea isea  4096 11月 28 15:05 include
drwxr-xr-x. 3 isea isea  4096 11月 28 15:05 lib
drwxr-xr-x. 2 isea isea  4096 11月 28 15:05 libexec
-rw-r--r--. 1 isea isea 15429 11月 28 15:05 LICENSE.txt
-rw-r--r--. 1 isea isea   101 11月 28 15:05 NOTICE.txt
-rw-r--r--. 1 isea isea  1366 11月 28 15:05 README.txt
drwxr-xr-x. 2 isea isea  4096 11月 28 15:05 sbin
drwxr-xr-x. 4 isea isea  4096 11月 28 15:05 share

5,将配置好的hadoop环境同步到其他两台机器,并检查是否同步成功,
[isea@hadoop101 module]$ pwd
/opt/module
[isea@hadoop101 module]$ xsync HA/
[isea@hadoop103 hadoop]$ cat core-site.xml 


<configuration>
<!-- 把两个NameNode的地址组装成一个集群mycluster -->
	<property>
		<name>fs.defaultFS</name>
        	<value>hdfs://mycluster</value>
	</property>

	<!-- 声明journalnode服务本地文件系统存储目录-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/module/HA/hadoop-2.7.2/data/jn</value>
	</property>

	<!-- 指定hadoop运行时产生文件的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
	</property>
</configuration>

[isea@hadoop103 hadoop]$ pwd
/opt/module/HA/hadoop-2.7.2/etc/hadoop

6,在各个节点上分别启动journalnode并检查是否启动成功
[isea@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-journalnode-hadoop101.out
[isea@hadoop101 hadoop-2.7.2]$ jps
3093 Jps
3034 JournalNode

这个时候会产生一个data的目录:该目录下面的内容如下:
[isea@hadoop102 current]$ pwd
/opt/module/HA/hadoop-2.7.2/data/jn/mycluster/current
[isea@hadoop102 current]$ cat VERSION 
#Wed Nov 28 16:07:40 CST 2018
namespaceID=1181189542
clusterID=CID-788d94f4-f259-4640-96fe-bcd09bdb22f0
cTime=0
storageType=JOURNAL_NODE
layoutVersion=-63



7,在nn1上,对其进行格式化,并启动
[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format
[isea@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-namenode-hadoop101.out
[isea@hadoop101 hadoop-2.7.2]$ jps
3034 JournalNode
3196 NameNode
3278 Jps

这个时候在data目录下还会产生一个文件夹:
[isea@hadoop101 current]$ pwd
/opt/module/HA/hadoop-2.7.2/data/tmp/dfs/name/current
[isea@hadoop101 current]$ cat VERSION 
#Wed Nov 28 15:28:43 CST 2018
namespaceID=1181189542
clusterID=CID-788d94f4-f259-4640-96fe-bcd09bdb22f0
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1988026705-192.168.1.101-1543390123611
layoutVersion=-63

格式化会产生fsimage文件:
[isea@hadoop101 current]$ ll
总用量 16
-rw-rw-r--. 1 isea isea 351 11月 28 15:28 fsimage_0000000000000000000
-rw-rw-r--. 1 isea isea  62 11月 28 15:28 fsimage_0000000000000000000.md5
-rw-rw-r--. 1 isea isea   2 11月 28 15:28 seen_txid
-rw-rw-r--. 1 isea isea 206 11月 28 15:28 VERSION



8,在nn2上同步nn1的数据,检查一下是否同步过来,并启动nn2
[isea@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby
[isea@hadoop102 hadoop-2.7.2]$ ll data/
总用量 8
drwxrwxr-x. 3 isea isea 4096 11月 28 16:07 jn
drwxrwxr-x. 3 isea isea 4096 11月 28 16:20 tmp
[isea@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start  namenode 
starting namenode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-namenode-hadoop102.out
[isea@hadoop102 hadoop-2.7.2]$ jps
2884 NameNode
2677 JournalNode
2967 Jps

此时,可以在web端检查nn1 和 nn2 都是standby 状态

9,在nn1上启动所有的datanode,
[isea@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode
hadoop102: starting datanode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-datanode-hadoop102.out
hadoop101: starting datanode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-datanode-hadoop101.out
hadoop103: starting datanode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-datanode-hadoop103.out
[isea@hadoop101 hadoop-2.7.2]$ jps
3570 DataNode
3635 Jps
3034 JournalNode
3196 NameNode

10,切换nn1 为active状态
[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1
standby
[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1
[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1
active


配置完成

以上就完成了手动故障转移的配置,这样我们的集群中就存在着两个namenode,一个是standby ,一个是active ,可以在客户端查看:

http://hadoop102:50070/dfshealth.html#tab-overview    standby

http://hadoop101:50070/dfshealth.html#tab-overview    active

如果,nn1 宕机了,我们只需要一条指令,当前的集群即可恢复工作:

1,将nn1的namenode杀死,然后将nn2 的namenode转换为active

[isea@hadoop101 hadoop-2.7.2]$ kill -9 3196
[isea@hadoop101 hadoop-2.7.2]$ jps
3570 DataNode
3909 Jps
3034 JournalNode

[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -failover nn1 nn2
**
**
Failover from nn1 to nn2 successful

[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn2
active

2,现在在把nn1启动起来,查看nn1
[isea@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/HA/hadoop-2.7.2/logs/hadoop-isea-namenode-hadoop101.out
[isea@hadoop101 hadoop-2.7.2]$ jps
3570 DataNode
4085 NameNode
3034 JournalNode
4191 Jps
[isea@hadoop101 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1
standby

为什么要先启动journalnode?

namenode的数据信息会被记录到qjournal集群中去,包括格式化的信息,所以要先启动journalnode。

猜你喜欢

转载自blog.csdn.net/qq_31807385/article/details/84584461