日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch系列「二」如何物理删除给定期限的历史数据?

發布時間:2024/10/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch系列「二」如何物理删除给定期限的历史数据? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、題記

想到刪除,基礎認知是delete,細分為刪除文檔(document)和刪除索引;要刪除歷史數據,基礎認知是:刪除了給定條件的數據,用delete_by_query。?
實際操作發現:?
- 刪除文檔后,磁盤空間并沒有立即減少,反而增加了??
- 除了定時任務+delete_by_query,有沒有更好的方式呢?

2、常見的刪除操作

2.1 刪除單個文檔

DELETE /twitter/_doc/1

2.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 /_forcemerge

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"

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系列「二」如何物理删除给定期限的历史数据?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。