记录一次elasticsearch的datastream写入故障

2023-11-27 10:46:15 浏览数 (2)

背景

用户使用社区的data stream对集群进行写入,会偶现403块只读错误。

异常报错日志如下:

代码语言:javascript复制
2023-04-18 12:40:53.524 ERROR   indexthrottler/excep_throttler.go:143   
es update error index: datastream_784fd7 id: 38339d010 CrashUUID: 8BF7A1A4A02156 
err: elastic: Error 403 (Forbidden)2023-04-18 12:40:53.524 ERROR   indexthrottler/excep_throttler.go:143   
es update error index: datastream_784fd7 id: 38339d010 
CrashUUID: 8BF7A1A4A021 err: elastic: Error 403 (Forbidden)

分析思路

1.首先对集群磁盘使用率进行了排查,发现磁盘使用率正常,并未达到磁盘水位,没有达到触发只读的阈值。

2.排查用户写入流量,是否存在流量过大导致文件系统只读的情况。

3.通过排查发现用户使用的是data stream对数据进行写入,而datastream通常则是由lifecycle对datastream索引进行管理。排查lifecycle中是否有引起触发块只读的动作。

以下是用户配置的lifecycle:

代码语言:json复制
{
 "DataStreamILMPolicy" : {
 "version" : 18,
 "modified_date" : "2022-03-08T11:01:17.618Z",
 "policy" : {
 "phases" : {
 "hot" : {
 "min_age" : "0ms",
 "actions" : {
 "forcemerge" : {
 "max_num_segments" : 1
 },
 "rollover" : {
 "max_size" : "128gb",
 "max_age" : "20d"
 },
 "set_priority" : {
 "priority" : 100
 }
 }
 },
 "delete" : {
 "min_age" : "45d",
 "actions" : {
 "delete" : {
 "delete_searchable_snapshot" : true
 }
 }
 }
 }
 }
 }
}

4. 通过排查发现用户在lifecycle的配置中,有对索引进行forcemerge的操作。

通过查阅官网和源码,我们发现在lifecycle对索引进行forcemerge时,会将索引置为read-only状态;待该动作完成后在解除只读状态。

这里在lifecycle中对索引进行merge操作,设置将索引的segment通过merge合并为一个大段,在查询场景下的确对查询有一定的提高。如果在对elasticsearch进行请求的过程当中,没有遇到因为segment数量过多而导致查询慢或写入慢的问题,建议可以先不在lifecycle中添加merge动作,因为forcemerge这个动作自身也是一个比较耗资源的操作,非必要情况下可以去掉,不用强行对索引进行forcemerge。可以根据实际业务情况进行评估,是否需要对索引进行forcemerge;

解决办法

需要去掉lifecycle中对于索引的的forcemerge配置,建议根据业务系统进行评估,在业务低峰期,改用定时脚本或手动方式对索引进行forcemerge动作。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞