ES版本升级报错之CheckClusterState4Scalelnerr(FailedOperation.ErrorClusterState)

2022-10-27 09:42:56 浏览数 (1)

问题背景:

用户升级集群版本报错检查集群状态错误。

企业微信截图_16661540206406.png企业微信截图_16661540206406.png

排查集群日志发现如下信息

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

企业微信截图_cc76c9f0-03cb-46f5-b1c3-2c554b5fe289.png企业微信截图_cc76c9f0-03cb-46f5-b1c3-2c554b5fe289.png

问题原因:

用户在执行GET /_cat/indices在3s内也接收不到数据返回。排查日志发现集群获取nodes-stats状态超时,获取index-stats状态超时,由于集群状态检测超时导致版本升级自检无法通过。排查发现集群没有配置专用主节点,由数据节点承担主节点角色。该数据节点磁盘类型为高性能云盘。ES版本升级需要调用GET _nodes/stats接口来验证集群与节点的状态。

通过火焰图分析:

企业微信截图_ca4de701-0d23-4f6e-b4ca-83d3471667f3.png企业微信截图_ca4de701-0d23-4f6e-b4ca-83d3471667f3.png

时间主要消耗在读取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之后该参数默认值较小。

企业微信截图_16661633104163.png企业微信截图_16661633104163.png

该类问题多发于6.x版本,主节点磁盘类型为高性能云盘(HDD)的es集群中。

官方文档参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index-modules-translog.html

0 人点赞