01 題記
想到刪除,基礎認知是delete,細分為刪除文檔(document)和刪除索引;要刪除歷史數據,基礎認知是:刪除了給定條件的數據,用delete_by_query。
實際操作發現:
刪除文檔后,磁盤空間並沒有立即減少,反而增加了?
除了定時任務+delete_by_query,有沒有更好的方式呢?
02 常見的刪除操作
2.1 刪除單個文檔
1DELETE /twitter/_doc/1
2.2 刪除滿足給定條件的文檔
1POST twitter/_delete_by_query
2{
3 "query": {
4 "match": {
5 "message": "some message"
6 }
7 }
8}
注意:執行批量刪除的時候,可能會發生版本沖突。強制執行刪除的方式如下:
1POST twitter/_doc/_delete_by_query?conflicts=proceed
2{
3 "query": {
4 "match_all": {}
5 }
6}
2.3 刪除單個索引
1DELETE /twitter
2.4 刪除所有索引
1DELETE /_all
或者
1DELETE /*
刪除所有索引是非常危險的操作,要注意謹慎操作。
03 刪除文檔后台做了什么?
執行刪除后的返回結果:
1{
2 "_index": "test_index",
3 "_type": "test_type",
4 "_id": "22",
5 "_version": 2,
6 "result": "deleted",
7 "_shards": {
8 "total": 2,
9 "successful": 1,
10 "failed": 0
11 },
12 "_seq_no": 2,
13 "_primary_term": 17
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.
04 刪除索引和刪除文檔的區別?
1)刪除索引是會立即釋放空間的,不存在所謂的“標記”邏輯。
2)刪除文檔的時候,是將新文檔寫入,同時將舊文檔標記為已刪除。 磁盤空間是否釋放取決於新舊文檔是否在同一個segment file里面,因此ES后台的segment merge在合並segment file的過程中有可能觸發舊文檔的物理刪除。
但因為一個shard可能會有上百個segment file,還是有很大幾率新舊文檔存在於不同的segment里而無法物理刪除。想要手動釋放空間,只能是定期做一下force merge,並且將max_num_segments設置為1。
1POST /_forcemerge
05 如何僅保存最近100天的數據?
有了上面的認知,僅保存近100天的數據任務分解為:
1)delete_by_query設置檢索近100天數據;
2)執行forcemerge操作,手動釋放磁盤空間。
刪除腳本如下:
1#!/bin/sh
2curl -H'Content-Type:application/json' -d'{
3 "query": {
4 "range": {
5 "pt": {
6 "lt": "now-100d",
7 "format": "epoch_millis"
8 }
9 }
10 }
11}
12' -XPOST "http://192.168.1.101:9200/logstash_*/
13_delete_by_query?conflicts=proceed"
merge腳本如下:
1#!/bin/sh
2curl -XPOST 'http://192.168.1.101:9200/_forcemerge?
3only_expunge_deletes=true&max_num_segments=1'
06 有沒有更通用的方法?
有,使用ES官網工具——curator工具。
6.1 curator簡介
主要目的:規划和管理ES的索引。支持常見操作:創建、刪除、合並、reindex、快照等操作。
6.2 curator官網地址
http://t.cn/RuwN0oM
Git地址:https://github.com/elastic/curator
6.3 curator安裝向導
注意:
curator各種博客教程層出不窮,但curator舊版本和新版本有較大差異,建議參考官網最新手冊部署。
舊版本命令行方式新版本已不支持。
6.4 curator命令行操作
1$ curator --help
2Usage: curator [OPTIONS] ACTION_FILE
3 Curator for Elasticsearch indices.
4 See http://elastic.co/guide/en/elasticsearch/client/curator/current
5Options:
6 --config PATH Path to configuration file. Default: ~/.curator/curator.yml
7 --dry-run Do not perform any changes.
8 --version Show the version and exit.
9 --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對應。
07 小結
多參考官網最新的文檔,歷史版本的歷史文檔很容易誤導人;
多真正去實踐,而不是僅限於知道;
medcl:ES新版本6.3 有一個 Index LifeCycle Management 可以很方便的管理索引的保存期限。