Ambari管理的Hadoop生产集群开启了HA,在运行期间,namenode1(nn1)为活跃(active)namenode,namenode2(nn2)为备用(standby)namenode。
nn1主机在运行期间宕机,nn2切换为active namenode,重启nn1主机,系统启动失败。
硬件检测正常,排除硬件问题。
最优的解决方案是修复操作系统,尝试多种方法,结果失败。
这时,集群故障已经持续将近两周。
接下来能想到的解决方案是重装操作系统,然后恢复主机上的原有服务和数据。
Hadoop集群的两个namenode是nn1和nn2,其中nn1主机宕机,集群只有nn2这个namenode。虽然集群运行状态正常,但是已经影响到业务。
从理论上来看,Hadoop的主备namenode,备用namenode除了提供高可用的功能外,还负责更新HDFS元数据,也就是secondarynamenode的功能,定期处理edits和fsimage。所以处于这种状况的Hadoop集群,功能是不完整的,但是可以坚持一段时间,这段时间就可以尽快恢复nn1服务。
这种情况下,需要重装nn1主机的操作系统,恢复ambari-agent服务,然后恢复nn1主机原有的服务,主要是Hadoop服务。
想到的恢复服务的方法有两个。
第一个是利用Ambari进行Hadoop的HA回滚。这种方法会根据正常运行的namenode(这里指nn2),重新生成一个namenode(这里指新的nn1),这个操作可能会用nn2的数据覆盖nn1的原有的数据。具体我这里没有研究。
第二个是在新系统上完整的复原服务。我是这么想的,现在的集群情况,可以认为nn1主机处于关机状态,只要开机启动服务,就可以让Hadoop自行恢复。现在是nn1主机的操作系统出问题,需要重装系统,之后所要做的事就是,在新系统上还原服务状态,使其最后相当于主机关机状态,然后开机启动服务。从理论上说,这个方法可以比较完整的恢复服务和状态。
我是按照第二个方法做的,这个是我自己的猜想,需要模拟故障环境进行验证。不过结果证明这个方法是可行的。下面讨论一下恢复过程。
目标是在新安装的操作系统上还原服务环境,然后恢复服务。
重要:如要参考此方案恢复类似问题,建议先在故障模拟环境中测试。
备份宕机主机上的服务的关键目录,关键目录如下表:
目录 | 说明 |
---|---|
/etc/ambari-agent | ambari-agent的配置目录 |
hdfs的dfs.namenode.name.dir配置指定的目录 | 在生产环境中,一般是一个单独的磁盘 |
hdfs的dfs.namenode.edits.dir配置指定目录 | 默认使用dfs.namenode.name.dir的参数 |
操作系统环境要和之前的操作系统环境保持一致,包括网络环境,主机名等。
注意IP和主机名一定要保持一致。
安装ambari-agent
yum install ambari-agent
复制以下目录到对应目录
/etc/ambari-agent
安装hdp-select
yum install hdp-select
安装Hadoop
需要安装对应的安装包,版本对应已安装的hdp版本号。
yum install hadoop_<version>-client \
hadoop_<version>-yarn \
hadoop_<version> \
hadoop_<version>-libhdfs \
hadoop_<version>-mapreduce \
hadoop_<version>-hdfs
如果Hadoop元数据存储在独立磁盘上,则直接挂载到配置目录并设置开机自动挂载。
如果Hadoop元数据存储在操作系统目录上,则将之前备份的数据直接放到对应目录。
从宕机的namenode节点上复制,也就是之前备份的数据。生产环境中,namenode元数据一般放在独立磁盘中。
注意目录的用户权限,可以参考另一台正常的namenode的信息。
从另一台正常的namenode主机上,将配置目录复制到新系统的对应目录。
复制之后,目录软链可能不对,需要手动设置。
启动ambari-agent
ambari-agent start
在Ambari Web上启动Hadoop服务,启动过程中可能遇到权限问题,需要根据提示修改目标的权限。顺利的话,服务应该可以恢复正常。
在整个恢复过程中,还算比较顺利,只在启动服务时遇到了用户权限问题。
在服务恢复后,在最初几天的观察中,整个集群没有异常。
希望本篇文章对遇到同样问题的朋友有用。