Hadoop NameNode 高可用 (High Availability) 实现解析[转] (9)

对 JouranlNode 集群的共享存储目录进行格式化,并且将原有的 NameNode 本地磁盘上最近一次 checkpoint 操作生成 FSImage 文件 (具体可参照“NameNode 的元数据存储概述”一节的叙述) 之后的 EditLog 拷贝到 JournalNode 集群上的共享目录之中,这通过在原有的 NameNode 上执行命令 hdfs namenode -initializeSharedEdits 来完成。

启动原有的 NameNode 节点,这通过脚本命令 hadoop-daemon.sh start namenode 完成。

对新增的 NameNode 节点进行初始化,将原有的 NameNode 本地磁盘上最近一次 checkpoint 操作生成 FSImage 文件拷贝到这个新增的 NameNode 的本地磁盘上,同时需要验证 JournalNode 集群的共享存储目录上已经具有了这个 FSImage 文件之后的 EditLog(已经在第 3 步完成了)。这一步通过在新增的 NameNode 上执行命令 hdfs namenode -bootstrapStandby 来完成。

启动新增的 NameNode 节点,这通过脚本命令 hadoop-daemon.sh start namenode 完成。

在这两个 NameNode 上启动 zkfc(ZKFailoverController) 进程,谁通过 Zookeeper 选主成功,谁就是主 NameNode,另一个为备 NameNode。这通过脚本命令 hadoop-daemon.sh start zkfc 完成。

日常维护

笔者在日常的维护之中主要遇到过下面两种问题:

Zookeeper 过于敏感:Hadoop 的配置项中 Zookeeper 的 session timeout 的配置参数 ha.zookeeper.session-timeout.ms 的默认值为 5000,也就是 5s,这个值比较小,会导致 Zookeeper 比较敏感,可以把这个值尽量设置得大一些,避免因为网络抖动等原因引起 NameNode 进行无谓的主备切换。

单台 JouranlNode 故障时会导致主备无法切换:在理论上,如果有 3 台或者更多的 JournalNode,那么挂掉一台 JouranlNode 应该仍然可以进行正常的主备切换。但是笔者在某次 NameNode 重启的时候,正好赶上一台 JournalNode 挂掉宕机了,这个时候虽然某一台 NameNode 通过 Zookeeper 选主成功,但是这台被选为主的 NameNode 无法成功地从 Standby 状态切换为 Active 状态。事后追查原因发现,被选为主的 NameNode 卡在退出 Standby 状态的最后一步,这个时候它需要等待到 JournalNode 的请求全部完成之后才能退出。但是由于有一台 JouranlNode 宕机,到这台 JournalNode 的请求都积压在一起并且在不断地进行重试,同时在 Hadoop 的配置项中重试次数的默认值非常大,所以就会导致被选为主的 NameNode 无法及时退出 Standby 状态。这个问题主要是 Hadoop 内部的 RPC 通信框架的设计缺陷引起的,Hadoop HA 的源代码 IPCLoggerChannel 类中有关于这个问题的 TODO,但是截止到社区发布的 2.7.1 版本这个问题仍然存在。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjgsg.html