Elasticsearch索引的基本操作(3)-索引的滾動操作

1、說明

筆者的工作場景中,每天需要使用Elasticsearch處理數億的日誌記錄,這些數據之間不會有直接的關係,只是用於記錄以及用作後續的分析處理以及報表輸出。如果都將這些數據所有的數據都放到相同的索引中,那隨着時間的堆積,這無疑將會是非常龐大的數據,並且隨着索引數量的增加,後續數據的插入和查詢,都將會變得越來越慢。

Elasticsearch中提供了對滾動索引(rollover index)的支持,可以給索引設置一定的條件,並指定一個對外使用的索引別名,當索引達到指定的條件時,就會按照一定的規則建立新的索引,對應的別名也會指向新的索引,後續的數據就會寫到新建的索引中。由於外部應用使用的是索引的別名,對這種變化也是完全無感知的。

觸發滾動索引的參數

參數名

說明

max_age

指定索引存在的最大週期,如1d,7d,1m,1y

max_docs

存放的最的索引文檔數,這個不包括副本中的索引文檔數

max_size

索引中主分片所佔用的空間大小

這幾個條件可以同時設置,只要有其中一項條件達到了,就會觸發建立新的索引的動作。

 

通過滾動操作生成的新的索引的名稱,可以通過手工指定索引名稱的方式,如果源索引的名稱符合自動生成新的索引名稱的要求,滾動生成的索引則會根據源索引名稱,自動生成新的索引名稱,以下是滾動索引名稱自動生成的兩種情況

  • 索引名稱以索引名稱的前綴、中劃線“-”和數字這三部份構成,如logs-1、logs-01、logs-123456、logs-1234567等;中劃線“-”後面的數字的長度小於6位,則生成的滾動索引的名稱會自動用數字0補齊爲6位,如logs-1、logs-01兩個生成的下一個滾動索引的名稱是logs-000002,因而在設定滾動索引時,要避免這種情況,否則後生成的會報索引已經存在的異常;中劃線“-”後面的數字的長度大於等於6位的,則生成滾動索引時,會在該數字的基礎之上,往上加1,如logs-123456生成的下個滾動索引是logs-123457,logs-1234567生成的下個滾動索引是logs-1234568。
  • 索引名稱中包括日期的算式,由索引名稱前綴、中劃線“-”、日期算式、中劃線“-”和數字這五部份構成,如logs-{now/d}-1,生成的滾動索引會在最後的數字的基礎之上加1,數字補齊的規則和上面的用0補齊規則是一樣的。

 

2、不符合自動生成滾動索引的示例

1)創建了一個名爲logs_index_cannot_rollover的索引,併爲其指定了別名logs_index:

PUT /logs_index_cannot_rollover

{

  "aliases": {

    "logs_index": {}

  }

}

響應:

{

  "acknowledged" : true,

  "shards_acknowledged" : true,

  "index" : "logs_index_cannot_rollover"

}

表示操作成功。

2)往其中寫入2條數據:

POST /logs_index/_doc

{ "name":"feng" }

POST /logs_index/_doc

{ "name":"feng1" }

3)給上面的生成的索引指定滾動生成新的索引的條件,這裏爲了演示上的方便,爲其設置條件max_dos爲1:

POST /logs_index/_rollover/logs_index_cannot_rollover-1

{

  "conditions": {

    "max_docs":  1

  }

}

由於這裏的源索引不符合自動生成新的滾動索引名稱的要求,因而這裏必須指定目標索引,否則會報錯,其中logs_index_cannot_rollover-1爲後面用於生成的新的滾動索引的名稱。

響應:

{

  "acknowledged" : false,

  "shards_acknowledged" : false,

  "old_index" : "logs_index_cannot_rollover",

  "new_index" : "logs_index_cannot_rollover-1",

  "rolled_over" : false,

  "dry_run" : false,

  "conditions" : {

    "[max_docs: 1]" : false

  }

}

表示滾動請求執行成功了,生成了新的索引logs_index_cannot_rollover,別名logs_index會從自動從原索引logs_index_cannot_rollover上自動刪除,然後指向新生成的索引,後續新生成的文檔也會自動插入到新的索引中。

3、符合自動生成滾動索引的示例

3.1 索引名稱符合數字格式要求的示例

1)創建索引

PUT /logs_index-001

{

  "aliases": {

    "logs_index_auto": {}

  }

}

  1. 寫入兩條測試數據,請參考前面的數據寫入示例。
  2. 執行滾動索引操作,不指定目標索引名稱

POST /logs_index_auto/_rollover

{

  "conditions": {

    "max_docs":  1

  }

}

響應:

{

  "acknowledged" : false,

  "shards_acknowledged" : false,

  "old_index" : "logs_index-001",

  "new_index" : "logs_index-000002",

  "rolled_over" : false,

  "dry_run" : false,

  "conditions" : {

    "[max_docs: 1]" : false

  }

}

該響應中可以看到,生成了新的索引logs_index-000002。

3.2 索引名稱符合日期算式格式要求的示例

1)創建索引,此時索引名稱中包含了表達式和特殊字符,因而在執行請求前,需要將其進行URL編碼操作,如下所示:

#/<logs_index_date_auto-{now/d}-001>

PUT /%3clogs_index_date_auto-%7bnow%2fd%7d-001%3e

{

  "aliases": {

    "logs_index_date_auto": {}

  }

}

響應:

{

  "acknowledged" : true,

  "shards_acknowledged" : true,

  "index" : "logs_index_date_auto-2019.05.03-001"

}

提示成功創建了索引,名稱爲logs_index_date_auto-2019.05.03-001。

2)寫入兩條測試數據,請參考前面的數據寫入示例。

3)執行滾動索引操作,不指定目標索引名稱:

POST /logs_index_date_auto/_rollover

{

  "conditions": {

    "max_docs":  1

  }

}

響應:

{

  "acknowledged" : true,

  "shards_acknowledged" : true,

  "old_index" : "logs_index_date_auto-2019.05.03-001",

  "new_index" : "logs_index_date_auto-2019.05.03-000002",

  "rolled_over" : true,

  "dry_run" : false,

  "conditions" : {

    "[max_docs: 1]" : true

  }

}

提示生成了新的索引,名稱爲logs_index_date_auto-2019.05.03-000002。

滾動索引創建新的索引的過程,與單獨創建新的索引的過程是類似的,可以從符合符合的索引模板中自動讀取配置、別名、mappings等信息,也單個在執行滾動(_rollover)這一動作時,同時指定新索引的配置、別名、mappings等信息,在些就不舉例了。

滾動索引提供了一種新建索引不影響對外使用的方式,但其本身還不夠智能,需要配合一些外部的自動化方法纔可以做得更好,如定期執行滾動操作等,而不是由Elasticsearch本身去判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章