HDFS高可用性 手动故障转移和自动故障转移配置教程

本文适用范围,对于任何官方开源包安装的集群环境

要配置HA NameNode,你必须将多个配置选项添加到你的hdfs-site.xml配置文件。这里我先给出全部的配置项,然后接下来会逐步提及各配置项。

<configuration>
<property>
  <name>dfs.nameservices</name>
  <value>hadoop-test</value>
  <description>
    Comma-separated list of nameservices.
  </description>
</property>

<property>
  <name>dfs.ha.namenodes.hadoop-test</name>
  <value>nn1,nn2</value>
  <description>
    The prefix for a given nameservice, contains a comma-separated
    list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE).
  </description>
</property>

<property>
  <name>dfs.namenode.rpc-address.hadoop-test.nn1</name>
  <value>hadoop1:8020</value>
  <description>
    RPC address for nomenode1 of hadoop-test
  </description>
</property>

<property>
  <name>dfs.namenode.rpc-address.hadoop-test.nn2</name>
  <value>hadoop2:8020</value>
  <description>
    RPC address for nomenode2 of hadoop-test
  </description>
</property>

<property>
  <name>dfs.namenode.http-address.hadoop-test.nn1</name>
  <value>hadoop1:50070</value>
  <description>
    The address and the base port where the dfs namenode1 web ui will listen on.
  </description>
</property>

<property>
  <name>dfs.namenode.http-address.hadoop-test.nn2</name>
  <value>hadoop2:50070</value>
  <description>
    The address and the base port where the dfs namenode2 web ui will listen on.
  </description>
</property>

<!-- 在本地创建目录: /home/elon/hadoop/hdfs/name -->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:///home/elon/hadoop/hdfs/name</value>
  <description>Determines where on the local filesystem the DFS name node
      should store the name table(fsimage).  If this is a comma-delimited list
      of directories then the name table is replicated in all of the
      directories, for redundancy. </description>
</property>

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/hadoop-journal</value>
  <description>A directory on shared storage between the multiple namenodes
  in an HA cluster. This directory will be written by the active and read
  by the standby in order to keep the namespaces synchronized. This directory
  does not need to be listed in dfs.namenode.edits.dir above. It should be
  left empty in a non-HA cluster.
  </description>
</property>

<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:///home/elon/hadoop/hdfs/data</value>
  <description>Determines where on the local filesystem an DFS data node
  should store its blocks.  If this is a comma-delimited
  list of directories, then data will be stored in all named
  directories, typically on different devices.
  Directories that do not exist are ignored.
  </description>
</property>

<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>false</value>
  <description>
    Whether automatic failover is enabled. See the HDFS High
    Availability documentation for details on automatic HA
    configuration.
  </description>
</property>

<!-- 创建本地文件目录: /home/elon/hadoop/hdfs -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/home/elon/hadoop/hdfs/journal/</value>
</property>
<!-- end -->

<!-- 配置dfs.ha强制手动转换active namenode的fencing methods -->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>

<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/elon/.ssh/id_rsa</value>
</property>

<property>
  <name>dfs.ha.fencing.ssh.connect-timeout</name>
  <value>30000</value>
</property>
<!-- end -->

<!-- 配置集群的自动故障转移 Configuring automatic failover -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<property>
  <name>ha.zookeeper.quorum</name>
  <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!-- end -->
</configuration>
手动故障转移

其中手动切换配置无需配置上面的最后一个模块–[配置集群的自动故障转移 Configuring automatic failover],也无需配置Zookeeper集群环境。

下面给出官方文档中手动切换配置的 部署详情

在设置了所有必要的配置选项之后,你必须在它们将运行的机器集上启动JournalNode守护进程。这可以通过运行命令“ hadoop-daemon.sh start journalnode ”并等待守护进程在每台相关机器上启动来完成。

JournalNodes启动后,必须首先同步两个HA NameNodes的磁盘元数据。

如果你正在设置新的HDFS集群,则应首先在NameNode之一上运行format命令(hdfs namenode -format)。

如果你已经格式化了NameNode,或者将未启用HA的群集转换为启用HA,那么现在应该通过运行命令“ hdfs namenode -将你的NameNode元数据目录的内容复制到另一个未格式化的NameNode” bootstrapStandby “放在未格式化的NameNode上。运行此命令还将确保JournalNodes(由dfs.namenode.shared.edits.dir配置)包含足够的编辑事务,以便能够启动两个NameNode。

如果要将非HA NameNode转换为HA,则应运行命令“ hdfs namenode -initializeSharedEdits ”,该命令将使用来自本地NameNode编辑目录的编辑数据初始化JournalNodes。

此时,你可以像启动NameNode一样启动两个HA NameNode。

你可以通过浏览到其配置的HTTP地址来分别访问每个NameNode的网页。你应该注意到旁边配置的地址将是NameNode的的HA状态(或“待机”或“活动”。)每当HA的NameNode启动时,它最初处于待机状态。

上面是官方给出的部署详情下面我给出一般情况的部署步骤
① 通过运行命令“ sbin/hadoop-daemon.sh start journalnode ”并等待守护进程在每台相关机器上启动
② 删除原先自定义的namenode或者datanode的存储路径中的文件,因为这涉及到待会格式化集群环境时,被历史文件干扰导致datanode无法启动的故障(ps:对于一个全新刚安装的集群跳过此步骤)
③ 运行命令“ sbin/hdfs namenode -initializeSharedEdits ”,该命令将使用来自本地NameNode编辑目录的编辑数据初始化JournalNodes。格式化JournalNodes的namenode共享文件目录(ps:对于一个全新刚安装的集群跳过此步骤)
④ 在[nn1]上,运行命令“ bin/hdfs namenode -format ”,来格式化namenode文件目录
⑤ 在[nn1]上,运行命令“ sbin/hadoop-daemon.sh start namenode ”,来启动namenode
⑥ 在[nn2]上,通过运行命令“ hdfs namenode -bootstrapStandby ”将你[nn1]上的NameNode元数据目录的内容复制到另一个未格式化的NameNode上。
⑦ 此时,你可以像之前启动NameNode一样启动两个HA NameNode。

现在你的HA NameNode已配置并启动,你将可以访问一些其他命令来管理HA HDFS集群。具体来说,你应该熟悉“ hdfs haadmin ”命令的所有子命令。不带任何附加参数运行此命令将显示以下使用信息:

用法:haadmin
    [-transitionToActive <serviceId>]
    [-transitionToStandby <serviceId>]
    [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
    [-getServiceState <serviceId>]
    [-checkHealth <serviceId>]
    [-help <command>]

本指南介绍了每个子命令的高级用法。有关每个子命令的具体使用信息,应运行“ hdfs haadmin -help <命令 >”。

这里主要提及在active发生故障时,如何强制切换standby namenode,并将其置为active状态。其中transitionToActive和transitionToStandby - 将给定NameNode的状态转换为Active或Standby。
这些子命令会使给定的NameNode分别转换到活动或待机状态。这些命令不会尝试执行任何防护,因此应该很少使用。相反,人们应该总是喜欢使用“ hdfs haadmin -failover ”子命令。

下面重点说下 在两个NameNode之间启动故障转移 “ hdfs haadmin -failover ”的用法:

haadmin [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]

此子命令导致从第一个提供的NameNode到第二个的故障转移。如果第一个NameNode处于Standby状态,则此命令只是将第二个NameNode转换为Active状态而不会出错。如果第一个NameNode处于Active状态,则会尝试将其正常转换到Standby状态。如果失败,则会尝试按照顺序尝试防护方法(由dfs.ha.fencing.methods配置),直到成功为止。只有在这个过程之后,第二个NameNode才会转换到活动状态。如果没有防护方法成功,则第二个NameNode不会转换为活动状态,并且会返回错误。
其中我们需要在 hdfs-site.xml 中配置dfs.ha.fencing.methods,见文章开头的配置文件中的 [配置dfs.ha强制手动转换active namenode的fencing methods] 模块

自动故障转移

在典型的部署中,ZooKeeper守护进程被配置为在三个或五个节点上运行。由于ZooKeeper本身具有轻量资源需求,因此可以在与HDFS NameNode和Standby节点相同的硬件上配置ZooKeeper节点。许多运营商选择在与YARN ResourceManager相同的节点上部署第三个ZooKeeper进程。建议将ZooKeeper节点配置为将其数据存储在HDFS元数据的单独磁盘驱动器上,以获得最佳性能和隔离。假设你已经建立了一个运行在三个或更多节点上的ZooKeeper集群,并通过使用ZK CLI进行连接来验证其正确的操作。参考zookeeper官方文档中的搭建说明:
http://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

在开始配置自动故障转移之前,你应该关闭群集。当集群正在运行时,目前不可能从手动故障转移设置转换为自动故障转移设置。

配置自动故障转移,在手动故障转移配置的基础上添加少许的配置项,具体见文章开头的配置文件中的 [配置集群的自动故障转移 Configuring automatic failover] 模块

然后在ZooKeeper中初始化HA状态,你可以通过从其中一个NameNode主机运行以下命令来完成此操作。

bin/hdfs zkfc -formatZK

这将在自动故障转移系统存储其数据的ZooKeeper中创建一个znode。

接着用start-dfs.sh启动集群
由于配置中启用了自动故障转移功能,因此start-dfs.sh脚本将自动在任何运行NameNode的计算机上启动ZKFC守护程序。当ZKFC启动时,他们将自动选择其中一个NameNode变为活动状态。

如果你手动管理群集上的服务,则需要在运行NameNode的每台机器上手动启动zkfc守护进程。你可以运行以下命令来启动守护进程:

sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc
验证自动故障转移

一旦设置了自动故障转移,你应该测试其操作。为此,首先找到活动的NameNode。你可以通过访问NameNode Web界面来确定哪个节点处于活动状态 - 每个节点都会在页面顶部报告其HA状态。

找到活动的NameNode后,可能会在该节点上导致失败。例如,可以使用kill -9 的pid来模拟JVM崩溃。或者,你可以重新启动机器或拔下其网络接口以模拟其他类型的中断。触发你希望测试的中断后,另一个NameNode应在几秒钟内自动激活。检测故障并触发故障转移所需的时间取决于ha.zookeeper.session-timeout.ms的配置,但默认为5秒。

如果测试不成功,则可能是配置错误。检查zkfc守护进程以及NameNode守护进程的日志,以便进一步诊断问题。

自动故障转移常见问题
  • 我以任何特定顺序启动ZKFC和NameNode守护进程是否很重要?

不需要。在任何给定节点上,你可以在其相应的NameNode之前或之后启动ZKFC。

  • 我应该进行哪些额外的监测?

你应该在运行NameNode的每台主机上添加监视,以确保ZKFC保持运行。例如,在某些类型的ZooKeeper故障中,ZKFC可能意外退出,应该重新启动以确保系统已准备好进行自动故障转移。

此外,你应该监视ZooKeeper法定人数中的每个服务器。如果ZooKeeper崩溃,则自动故障转移将不起作用。

  • 如果ZooKeeper出现故障会发生什么?

如果ZooKeeper群集崩溃,则不会触发自动故障转移。但是,HDFS将继续运行,没有任何影响。当ZooKeeper重新启动时,HDFS将不会重新连接。

  • 我可以将我的NameNode中的一个指定为主/首选吗?

目前,这不支持。NameNode首先启动的任何一个都将变为活动状态。你可以选择以特定顺序启动群集,以便首选节点首先启动。

  • 如何在配置自动故障转移时启动手动故障转移?

即使配置了自动故障切换,也可以使用相同的hdfs haadmin命令启动手动故障切换。它将执行协调的故障转移。

参考:
[1] http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值