网上对于定时删除 ElasticSearch 索引数据有相当多的文章,有一些是借助 Curator 工具实现,有一些通过 ElasticSearch 的 delete_by_query 语句实现。
事实上这几种都可以实现我们想要定期删除数据的效果,粗略翻看了一下(本王还没来得及细看),可以这么理解:
- delete_by_query 语句适合删除指定索引中的指定数据,例如删除索引 error_log 中距今超过 5 天的数据;
- Curator 工具适合删除指定的索引,例如删除索引 error_log_2020-12;
相关文档 delete_by_query、Curator
具体用哪一种方式,大家可以根据自己的需求来定。不过这两种方式都需要使用 Crontab 来实现定时,下面我以 delete_by_query 语句演示如何定时删除指定索引中的指定数据。
原理与基本语法
点击上面提供的文档链接跳转到 delete_by_query 的文档,文档给出的示例为:
POST /my-index-000001/_delete_by_query
{
"query": {
"match": {
"user.id": "elkbee"
}
}
}
其中 my-index-000001
为具体索引的名称,后面跟着的 _delete_by_query
就是 delete_by_query 语句对应的 API 接口标识,下方的 query
语句是用来筛选被删除数据的查询语句。假设我们要删除索引 error_log 中距今超过 5 天的数据,语句可以这么写:
{
"query": {
"range": {
"@timestamp": {
"lte": "now-5d/d"
}
}
}
}
转换为 CURL 的话,是这样:
curl --location --request POST 'http://127.0.0.1:9200/error_log/_delete_by_query' \
--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/json' \
--data-raw '{
"track_total_hits": true,
"query": {
"range": {
"@timestamp": {
"lte": "now-5d/d"
}
}
}
}'
其中 Authorization
后面跟着的 dXNlcm5hbWU6cGFzc3dvcmQ=
是用户名密码 username:password
的 BASE64 编码值,时间可以用 now-5d/d
表示。使用的时候根据自己的服务器地址、端口、用户名/密码和字段值灵活调整即可。
这里能够使用 new-5d/d
这样的语法是因为 ElasticSearch 中存储的时间格式为:
"@timestamp": "2020-12-31T16:13:38.479Z"
并且 ElasticSearch 支持这种查询语句,具体可翻阅文档。
如果你存储的是 10 位或者 13 位数字型时间戳,那么直接填写数字即可。
语句执行会返回一些信息:
{
"took": 161059,
"timed_out": false,
"total": 1252093,
"deleted": 1252093,
"batches": 1253,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
ElasticSearch 选择返回如此详细的信息是为了让执行者知晓本次删除操作的概况,从返回结果中我们可以得知总共有多少被删除的数据、实际上删除了多少、耗时多久、是否超时等。
定时
搞定了删除语句后,就剩下定时任务了。这里我们借助 Linux 中的 Crontab 来实现定时即可,例如我们要实现每天早晨 5:01 分执行定期删除命令。
首先我们创建一个后缀为 .sh
的文件(这里假设文件名为 elastic_delete_by_query.sh
),并将刚才的 CURL 命令写入其中,文件完整内容如下:
#!/bin/bash
/usr/bin/curl --location --request POST 'http://127.0.0.1:9200/error_log/_delete_by_query' \
--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/json' \
--data-raw '{
"track_total_hits": true,
"query": {
"range": {
"@timestamp": {
"lte": "now-5d/d"
}
}
}
}'
接着为该文件设定执行权限,命令为 sudo chmod +x elastic_delete_by_query.sh
。
最后使用 crontab -e
语句为其设定定时执行命令,定时规则如下:
1 5 */1 * * /root/elastic_delete_by_query.sh
目的达到,打完收工。
Curator 不仅仅是用于删除索引,实际上它的作用是管理索引,包括创建索引和其它的操作,如果你想深入了解,不妨去翻阅文档。
点击前往 韦世东的技术专栏 收获爬虫架构/爬虫逆向/存储引擎/消息队列/Python/Golang相关知识