Elasticsearch系列「二」如何物理删除给定期限的历史数据?
1、題記
想到刪除,基礎認知是delete,細分為刪除文檔(document)和刪除索引;要刪除歷史數據,基礎認知是:刪除了給定條件的數據,用delete_by_query。?
實際操作發現:?
- 刪除文檔后,磁盤空間并沒有立即減少,反而增加了??
- 除了定時任務+delete_by_query,有沒有更好的方式呢?
2、常見的刪除操作
2.1 刪除單個文檔
DELETE /twitter/_doc/12.2 刪除滿足給定條件的文檔
POST twitter/_delete_by_query {"query": { "match": {"message": "some message"}} }注意:執行批量刪除的時候,可能會發生版本沖突。強制執行刪除的方式如下:
POST twitter/_doc/_delete_by_query?conflicts=proceed {"query": {"match_all": {}} }2.3 刪除單個索引
DELETE /twitter
2.4 刪除所有索引
DELETE /_all
或者
DELETE /*刪除所有索引是非常危險的操作,要注意謹慎操作。
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 }解讀:
索引的每個文檔都是版本化的。?
刪除文檔時,可以指定版本以確保我們試圖刪除的相關文檔實際上被刪除,并且在此期間沒有更改。
每個在文檔上執行的寫操作,包括刪除,都會使其版本增加。
真正的刪除時機:
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 /_forcemerge5、如何僅保存最近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"merge腳本如下:
#!/bin/sh curl -XPOST 'http://192.168.1.101:9200/_forcemerge? only_expunge_deletes=true&max_num_segments=1'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_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地址、日志配置、日志級別等;執行文件action.yml: 配置要執行的操作(可批量)、配置索引的格式(前綴匹配、正則匹配方式等)
6.5 curator適用場景
最重要的是:
僅以刪除操作為例:curator可以非常簡單地刪除x天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天為命名的索引:logstash_2018.04.05。
命名模式需要和action.yml中的delete_indices下的timestring對應。
7、小結
多參考官網最新的文檔,歷史版本的歷史文檔很容易誤導人;
多真正去實踐,而不是僅限于知道;
medcl:ES新版本6.3 有一個 Index LifeCycle Management 可以很方便的管理索引的保存期限。
參考:
[1]http://t.cn/RuwOTv?
[2]http://t.cn/RuwXHBr?
[3]http://t.cn/RuwOofC
總結
以上是生活随笔為你收集整理的Elasticsearch系列「二」如何物理删除给定期限的历史数据?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch系列「零」架构
- 下一篇: Elasticsearch系列「」学习路