• -------------------------------------------------------------
  • ====================================

探究 | Elasticsearch如何物理删除给定期限的历史数据?

elasticsearch dewbay 5年前 (2019-04-12) 1997次浏览 已收录 0个评论 扫描二维码

1、题记
想到删除,基础认知是 delete,细分为删除文档(document)和删除索引;要删除历史数据,基础认知是:删除了给定条件的数据,用 delete_by_query。
实际操作发现:

  • 删除文档后,磁盘空间并没有立即减少,反而增加了?
  • 除了定时任务+delete_by_query,有没有更好的方式呢?

2、常见的删除操作
2.1 删除单个文档
DELETE /twitter/_doc/1
1
2.2 删除满足给定条件的文档
POST twitter/_delete_by_query
{
“query”: {
“match”: {
“message”: “some message”
}
}
}
1
2
3
4
5
6
7
8
注意:执行批量删除的时候,可能会发生版本冲突。强制执行删除的方式如下:

POST twitter/_doc/_delete_by_query?conflicts=proceed
{
“query”: {
“match_all”: {}
}
}
1
2
3
4
5
6
2.3 删除单个索引
DELETE /twitter
1
2.4 删除所有索引
DELETE /_all
1
或者

DELETE /*
1
删除所有索引是非常危险的操作,要注意谨慎操作。

3、删除文档后台做了什么?
执行删除后的返回结果:

{
“_index”: “test_index”,
“_type”: “test_type”,
“_id”: “22”,
“_version”: 2,
“result”: “deleted”,
“_shards”: {
“total”: 2,
“successful”: 1,
“failed”: 0
},
“_seq_no”: 2,
“_primary_term”: 17
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
解读:

索引的每个文档都是版本化的。
删除文档时,可以指定版本以确保我们试图删除的相关文档实际上被删除,并且在此期间没有更改。

每个在文档上执行的写操作,包括删除,都会使其版本增加。

真正的删除时机:

deleting a document doesn’t immediately remove the document from disk; it just marks it as deleted. Elasticsearch will clean up deleted documents in the background as you continue to index more data.

4、删除索引和删除文档的区别?
1)删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。

2)删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个 segment file 里面,因此 ES 后台的 segment merge 在合并 segment file 的过程中有可能触发旧文档的物理删除。

但因为一个 shard 可能会有上百个 segment file,还是有很大几率新旧文档存在于不同的 segment 里而无法物理删除。想要手动释放空间,只能是定期做一下 force merge,并且将 max_num_segments 设置为 1。

POST /_forcemerge
1
5、如何仅保存最近 100 天的数据?
有了上面的认知,仅保存近 100 天的数据任务分解为:

  • 1)delete_by_query 设置检索近 100 天数据;
  • 2)执行 forcemerge 操作,手动释放磁盘空间。

删除脚本如下:

!/bin/sh

curl -H’Content-Type:application/json’ -d'{
“query”: {
“range”: {
“pt”: {
“lt”: “now-100d”,
“format”: “epoch_millis”
}
}
}
}
‘ -XPOST “http://192.168.1.101:9200/logstash_*/
_delete_by_query?conflicts=proceed”
1
2
3
4
5
6
7
8
9
10
11
12
13
merge 脚本如下:

!/bin/sh

curl -XPOST ‘http://192.168.1.101:9200/_forcemerge?
only_expunge_deletes=true&max_num_segments=1′
1
2
3
6、有没有更通用的方法?
有,使用 ES 官网工具——curator 工具。

6.1 curator 简介
主要目的:规划和管理 ES 的索引。支持常见操作:创建、删除、合并、reindex、快照等操作。

6.2 curator 官网地址
http://t.cn/RuwN0oM

Git 地址:https://github.com/elastic/curator

6.3 curator 安装向导
地址:http://t.cn/RuwCkBD

注意:
curator 各种博客教程层出不穷,但 curator 旧版本和新版本有较大差异,建议参考官网最新手册部署。
旧版本命令行方式新版本已不支持。

6.4 curator 命令行操作
$ curator –help
Usage: curator [OPTIONS] ACTION_FILE

Curator for Elasticsearch indices.

See http://elastic.co/guide/en/elasticsearch/client/curator/current

Options:
–config PATH Path to configuration file. Default: ~/.curator/curator.yml
–dry-run Do not perform any changes.
–version Show the version and exit.
–help Show this message and exit.
1
2
3
4
5
6
7
8
9
10
11
12
核心:

  • 配置文件 config.yml:配置要连接的 ES 地址、日志配置、日志级别等;

执行文件 action.yml: 配置要执行的操作(可批量)、配置索引的格式(前缀匹配、正则匹配方式等)
6.5 curator 适用场景
最重要的是:

仅以删除操作为例:curator 可以非常简单地删除 x 天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天为命名的索引:logstash_2018.04.05。

命名模式需要和 action.yml 中的 delete_indices 下的 timestring 对应。

7、小结
多参考官网最新的文档,历史版本的历史文档很容易误导人;
多真正去实践,而不是仅限于知道;

medcl:ES 新版本 6.3 有一个 Index LifeCycle Management 可以很方便的管理索引的保存期限。

作者:铭毅天下(公众号同名)
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/80038930
版权声明:本文为博主原创文章,转载请附上博文链接!


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:探究 | Elasticsearch如何物理删除给定期限的历史数据?
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址