发布网友 发布时间:2022-11-28 04:50
共1个回答
热心网友 时间:2023-05-29 22:33
【起因】22:31:04分被通知集群异常,无法正常处理调度任务;远程登录查看,发现HDFS NameNode发生脑裂;
NameNode节点:name21.hadoop,name22.hadoop
hadoop版本:2.7.1
【事故报告】
1. 【时间】=> 22:31:04
【HA状态】=> name21.hadoop:Active, name22.hadoop:Standyby
【日志信息】=> name21.hadoop:/var/log/hadoop/hdfs/gc.log-xxxxxxxxxx
此时,Active NameNode触发一次异常JVM GC(正常情况下GC耗时在2s以下),此次耗时32.46s;
2.【时间】=> 22:31:37
【HA状态】=> name21.hadoop:Active, name22.hadoop:Standyby
【日志信息】=> name21.hadoop:/var/log/hadoop/hdfs/hadoop-hdfs-namenode-name21.hadoop.log
此时,由于之前GC时间过长,导致active NameNode向JournalNodes进行数据通信时,超时导致无法响应(超时时间默认值为20s,GC耗时32s);
至此,Active Namenode节点进入异常状态(进程无法结束,程序所起8021端口不存在);
3.【时间】=> 22:32:22
【HA状态】=> name21.hadoop:Active, name22.hadoop:Standyby
【日志信息】=> name21.hadoop:/var/log/hadoop/hdfs/hadoop-hdfs-zkfc-name21.hadoop.log
此时, name21.hadoop上的ZKFailoverController无法获取到本机Namenode的状态 [无法将Active状态修改为Standby] ,此后每隔45s反复重试;同时,与zookeeper的session连接关闭;
4.【时间】=> 22:32:22
【HA状态】=> name21.hadoop:Active, name22.hadoop:Standyby
【日志信息】=> name22.hadoop:/var/log/hadoop/hdfs/hadoop-hdfs-zkfc-name22.hadoop.log
与此同时, name22.hadoop的namenode与zookeeper建立session连接, ZKFailoverController 尝试连接name21.hadoop上的Namenode,将状态从Active修改为Standby, 报错连接超时;
启动Fence服务(集群并未设置,直接返回ture),并将name22.hadoop Namenode的状态从Standby变为Active;
5.【时间】=> 22:32:46
【HA状态】=> name21.hadoop:Active, name22.hadoop:Active
至此,集群的NameNode出现双Active状态,发生脑裂;
6.【恢复措施】
后面运维介入时,尝试重启namenode,发现一直卡在35%进度,无法在执行下去;
原因:运维介入时,首先尝试重启name22.hadoop上的namenode,此时重启程序检测到双active,程序会反复获取状态,直到active只有一个;
此时出现的情况是:
name21.hadoop的namenode异常(8021端口连接超时),无法将自身状态从active修改为standby;
name22.hadoop的namenode已经被ZKFailoverController选举为active,选举理由也是name21.hadoop的8021端口连接异常;
因此,需要重启name21.hadoop上的namenode(恢复8021端口),重启时会检测name22.hadoop的namenode状态(检测name22.hadoop的8021端口),将自身从active切换为standby;name22.hadoop无需重启;
7.【预防措施】
a. 优化GC参数,添加namenode的GC监控,找出GC异常的原因并修复;
b. 提高journalNode的写入超时时间,目前默认值是20s,对于生产环境有必要提高到60s;
c. 启动Fence服务;
d. 集群namenode节点的状态监控;
博客主页: https://www.jianshu.com/u/e97bb429f278