背景
用户使用社区的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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!