问题背景:
用户升级集群版本报错检查集群状态错误。
排查集群日志发现如下信息
o.e.x.m.c.n.NodeStatsCollector collector node_stats timed out when collecting data
o.e.x.m.c.i.IndexStatsCollector collector index-stats timed out when collecting data
o.e.x.m.c.i.IndexRecoveryCollector collector index_recovery timed out when collecting data
问题原因:
用户在执行GET /_cat/indices在3s内也接收不到数据返回。排查日志发现集群获取nodes-stats状态超时,获取index-stats状态超时,由于集群状态检测超时导致版本升级自检无法通过。排查发现集群没有配置专用主节点,由数据节点承担主节点角色。该数据节点磁盘类型为高性能云盘。ES版本升级需要调用GET _nodes/stats接口来验证集群与节点的状态。
通过火焰图分析:
时间主要消耗在读取translog文件的阶段。
GET _nodes/stats接口主要瓶颈在translog 的getLastModifyTime,每次会去读盘获取所有分片信息,集群索引较多,导致性能比较低。
解决办法:
对于存量索引遇到类似问题的话执行以下语句, 可以清理过多的translog。
代码语言:javascript复制POST */_flush?force
在6.x版本中需要调整一下索引的translog文件的生存时间,再执行flush就可以把文件数量降下来了。
对于新建的索引加下这个配置,在index settings中添加如下配置,否则后期无法清理清理过多的translog。
{
代码语言:javascript复制{"index" : {
"translog" : {
"flush_threshold_size" : "64mb",
"retention" : {
"size" : "64mb",
"age" : "30s"
}
}
}
}
通过_flush降低translog数量不生效,调整了下translog文件的生存时间再执行flush就可以把文件数量降下来了。
分析:
6.x版本默认12个小时,7.x之后该参数默认值较小。
该类问题多发于6.x版本,主节点磁盘类型为高性能云盘(HDD)的es集群中。
官方文档参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index-modules-translog.html