2018/08/10

如何將 elasticsearch 資料設定 TTL

一開始在研究 elasticsearch 時 沒想太多就直接拿來用

隨著時間過去, 資料累積愈來愈多, 開始有了需要將資料 TTL 的功能

於是開始研究有沒有這樣的功能

首先我們需要了解的技能有:

  1. reindex
  2. index template
  3. date math index name with index alias
  4. rollover index

第一步驟: 將原先的 index 重新命名

由於為了讓其他 get api 在設定 TTL 後還可以正常運作, 在這邊需要做這樣的動作, 原因是 index A 之後會變成 alias A

// reindex
POST _reindex
{
  "source": {
    "index": "game"
  },
  "dest": {
    "index": "game_old"
  }
}

// 刪除原 index
DELETE game

第二步驟: 建立 index template

讓之後建立的 index 自動設定一些內部參數

PUT _template/game-template
{
  "index_patterns": ["game-*"],
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "aliases" : {
    "game-query" : {},
    "game" : {}
  },
  "mappings" : {
  }
}

第三步驟: 建立日期格式的 index 名稱

依據現在的時間建立 index 並且給予 write 的 alias,讓之後寫資料可以利用這個 alias 去寫

// <game-{now/d}-000001>
PUT /%3Cgame-%7Bnow%2Fd%7D-000001%3E
{
&nbsp;&nbsp;"aliases": {
&nbsp;&nbsp;&nbsp;&nbsp;"game-write": {}
&nbsp;&nbsp;}
}

第四步驟: 定期跑 rollover index

定期建立新的 index, 並將過時的 index 刪除

// 每天跑一次
POST /game-write/_rollover
{
&nbsp;&nbsp;"conditions": {
&nbsp;&nbsp;&nbsp;&nbsp;"max_age": "1d"
&nbsp;&nbsp;}
}

// 每天刪除舊資料
DELETE /game-YYYY.MM.dd-*

隱藏步驟: 如果要搬移舊資料, 則這時候再利用 reindex 功能建立

// reindex
POST _reindex
{
&nbsp;&nbsp;"source": {
&nbsp;&nbsp;&nbsp;&nbsp;"index": "game_old",
&nbsp;&nbsp;&nbsp;&nbsp;"query": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"range": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"createdDate": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"gte": particularDate.getTime(),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"lt": particularDate.getTime() + 86400000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;},
&nbsp;&nbsp;"dest": {
&nbsp;&nbsp;&nbsp;&nbsp;"index": "game-YYYY.MM.dd-000001"
&nbsp;&nbsp;}
}

// 全部搬移完後就可以刪除 game_old 了
DELETE /game_old

沒有留言:

張貼留言