searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

关于Elasticsearch8.1.1频繁宕机的故障分析

2023-10-30 01:16:36
184
0

一、故障描述

1、在某外部客户项目反馈elasticsearch 8.1.1版本,每日定时会整个集群宕机;

2、在内部上云某些省份在升级8.1.1后,用安全工具对es集群进行漏洞扫描时,会出现集群宕机,且必然会重现;

 

二、排障过程

1、通过分析宕机前后的es运行日志,发现是org.elasticsearch.http.AbstractHttpServerTransport.requestWithoutFailedHeader这个方法产生了递归调用死循环,造成StackOverflowError异常,引起节点宕机;当用安全工具对整个集群扫描时,则会造成每个节点轮流宕机,从而造成整个集群宕机的现象。

 

2、通过分析源码发现:ES在接收到请求时,会对http请求的header中的参数(特别是Accept和Content-Type)进行校验,当发现某个header参数不合规时,将header删除了重新发起递归调用再次校验;

从上述代码中,发现递归调用传入的参数是最顶级的对象,可能造成每次调用都只会删除一个header的问题。推测如果header中Accept和Content-Type同时不合规,则可能出现本故障;

 

3、故障复现及验证

构造一个异常的请求:

curl  --header "Accept: 2 2" --header "Content-Type: 1 1" http : //[es_host]:[es_port]

 

修改源码,打印关键日志:

 

更新该jar包后,启动es,然后想es节点发送构造好的请求,es宕机。

分析日志,发现总不能同时删除Accept和Content-Type,上述推断得到证实。

 

4、检查ES8.2以后的源码,发现问题代码已修改。用同样的curl对8.2、8.3、8.5、8.10的es发起请求也没有造成es宕机。

 

三、故障结论

ES8.1的源码存在递归调用传参的bug。

 

四、启示

这是一个老生常谈的问题,在编码中如果采用递归,一定要注意两点:

1、必须有设置有终止条件;

2、注意传递参数,每个新的递归调用都会传递参数,如果参数传递不当,可能会导致逻辑错误。

0条评论
0 / 1000
邵****斌
13文章数
0粉丝数
邵****斌
13 文章 | 0 粉丝
原创

关于Elasticsearch8.1.1频繁宕机的故障分析

2023-10-30 01:16:36
184
0

一、故障描述

1、在某外部客户项目反馈elasticsearch 8.1.1版本,每日定时会整个集群宕机;

2、在内部上云某些省份在升级8.1.1后,用安全工具对es集群进行漏洞扫描时,会出现集群宕机,且必然会重现;

 

二、排障过程

1、通过分析宕机前后的es运行日志,发现是org.elasticsearch.http.AbstractHttpServerTransport.requestWithoutFailedHeader这个方法产生了递归调用死循环,造成StackOverflowError异常,引起节点宕机;当用安全工具对整个集群扫描时,则会造成每个节点轮流宕机,从而造成整个集群宕机的现象。

 

2、通过分析源码发现:ES在接收到请求时,会对http请求的header中的参数(特别是Accept和Content-Type)进行校验,当发现某个header参数不合规时,将header删除了重新发起递归调用再次校验;

从上述代码中,发现递归调用传入的参数是最顶级的对象,可能造成每次调用都只会删除一个header的问题。推测如果header中Accept和Content-Type同时不合规,则可能出现本故障;

 

3、故障复现及验证

构造一个异常的请求:

curl  --header "Accept: 2 2" --header "Content-Type: 1 1" http : //[es_host]:[es_port]

 

修改源码,打印关键日志:

 

更新该jar包后,启动es,然后想es节点发送构造好的请求,es宕机。

分析日志,发现总不能同时删除Accept和Content-Type,上述推断得到证实。

 

4、检查ES8.2以后的源码,发现问题代码已修改。用同样的curl对8.2、8.3、8.5、8.10的es发起请求也没有造成es宕机。

 

三、故障结论

ES8.1的源码存在递归调用传参的bug。

 

四、启示

这是一个老生常谈的问题,在编码中如果采用递归,一定要注意两点:

1、必须有设置有终止条件;

2、注意传递参数,每个新的递归调用都会传递参数,如果参数传递不当,可能会导致逻辑错误。

文章来自个人专栏
Clickhouse
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0