rollover使您可以根據索引大小,文檔數或使用期限自動過渡到新索引。 當rollover觸發后,將創建新索引,寫別名(write alias)將更新為指向新索引,所有后續更新都將寫入新索引。
對於基於時間的rollover來說,基於大小,文檔數或使用期限過渡至新索引是比較適合的。 在任意時間rollover通常會導致許多小的索引,這可能會對性能和資源使用產生負面影響。
Rollover歷史數據
-
在大多數情況下,無限期保留歷史數據是不可行的
- 時間序列數據隨着時間的流逝而失去價值,我們最終不得不將其刪除
- 但是其中一些數據對於分析仍然非常有用
-
Elasticsearch 6.3引入了一項新的rollover功能,該功能
- 以緊湊的聚合格式保存舊數據
- 僅保存您感興趣的數據
就像上面的圖片看到的那樣,我們定義了一個叫做logs-alias的alias,對於寫操作來說,它總是會自動指向最新的可以用於寫入index的一個索引。針對我們上面的情況,它指向logs-000002。如果新的rollover發生后,新的logs-000003將被生成,並對於寫操作來說,它自動指向最新生產的logs-000003索引。而對於讀寫操作來說,它將同時指向最先的logs-1,logs-000002及logs-000003。在這里我們需要注意的是:在我們最早設定index名字時,最后的一個字符必須是數字,比如我們上面顯示的logs-1。否則,自動生產index將會失敗。
rollover例子
我們還是先拿一個rollover的例子來說明,這樣比較清楚。首先我們定義一個log-alias的alias:
PUT /%3Clogs-%7Bnow%2Fd%7D-1%3E
{
"aliases": {
"log_alias": {
"is_write_index": true
}
}
}
如果大家對於上面的字符串“%3Clogs-%7Bnow%2Fd%7D-1%3E”比較陌生的話,可以參考網站https://www.urlencoder.io/。實際上它就是字符串“<logs-{now/d}-1>”的url編碼形式。請注意上面的is_write_index必須設置為true。運行上面的結果是:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "logs-2019.10.21-1"
}
顯然,它幫我們生產了一個叫做logs-2019.10.21-1的index。接下來,我們先使用我們的Kibana來准備一下我們的index數據。我們運行起來我們的Kibana:
我們分別點擊上面的1和2處:
點擊上面的“Add data”。這樣我們就可以把我們的kibana_sample_data_logs索引加載到Elasticsearch中。我們可以通過如下的命令進行查看:
GET _cat/indices/kibana_sample_data_logs
命令顯示結果為:
它顯示kibana_sample_data_logs具有11.1M的數據,並且它有14074個文檔:
我們接下來運行如下的命令:
POST _reindex
{
"source": {
"index": "kibana_sample_data_logs"
},
"dest": {
"index": "log_alias"
}
}
這個命令的作用是把kibana_sample_data_logs里的數據reindex到log_alias所指向的index。也就是把kibana_sample_data_logs的文檔復制一份到我們上面顯示的logs-2019.10.21-1索引里。我們做如下的操作查看一下結果:
GET logs-2019.10.21-1/_count
顯示的結果是:
{
"count" : 14074,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
顯然,我們已經復制到所有的數據。那么接下來,我們來運行如下的一個指令:
POST /log_alias/_rollover?dry_run
{
"conditions": {
"max_age": "7d",
"max_docs": 14000,
"max_size": "5gb"
}
}
在這里,我們定義了三個條件:
- 如果時間超過7天,那么自動rollover,也就是使用新的index
- 如果文檔的數目超過14000個,那么自動rollover
- 如果index的大小超過5G,那么自動rollover
在上面我們使用了dry_run參數,表明就是運行時看看,但不是真正地實施。顯示的結果是:
{
"acknowledged" : false,
"shards_acknowledged" : false,
"old_index" : "logs-2019.10.21-1",
"new_index" : "logs-2019.10.21-000002",
"rolled_over" : false,
"dry_run" : true,
"conditions" : {
"[max_docs: 1400]" : true,
"[max_size: 5gb]" : false,
"[max_age: 7d]" : false
}
}
根據目前我們的條件,我們的logs-2019.10.21-1文檔數已經超過14000個了,所以會生產新的索引logs-2019.10.21-000002。因為我使用了dry_run,也就是演習,所以顯示的rolled_over是false。
為了能真正地rollover,我們運行如下的命令:
POST /log_alias/_rollover
{
"conditions": {
"max_age": "7d",
"max_docs": 1400,
"max_size": "5gb"
}
}
顯示的結果是:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"old_index" : "logs-2019.10.21-1",
"new_index" : "logs-2019.10.21-000002",
"rolled_over" : true,
"dry_run" : false,
"conditions" : {
"[max_docs: 1400]" : true,
"[max_size: 5gb]" : false,
"[max_age: 7d]" : false
}
}
說明它已經rolled_ovder了。我們可以通過如下寫的命令來檢查:
GET _cat/indices/logs-2019*
顯示的結果為:
我們現在可以看到有兩個以logs-2019.10.21為頭的index,並且第二文檔logs-2019.10.21-000002文檔數為0。如果我們這個時候直接再想log_alias寫入文檔的話:
POST log_alias/_doc
{
"agent": "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1",
"bytes": 6219,
"clientip": "223.87.60.27",
"extension": "deb",
"geo": {
"srcdest": "IN:US",
"src": "IN",
"dest": "US",
"coordinates": {
"lat": 39.41042861,
"lon": -88.8454325
}
},
"host": "artifacts.elastic.co",
"index": "kibana_sample_data_logs",
"ip": "223.87.60.27",
"machine": {
"ram": 8589934592,
"os": "win 8"
},
"memory": null,
"message": """
223.87.60.27 - - [2018-07-22T00:39:02.912Z] "GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1" 200 6219 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1"
""",
"phpmemory": null,
"referer": "http://twitter.com/success/wendy-lawrence",
"request": "/elasticsearch/elasticsearch-6.3.2.deb",
"response": 200,
"tags": [
"success",
"info"
],
"timestamp": "2019-10-13T00:39:02.912Z",
"url": "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.deb_1",
"utc_time": "2019-10-13T00:39:02.912Z"
}
顯示的結果:
{
"_index" : "logs-2019.10.21-000002",
"_type" : "_doc",
"_id" : "xPyQ7m0BsjOKp1OsjsP8",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
顯然它寫入的是logs-2019.10.21-000002索引。我們再次查詢log_alias的總共文檔數:
GET log_alias/_count
顯示的結果是:
{
"count" : 14075,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
}
}
顯然它和之前的14074個文檔多增加了一個文檔,也就是說log_alias是同時指向logs-2019.10.21-1及logs-2019.10.21-000002。
總結:在今天的文檔里,我們講述了如何使用rollover API來自動管理我們的index。利用rollover API,它可以很方便地幫我們自動根據我們設定的條件幫我們把我們的Index過度到新的index。在未來的文章里,我們將講述如何使用Index life cycle policy來幫我們管理我們的index。