集群namenode与journalNode通讯超时导致namenode挂掉问题分析
背景:
因业务要求进行了一次业务数据的全量采集,采集过程中集群namenode与journalNode通讯超时导致namenode挂掉。如下图
Error: starting log segment 11771414 failed for required journal (JournalAndStream(mgr=QJM to [192.168.0.21:8485, 192.168.0.22:8485, 192.168.0.23:8485], stream=null)) java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond.
问题分析:
这种问题通常是Full GC导致的问题, namenode这个时间点进行了一次时间比较长的 full gc,导致写 journalnode 超时(默认是20s), namenode进程退出。
结合集群namenode jvm参数
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled
为什么Namenode JVM一般选用CMS,可以参考:NameNode Garbage Collection Configuration: Best Practices and Rationale
可能是以下原因:
1. Perm(jdk1.8后是元数据空间)空间不足; 2. CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC); 3. 主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。
再结合如下监控及heap情况:
我们可以看到,E伊甸园区使用比例 和M元数据区使用比例都很高,O老年代使用比例很低,且元数据区默认只有20M,所以判断是元数据空间不足导致的 full gc。
另外新生代和老生代比例为1:4,容易造成大对象在做gc时,大对象直接进入老生代,造成老生代内存快速增长,full gc更加频繁。
调优方向:
1.提升堆内存大小,降低Old区使用比例,修改新生代和老生代比例为1:3,规避压缩式GC的STW风险
2.调节journalnode 的写入超时时间 dfs.qjournal.write-txns.timeout.ms = 90s
3.设置Java8的永生代初始值MetaspaceSize为较大的值128m,避免MetaSpace用满需要增长
而引发的Full GC,-XX:MetaspaceSize=128m
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:NewRatio=3 -XX:MetaspaceSize=128m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
参考文章:
https://tech.meituan.com/2017/12/29/jvm-optimize.html
https://ericsahit.github.io/2016/12/25/Namenode%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/
https://toutiao.io/posts/155svp/preview
https://cache.one/read/3461413
http://blog.itpub.net/30089851/viewspace-2122226/
https://community.cloudera.com/t5/Support-Questions/Name-Node-instability-flush-failed-for-required-journal/td-p/128161