您的位置:首页 > 运维架构

hadoop2.7.2学习笔记16-QJM和HA

2017-05-21 10:11 316 查看
HA提供namenode热备服务,保证集群的持续服务。

1、HA架构

集群拥有两个namenode,一个active,另一个standby。active负责处理客户端的操作,standby像slave一样运行。

standby和active通过一组独立的进程(JournalNodes,JNs)进行NameSpace的同步。同时,DataNode会同时配有两个namenode的地址,并周期性向它们发送blocks位置信息和心跳。这样standby就完全掌握有blocks的分布情况了。

为了避免同时出现多个namenode的情况,JNs只允许一个namenode进行写入。

2、硬件资源

运行NameNode的设备:运行active和standby的设备需要有相同的配置。

运行JournalNode的设备:JournalNode的进程是十分轻量级的,因此它们可以分布在部署有其他hadoop进程(如NameNode、JobTracker或YARN ResourceManager)的设备上。推荐部署三个及以上的JournalNode进程,因为系统所能承受的最大宕机数是(N-1)/2,其中N是JournalNode进程数。

3、部署

需要在hdfs-site.xml中配置的项:

dfs-nameservices,新的nameservice的名字。

dfs.ha.namenodes.[nameservice ID],每个namenode的唯一标识,用逗号做分割。

dfs-namenode-rpc-address-[nameservice ID].[name node ID],每个namenode需要进行rpc监听的地址。

dfs.namenode.http-address.[nameservice ID],[name node iD],每个namenode的http监听地址。

dfs.namenode.shared.edits.dir,指定JournalNodes的地址。

dfs.client.failover.proxy.provider.[nameservice ID],指定hdfs客户端和Active NameNode进行交互的java类。客户端利用该类判断那个namenode是Active NameNode。目前唯一的实现类是ConfiguredFailoverProxyProvider。

dfs.ha.fencing.methods,指定一些脚本或类,在切换备份的时候保护原来的Active NameNode,以避免出现多个Active NameNode的情况。

dfs.journalnode.edits.dir,指定JournalNode进程存放本地状态的路径。

需要在core-site.xml中配置的项:

fs.defaultFS,hadoop文件系统客户端使用的默认路径前缀。

部署细节:

完成上述配置以后,需要启动JournalNode进程。可以使用命令hadoop-daemon.sh start journalnode。

JournalNode进程启动后,它们中的其中一个需要同步Avtive的硬盘中的元数据到Standby。

如果你启动一个崭新的hdfs集群,那么你需要先在namenode执行format命令。

如果你已经format了namenode,或者你只是在一个使用过的集群部署HA,你需要在未格式化的那个namenode执行命令hdfs namenode -bootstrapStandby,这样Active的元数据目录就会被拷贝过来。该命令也会保证JournalNodes有足够的edits来启动namenodes。

如果正在将一个非HA集群部署为HA集群,还需要执行命令hdfs namenode -initializeSharedEdits,它将会用本地namenode的edits目录来初始化JournalNode。

管理命令:

管理命令的使用方法是:hdfs haadmin <command>。

transitionToActive和transitionToStandby,切换namenode的HA状态。这两个命令不使用任何namenode防护措施,应该少用。

failover,启动备份操作。将第一个参数指定的namenode切换为standby,第二个参数指定的namenode切换为active。该命令会对原先的namenode使用防护措施。

getServiceStats,返回参数指定的namenode的HA状态。

checkHealth,检查参数指定的namenode的健康状态。

4、自动切换备份

该模式要求部署有zookeeper集群和ZKFailoverController进程。

Apache Zookeeper是一个高可用的存储小规模协调性数据的提示客户端数据更新的且监控客户端异常的服务。HDFS自动备份依赖于Zookeeper的以下功能:

1、Failure detection,每个namenode在Zookeeper中都有一个独立的会话。如果机器宕机,那么会话将会终止,于是触发另一个namenode切换备份。

2、Active NameNode election,ZooKeeper提供一个简单的机制来选举的NameNode成为Active。

ZKFailoverController(ZKFC)是一个Zookeeper客户端,同时它也监控和管理NameNode的状态。每个运行NameNode的设备都需要运行ZKFC,因为它负责:

1、健康监控,它会周期性询问namenode的健康情况。

2、Zookeeper会话管理,当本地NameNode状态为健康的时候,ZKFS会在Zookeeper中保持一个会话。如果本地NameNode是Active,那么它还会保持一个特殊的"lock"的znode。这个lock是Zookeeper中的一个“浮游”节点,如果会话终止,那么lock节点将会自动删除。

3、基于Zookeeper的选举,如果本地NameNode状态为健康,且ZKFS发现没有其他节点保持了lock,那么它会尝试得到lock。如果尝试成功,那么认为它“赢得了选举”,它需要将本地NameNode的HA状态置为Active。这一过程即是自动切换备份过程。

配置:

在hdfs-site.xml中配置

dfs.ha.automatic-failover.enabled,指定是否启动自动切换备份。

在core-site.xml中配置

ha.zookeeper.quorum,指定Zookeeper集群服务。

操作:

1、在Zookeeper中进行初始化,在namenode执行命令 $HADOOP_PREFIX/bin/hdfs zkfc -formatZK。该命令在Zookeeper创建一个用于存储备份数据的znode。

2、启动集群,使用命令start-dfs.sh。这会在NameNode自动启动一个ZKFC进程,它们会选举一个NameNode作为Active。

3、如果选择手动启动集群,那么使用命令"$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc"在NameNode启动ZKFC。

4、如果集群是一个安全集群,则需要保证Zookeeper中的数据也是安全的。这样可以确保有恶意用户修改Zookeeper中的数据以触发备份切换操作。此时需要在core-site.xml中配置ha.zookeeper.auth和ha.zookeeper.acl。

5、在active产生错误以触发备份切换,验证是否部署成功。切换等待时间由ha.zookeeper.session-timeout.ms配置,默认值时5秒。

5、在HA模式下进行HDFS Upgrade/Finalization/Rollback

1、关闭NameNode,升级软件。

2、开启所有的JournalNodes,保证它们都成功启动。

3、使用“-upgrade”选项启动一个NameNode。

4、该NameNode将不会先进入standby模式,而是会直接成为active。

5、此时剩下的NameNode中的元数据将会和Active中的元数据产生差异。为了重启HA模式,需要重新启动该NameNode,并使用-bootstrapStandby选项。

6、执行finalize的命令是hdfs dfsadmin -finalizeUpgrade。

7、执行rollback时,需要关掉所有的NameNode。要在执行upgrade的那个NameNode执行rollback命令,它将会在本地目录、共享log和JNs中回退数据。接着需要启动这个NameNode。另一个NameNode启动时需要附加选项“-bootstrapStandby”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop HA