Elasticsearch如何物理删除给定期限的历史数据?
1、題記
想到刪除,基礎(chǔ)認(rèn)知是delete,細(xì)分為刪除文檔(document)和刪除索引;要?jiǎng)h除歷史數(shù)據(jù),基礎(chǔ)認(rèn)知是:刪除了給定條件的數(shù)據(jù),用delete_by_query。?
實(shí)際操作發(fā)現(xiàn):?
- 刪除文檔后,磁盤空間并沒有立即減少,反而增加了??
- 除了定時(shí)任務(wù)+delete_by_query,有沒有更好的方式呢?
2、常見的刪除操作
2.1 刪除單個(gè)文檔
DELETE /twitter/_doc/12.2 刪除滿足給定條件的文檔
POST twitter/_delete_by_query {"query": { "match": {"message": "some message"}} }注意:執(zhí)行批量刪除的時(shí)候,可能會(huì)發(fā)生版本沖突。強(qiáng)制執(zhí)行刪除的方式如下:
POST twitter/_doc/_delete_by_query?conflicts=proceed {"query": {"match_all": {}} }2.3 刪除單個(gè)索引
DELETE /twitter2.4 刪除所有索引
DELETE /_all或者
DELETE /*刪除所有索引是非常危險(xiǎn)的操作,要注意謹(jǐn)慎操作。
3、刪除文檔后臺(tái)做了什么?
執(zhí)行刪除后的返回結(jié)果:
{"_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 }解讀:
索引的每個(gè)文檔都是版本化的。?
刪除文檔時(shí),可以指定版本以確保我們?cè)噲D刪除的相關(guān)文檔實(shí)際上被刪除,并且在此期間沒有更改。
每個(gè)在文檔上執(zhí)行的寫操作,包括刪除,都會(huì)使其版本增加。
真正的刪除時(shí)機(jī):
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、刪除索引和刪除文檔的區(qū)別?
1)刪除索引是會(huì)立即釋放空間的,不存在所謂的“標(biāo)記”邏輯。
2)刪除文檔的時(shí)候,是將新文檔寫入,同時(shí)將舊文檔標(biāo)記為已刪除。 磁盤空間是否釋放取決于新舊文檔是否在同一個(gè)segment file里面,因此ES后臺(tái)的segment merge在合并segment file的過程中有可能觸發(fā)舊文檔的物理刪除。
但因?yàn)橐粋€(gè)shard可能會(huì)有上百個(gè)segment file,還是有很大幾率新舊文檔存在于不同的segment里而無法物理刪除。想要手動(dòng)釋放空間,只能是定期做一下force merge,并且將max_num_segments設(shè)置為1。
POST /_forcemerge5、如何僅保存最近100天的數(shù)據(jù)?
有了上面的認(rèn)知,僅保存近100天的數(shù)據(jù)任務(wù)分解為:?
- 1)delete_by_query設(shè)置檢索近100天數(shù)據(jù);?
- 2)執(zhí)行forcemerge操作,手動(dòng)釋放磁盤空間。
刪除腳本如下:
#!/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"merge腳本如下:
#!/bin/sh curl -XPOST 'http://192.168.1.101:9200/_forcemerge? only_expunge_deletes=true&max_num_segments=1'6、有沒有更通用的方法?
有,使用ES官網(wǎng)工具——curator工具。
6.1 curator簡(jiǎn)介
主要目的:規(guī)劃和管理ES的索引。支持常見操作:創(chuàng)建、刪除、合并、reindex、快照等操作。
6.2 curator官網(wǎng)地址
http://t.cn/RuwN0oM
Git地址:https://github.com/elastic/curator
6.4 curator命令行操作
$ curator --help Usage: curator [OPTIONS] ACTION_FILECurator for Elasticsearch indices.See http://elastic.co/guide/en/elasticsearch/client/curator/currentOptions:--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.核心:?
- 配置文件config.yml:配置要連接的ES地址、日志配置、日志級(jí)別等;
- 執(zhí)行文件action.yml: 配置要執(zhí)行的操作(可批量)、配置索引的格式(前綴匹配、正則匹配方式等)
6.5 curator適用場(chǎng)景
最重要的是:
-
僅以刪除操作為例:curator可以非常簡(jiǎn)單地刪除x天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天為命名的索引:logstash_2018.04.05。
-
命名模式需要和action.yml中的delete_indices下的timestring對(duì)應(yīng)。
7、小結(jié)
- 多參考官網(wǎng)最新的文檔,歷史版本的歷史文檔很容易誤導(dǎo)人;
- 多真正去實(shí)踐,而不是僅限于知道;
- medcl:ES新版本6.3 有一個(gè) Index LifeCycle Management 可以很方便的管理索引的保存期限。
參考:
[1]http://t.cn/RuwOTv?
[2]http://t.cn/RuwXHBr?
[3]http://t.cn/RuwOofC
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch如何物理删除给定期限的历史数据?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch常用工具清单
- 下一篇: Netflix: 从 Batch ETL