ES集群配置
2核4G 2热2温节点
写入速度
1500条/s写入
每条2000词以上
动态滚动功能
动态滚动重要依据有两个,滚动周期和索引大小,其中之一满足条件后会立即滚动。
随机刷新功能
开启后默认设置是不刷新
高频写入时
1500条/s写入, 在写入数据doc数量2w,数据量在6-700MB间时进行落盘刷新。
低频写入时
10条/s写入速度,在写入630Mb数据,9.7k条文档时刷新
写入部分数据后停止
在上一次刷新后,写入46MB,6600条数据后停止。5-6分钟后会进行刷新。
综合来说,随机刷新功能通常情况下不建议开启,数据落盘慢,不适合即写即查。
在长时间有大量数据写入且对即时查询要求低的情况下可以开启,落盘次数的减少有利于数据写入。
故障自动转移功能
自治索引在单点故障时会对索引进行滚动,避免阻塞写入。
- 持续不断对3号索引写入(写入速度几千文档/s)
当前正在写入的3号后备索引大小3.48G,文档数323550
2. 手动下线节点,重试写程序后,此时集群red,大部分写入请求被拒绝,成功写入数据在5%以下。
3. 15分钟后有新的后备索引滚动产生,此时3号索引仅4.37G数据,新增0.9G数据,新的4号索引2分钟新增的数据量就超过了。
结论:自治索引单点故障场景下,会拒绝大部分写入请求,导致大量写入失败。直到新索引被滚动出来,写入恢复正常。
发生节点故障时,滚动出新的自治索引所需要的时间默认是5分钟。
时序裁剪
时序裁剪功能默认关闭,需要手动开启。
代码语言:javascript复制PUT _cluster/settings
{
"persistent":{
"action.search.pre_filter.enabled": true
},
"transient":{
"action.search.pre_filter.enabled": true
}
}
使用时序裁剪功能需要使用range查询指定时间范围,时序裁剪是分片级别的,每个分片根据包含的数据会有个时间范围,时序裁剪时只查询范围重叠的后备索引分片以及最新的后备索引
代码语言:javascript复制GET /test/_search
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"@timestamp" : {
"gte" : "2023-08-24T11:47:26.565989Z",
"lt" : "2023-08-24T11:48:26.565989Z"
}
}
}
}
}
}
- 时序裁剪会带上正在写的那个后备索引,也就是最新的后备索引
- 观测方式
(1)查询后返回结果的skipped
(2)让查询日志全部成为慢日志,在控制台观察慢日志
代码语言:javascript复制PUT test/_settings
{
"index.indexing.slowlog.threshold.index.debug" : "0ms",
"index.indexing.slowlog.threshold.index.info" : "0ms",
"index.indexing.slowlog.threshold.index.warn" : "0ms",
"index.search.slowlog.threshold.fetch.debug" : "0ms",
"index.search.slowlog.threshold.fetch.info" : "0ms",
"index.search.slowlog.threshold.fetch.warn" : "0ms",
"index.search.slowlog.threshold.query.debug" : "0ms",
"index.search.slowlog.threshold.query.info" : "0ms",
"index.search.slowlog.threshold.query.warn" : "0s"
}
可以看到时序裁剪是按分片进行时间过滤,决定是否查询的
另外,sql查询也能触发时序裁剪,sql的时间过滤会被ES转换为range过滤
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!