背景
集群的索引沒有預先規划大小,導致索引特別大,刪除數據刪除索引的形式進行,只能在原來的索引上進行數據刪除操作。
刪除索引時采用最經典的方式,即按照時間戳進行刪除,比如刪除90天以前的歷史數據,保留最新的。
Elasticseach會有后台線程根據Lucene的合並規則定期進行segment merging合並操作,一般不需要我們擔心。被刪除的文檔在segment合並時,才會被真正刪除掉。在此之前,它仍然會占用着JVM heap和操作系統的文件cache、磁盤等資源。在某些特定情況下,我們需要強制Elasticsearch進行segment merging,已釋放其占用的大量系統、磁盤等資源。
執行的期間你會發現,磁盤空間會有一個反復變化的過程,磁盤使用率會先增長,然后在刪除釋放空間這樣一個過程。這個過程無需緊張,都是正常現象
實踐
# 假如現在是中午11點,這個表示刪除8點-10點之間的全部數據
curl -X POST "http://localhost:9200/nginx-error-2021-10-12/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"@timestamp": {
"gte": "now-3h",
"lt": "now-1h"
}
}
}
}'
#假如現在是中午11點,這個表示刪除早上6點之前的全部數據,也就是比6點早的數據全部刪除
curl -X POST "http://localhost:9200/nginx-error-2021-10-12/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"@timestamp": {
"lt": "now-5h"
}
}
}
}'
#假如現在是中午11點,這個表示刪除早上6點-11點之間的數據
curl -X POST "http://localhost:9200/nginx-error-2021-10-12/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"@timestamp": {
"gt": "now-5h"
}
}
}
}'
#最后再執行下面命令即可開始正式刪除數據了,會產生大量的io
curl -X POST http://localhost:9200/nginx-error-2021-10-12/_forcemerge?max_num_segments=1&only_expunge_deletes=true
附帶一張實踐圖片

啟發:
上面的過程由自己實踐而來,其中受到了下面執行的啟發,特此記錄一下
POST /index-name/_delete_by_query?slices=auto&conflicts=proceed&wait_for_completion=false
{ //多線程並發刪除滿足查詢條件的數據
"query": {
"bool": {
"filter": {
"bool": {
"must_not": [
{
"term": { //查詢條件,可以自定義
"action": "XXXXXXX"
}
},
{
"exists": {
"field": "XXXXXXXX" //查詢條件,可以自定義
}
}
]
}
}
}
}
}
參考的一些鏈接:
騰訊雲博客參考:https://cloud.tencent.com/developer/article/1737025
官方文檔演示:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_ranges.html
官網文檔使用:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/common-options.html#date-math
