天天看點

探究 | Elasticsearch如何實體删除給定期限的曆史資料?1、題記2、常見的删除操作4、删除索引和删除文檔的差別?5、如何僅儲存最近100天的資料?6、有沒有更通用的方法?7、小結

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_FILE

  Curator for Elasticsearch indices.

  See http://elastic.co/guide/en/elasticsearch/client/curator/current

Options:
  --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

作者:銘毅天下

轉載請标明出處,原文位址:

https://blog.csdn.net/laoyang360/article/details/80038930

繼續閱讀