一、故障描述:
前台大厅搜索关键字无数据
二、故障处理过程
告警开始 8月19日 15:21
标题: 应用ERROR级别日志过多
概况: app_errorlog_count_1m >= 50
描述: item-search-microservice异常请求过多,请通过日志服务查看应用日志
标题: app item-search-microservicedubbo接口延时过高
概况: Application item-search-microservice dubbo接口请求延时P95超过2000, 当前值是 5011
同时,其他相关业务线 应用ERROR级别日志过多 告警开始频繁触发
发现问题8月19日 15:18分(-15) 搜索严重告警群收到fgc信息
开始响应8月19日
15:19分(-14) 查看发现单节点fgc较频繁,立即考虑重启
15:20分(-13)申请重启ES有问题5台节点
15:26分(-7) ES5台问题节点ip
15:28分(-5) 线上故障快速处理群-报备
15:31分(-3) 开始重启ES问题节点
15:32分(-1) 粗精排降级,减轻ES压力
故障开始8月19日 15:33(+0),用户反馈超时,搜不出
故障处理8月19日
15:46分(+13)最后节点启动完成
故障恢复通告8月19日 15:50(+17)
三、影响产品线及影响面
商品搜索:主搜、店铺搜索
四、故障原因
4.1、大量数据写入,集群负载增高
8月19日上午:ES节点偶尔有FGC告警,两到三次,过后恢复。同时172.20.13.0ygc耗时较高,查看发现进入安全点(可gc阶段)耗时较长。排查发现改日早上9点多运营操作前台类目批量复制,引起了全量商品变更,遂对该业务写入es进行处理限流,同时于19日12:02重启了172.20.13.0节点。截止限流已触发约1300w数据变更,大小约300(含副本)g左右。该索引集群当前数据约500g(含副本)。
4.1.1、ES数据写入每隔一段时间会生成一个segment(lucene索引),segment会由es自动进行merge操作。merge期间集群负载会增加,jvm heap、io等。其中,ES的合并策略为tiered阶梯式进行,既同等大小的segment会进行合并,所有从小segment阶段到大segment阶段,负载压力会越来越高。
4.1.2、ES有query cache机制来缓存(大约3gb),当merge时,缓存会失效,同时会有缓存预热线程reload缓存(高频热点dsl)。
现象:segment不断增加(写入)、减小(merge),从10点开始,至15:18分左右下降明显。
4.1.3、内存分配速率过高,GC压力变大。
如下图所示:gc压力增大5-6倍;前一日每秒申请2g heap,当日每秒10g。
年轻代:xmn=6g,eden=6*0.8=4.8g
4.2、2节点同时FGC,触发雪崩
现象:两个节点同时fgc(6-7s),触发雪崩。
ES搜索过程:
ES搜索为分布式搜索,搜索请求发送到协调节点,协调节点将请求分发到各个可处理的shard(query阶段),当所有shard都响应后,在内存进行分页排序处理,选取结果数据,再执行fetch阶段,填充其余字段进行返回。
当前每个shard都有1个副本,共5个shard,主备shard不在同一节点上。既主shard节点挂了,可使用副本shard进行服务,搜索时,主备shard之间负载均衡选择。
当节点fgc时:
状况1:当一个节点fgc时,暂停了6秒,则协调节点会一直等待该节点响应数据,但其他节点正常,并且正常的节点响应到协调节点的数据会驻留内存直至fgc节点响应。后续请求可自动负载到另一shard,降低影响,fgc后自动恢复。
举例:当一个请求,每个shard应query1m数据时,由于某个shard fgc,则有4m数据在协调节点驻留。本应立即返回,却呆了6秒,则该段时间,内存无法回收。
状况2:当两个或多个节点同时fgc时,若shard节点都至少有一个可提供服务,则状况同上。若正好有某一shard的主备,均在同时fgc,则该shard在7-8秒之间将不可用,不止正在处理的请求无法处理完成导致内存占用无法回收,并且整个集群后续进入的请求也会阻塞在该shard,但其它shard会召回大量数据驻留在集群中。
4.3、现象解释
1、为什么早上也有fgc,但没有雪崩?
因为早上同时间仅一个节点fgc,符合状况1。
2、为什么2个节点同时fgc引起了雪崩?
当两个节点同时fgc时,由4.2得知整个集群驻留内存的数据会增多并且时间长,gc也无法回收;再加上节点仍有超过以往5倍的内存分配压力,整个集群(逻辑隔离集群)雪崩。
如图: old区突增可说明,内存驻留数据过多,且时间长,回收效率不理想,内存占用越来越多。
3、为什么重启后可以恢复?
因为fgc问题为内存问题(回收跟不上分配),进程杀掉内存释放,重启后内存从0开始重新分配,则雪崩现象解除。
4、为什么发生了频繁fgc?
另一篇补充