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
```
訂閱:
文章 (Atom)