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
{
  "aliases": {
    "game-write": {}
  }
}
```



第四步驟: 定期跑 rollover index

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

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

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

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

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

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