HDFS高可用HA集群

x33g5p2x  于2021-03-14 发布在 HDFS  
字(6.1k)|赞(0)|评价(0)|浏览(214)

一、前言

  • 在 Hadoop 1.X版本中,NameNode是整个HDFS集群的单点故障(single point of failure,SPOF):每一个HDFS集群只能有一个NameNode节点,一旦NameNode所在服务器宕机或者出现故障将导致整个集群都不可用,除非重启或者开启一个新的Namenode集群才能够恢复可用。
  • NameNode单点故障对HDFS集群的可用性产生影响主要表现在以下两种情况:
(1)当NameNode所在服务器发生未知的异常(例如:服务器宕机)时,在NameNode被重新启动之前整个集群都将不可用。
(2)当NameNode所在服务器执行某些日常维护任务(例如:软件或硬件升级)后重启服务器时,同样会导致HDFS集群在一段时间内不可用。

二、HDFS高可用简介

  • 在Hadoop 2.X 版本中,HDFS引入了双NameNode架构,HA(High Available)通过将两个NameNode分别配置为Active/Passive状态来解决上述问题。处于Active状态的NameNode叫作Active Namenode,处于Passive状态的NameNode叫作Standby Namenode。 Standby Namenode作为Active Namenode的热备份,能够在NameNode发生故障或者由于日常服务器维护需要重启的时候以一种优雅的方式自动切换为Active Namenode。
  • Active Namenode处理客户端所有的操作请求(读写),Standby Namenode只是作为Active Namenode的Slave尽可能地与Active Namenode保持状态同步,使得在Active Namenode故障时能够快速完成切换。为了使Standby Namenode与Active Namenode数据保持同步,两个Namenode都需要与一组Journal Node进行通信。当Active Namenode执行的任务对namespace有所更改时,会确保将修改日志持久到Journal Node节点中的大部分。
  • Standby Namenode持续监控这些Journal Node,当监测发现这些修改日志有变化时,就会将这些修改应用到自己的namespace,进而保持与Active Namenode中namespace元数据保持一致。当进行故障转移时,Standby Namenode在成为Active Namenode之前,会确保自己已经读取了Journal Node中的所有修改日志,从而保持数据状态与故障发生前一致。
  • 为了确保故障转移能够快速完成,Standby Namenode需要维护最新的Block位置信息,即每个Block副本存放在集群中的哪些节点上。为了达到这一点,Datanode同时配置主备两个Namenode,并同时发送Block报告和心跳到两台Namenode
  • 任何时候只有一个Namenode处于活动状态对HA集群来说至关重要,否则可能出现数据丢失或者数据损坏。当两台Namenode都认为自己的Active Namenode时,会同时尝试写入数据(不会再去检测和同步数据)导致所谓的“裂脑现象”出现。为了达到这个目的并避免出现“裂脑现象”,管理员必须为共享存储配置至少一个(fencing)方法。在宕机期间,如果确定了之前的Active Namenode已经放弃活动状态,fencing进程将负责中断之前的Active Namenode对共享存储的访问和编辑,从而防止它继续对命名空间做出任何进一步的修改,使新的活动节点能够安全地进行故障转移。

三、HA高可用集群搭建

[danger] 前提:在搭建HA高可用集群,请先确保Hadoop完全分布式环境已经搭建完毕

  • 若要启用HA还需要对hdfs-site.xml和core-site.xml两个文件进行一点额外的配置。
  • 在 HDFS-HA 集群中,使用 [nameservice ID] 来唯一识别一个 HDFS 实例,一个 HDFS-HA 集群可以含有多个(目前最多只支持两个)NameNode,集群同时又使用了 [name node ID] 来识别每一个NameNode。因此,在HDFS-HA 集群中,NameNode 的配置参数都以[nameservice ID].[name node ID]为后缀的。由于dfs.nameservices和dfs.ha.namenodes.[nameservice ID]两个配置项的值将决定后面一些配置项的名称,所以建议先配置这两个选项的值。
配置项:[nameservice ID]=lingnan,两个[name node ID]分别为nn1和nn2,名称可以随意取,只需要保持前后一致即可。

[info] (1)在bigdata1服务器操作:保持 hdfs-site.xml 原有的配置不变,再增加如下HA相关配置:

#配置文件目录:/data/module/hadoop-2.7.3/etc/hadoop

<property>
   <name>dfs.nameservices</name>
   <value>lingnan</value>
   <description>指定nameservice ID的名称</description>
</property>
<property>
   <name>dfs.ha.namenodes.lingnan</name>
   <value>nn1,nn2</value>
   <description>指定各个NameNode在nameservice中的唯一标识符</description>
</property>
<property>
   <name>dfs.namenode.rpc-address.lingnan.nn1</name>
   <value>bigdata1:8020</value>
   <description>指定nn1 NameNode所监听的全限定RPC地址</description>
</property>
<property> 
   <name>dfs.namenode.rpc-address.lingnan.nn2</name>
   <value>bigdata2:8020</value>
   <description>指定nn2 NameNode所监听的全限定RPC地址</description>
</property>
<property>
   <name>dfs.namenode.http-address.lingnan.nn1</name>
   <value>bigdata1:50070</value>
   <description>指定nn1 NameNode所监听的全限定HTTP地址</description>
</property>
<property>
   <name>dfs.namenode.http-address.lingnan.nn2</name>
   <value>bigdata2:50070</value>
   <description>指定nn2 NameNode所监听的全限定HTTP地址</description>
</property>
<property>
   <name>dfs.namenode.shared.edits.dir</name>
   <value>qjournal://bigdata1:8485;bigdata2:8485;bigdata3:8485/lingnan</value>
   <description>指定让NameNodes用来读写edits的Journal Nodes的RUI</description>
</property>
<property>
   <name>dfs.client.failover.proxy.provider.lingnan</name>
   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
   <description>指定HDFS客户端联系Active NameNode所使用的Java类</description>
</property>
<property>
   <name>dfs.ha.fencing.methods</name>
   <value>sshfence</value>
   <description>故障转移时使用SSH登录Active NameNode并将其进程杀掉</description>
</property>
<property>
   <name>dfs.ha.fencing.ssh.private-key-files</name>
   <value>/root/.ssh/id_rsa</value>
   <description>故障转移时SSH登录Active NameNode所使用的私钥文件路径</description>
</property>
<property>
   <name>dfs.ha.fencing.ssh.connect-timeout</name>
   <value>30000</value>
   <description>故障转移时SSH登录的超时毫秒数</description>
</property>
<property>
   <name>dfs.journalnode.edits.dir</name>
   <value>/root/journaldata</value>
   <description>指定edits在JournalNode 上存储的绝对路径</description>
</property>

[info] (2)在bigdata1服务器操作:保持 core-site.xml 其他的配置不变,仅将其中的 fs.defaultFS 配置修改一下:

#配置文件目录:/data/module/hadoop-2.7.3/etc/hadoop
<property>
   <name>fs.defaultFS</name>
   <value>hdfs://bigdata1:9000</value>
</property>
   
#配置信息修改为以下   
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://lingnan</value>
</property>

[info] (3)拷贝bigdata1服务器的 hdfs-site.xml 和 core-site.xml 到bigdata2和bigdata3

# 1.进入配置文件目录
cd /data/module/hadoop-2.7.3/etc/hadoop

# 2.拷贝到 bigdata2
scp hdfs-site.xml 192.168.46.112:/data/module/hadoop-2.7.3/etc/hadoop
scp core-site.xml 192.168.46.112:/data/module/hadoop-2.7.3/etc/hadoop

# 3.拷贝到 bigdata3
scp hdfs-site.xml 192.168.46.113:/data/module/hadoop-2.7.3/etc/hadoop
scp core-site.xml 192.168.46.113:/data/module/hadoop-2.7.3/etc/hadoop

[info] (4)同步NameNodes

在完成了上述的配置之后,你需要按照以下流程操作来实现NameNodes之间的数据同步:

(1)三台主机分别启动:JournalNodes
(2)初始化同步NameNodes
(3)启动两个NameNode

[success] (1)在三台主机分别启动 JournalNode 进程(hdfs配置文件指定了三台)

#启动 JournalNode 进程命令
hadoop-daemon.sh start journalnode

#查看是否启动成功
jps

[success] (2)初始化同步NameNodes(同步之前先开启 journalnode)

# 1.分别登陆三台机器,清空/data/module/hadoop-2.7.3/data的内容
 cd /data/module/hadoop-2.7.3/data
 rm -rf ./*
 
# 2.格式化bigdata1的NameNode
 hdfs namenode -format
 
# 2.在bigdata1启动Namenode
hadoop-daemon.sh start namenode

# 3.在未格式化的bigdata2同步bigdata1的元数据
hdfs namenode -bootstrapStandby

[success] (3)启动bigdata1和bigdata2的两个NameNode

# 1.bigdata1之前已经启动,现在只需要启动bigdata2的NameNode
hadoop-daemon.sh start namenode

[info] (5)设置HA NameNode的Active状态

# 按照上述配置启动的HA NameNode 都是Standby状态,需要使用 hdfs haadmin 管理命令将其中的一个切换为Active状态
hdfs haadmin -transitionToActive nn1

[info] (6)查看NameNode的状态(使用web或者命令行查看)

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

相关文章

热门文章

更多