將 Document indexing 進入 Elasticsearch 時,比較好的做法是先依照合適的 Index settings 及 mapping 來設置,但是若資料量不斷隨著時間增加,Index 也應該要隨著時間產生新的,如何有效的管理這些動態新增的 Index,我們需要的就是 Index Template。
從 官方文件 - Index Template 可以知道 Index Template 的基本用法,主要的目的就是預先建立好 Tempalte
,而當新的 Index 要被建立時,若符合設定好的 index_patterns
,則使用這個 Template
裡的設定來建立 Index。
建立一個 Index Template 時,可以設定以下資訊:
index_patterns
: 這是指 index 或 data stream 的名字,可以使用萬用字元 *
來定義這個 pattern。data_stream
: 這是 X-Pack 中的功能 (Basic license就能使用),主要是針對 time-series 的資料的一整套 aliase, rollover 的管理機制,一般會在 Index Lifecycle Management 中搭配設定及使用,之後會有文章來介紹這種資料的管理方式。[官方文件 - Data Streams][https://www.elastic.co/guide/en/elasticsearch/reference/7.9/data-streams.html]template
: 可以包含 Aliases, Mappings, Index Settings 的設定。composed_of
: 這是 Elasticsearch 7.8 新增的功能,可以套用事先定義好的 Component Template,這個可以設定多個 Component Templates,若有重覆的設定值,會以"後面的蓋掉前面的"來進行合併。priority
: 也是 Elasticsearch 7.8 新增的功能,指定 Index Template 的優先順序,數字愈大愈優先。(若沒有指定,會當成0
,也就是最低優先權來處理)version
: 讓使用者自己編寫的版本號。_meta
: 也是 Elasticsearch 7.8 新增的功能,讓使用者自己存放任意的物件資料。建立 Index Template 時,會檢查是否有同樣的
priority
而index_patterns
有重疊的情況,若有衝突會直接拋出錯誤。
以下就是個簡單的基本例子:
PUT _index_template/template_1
{
"index_patterns" : ["te*"],
"template": {
"settings" : {
"number_of_shards" : 1
},
"aliases" : {
"alias1" : {},
"{index}-alias" : {}
},
"mappings" : {
"_source" : { "enabled" : false }
}
},
"composed_of": ["template_component_1", "template_component_2"],
"priority" : 0,
"version": 5,
"_meta": {
"description": "test by Joe",
"latest_modify_date": "2020-09-20"
}
}
從 官方文件 - Put Component Template 可以查到基本的用法,主要是建立可被 Index Template 重覆使用的一組設定樣版,而可以設定的內容如下:
template
: 可以包含 Aliases, Mappings, Index Settings 的設定。version
: 讓使用者自己編寫的版本號。_meta
: 讓使用者自己存放任意的物件資料。簡單的例子:
PUT _component_template/template_1
{
"template": {
"settings" : {
"number_of_shards" : 1
},
"aliases" : {
"alias1" : {},
"{index}-alias" : {}
},
"mappings" : {
"_source" : { "enabled" : false }
}
},
"version": 123
}
Elasticsearch X-pack 內建有兩個預設的 Index Template, logs
和 metrics
,以下針對 logs
來做剖析。
logs
從 _index_template
API 可以直接 get 到這個內建的 logs
index template.
這是個 Index Template 是 Elastic Agent 產生的 logs 預設會套用的設置,其中幾個重點:
logs-*-*
格式的index上priority: 100
很高的優先權,所以要注意如果你自己的 index template 其中index_patterns
有同樣的格式的話,小心會被這個預設的配置給蓋掉。logs-settings
和 logs-mappings
的 Component Templates.以下是 logs-settings
的 Component Template.
{
"component_templates" : [
{
"name" : "logs-settings",
"component_template" : {
"template" : {
"settings" : {
"index" : {
"lifecycle" : {
"name" : "logs"
},
"codec" : "best_compression",
"query" : {
"default_field" : [
"message"
]
}
}
}
},
"version" : 0,
"_meta" : {
"description" : "default settings for the logs index template installed by x-pack",
"managed" : true
}
}
}
]
}
主要設置的是 index settings
lifecycle
。codec
指定為 best_compression
。query
的 default_field
。另外是 logs-mappings
的內容
{
"component_templates" : [
{
"name" : "logs-mappings",
"component_template" : {
"template" : {
"mappings" : {
"dynamic_templates" : [
{
"strings_as_keyword" : {
"mapping" : {
"ignore_above" : 1024,
"type" : "keyword"
},
"match_mapping_type" : "string"
}
}
],
"date_detection" : false,
"properties" : {
"@timestamp" : {
"type" : "date"
},
"ecs" : {
"properties" : {
"version" : {
"ignore_above" : 1024,
"type" : "keyword"
}
}
},
"data_stream" : {
"properties" : {
"namespace" : {
"type" : "constant_keyword"
},
"type" : {
"type" : "constant_keyword",
"value" : "logs"
},
"dataset" : {
"type" : "constant_keyword"
}
}
},
"host" : {
"properties" : {
"ip" : {
"type" : "ip"
}
}
},
"message" : {
"type" : "text"
}
}
}
},
"version" : 0,
"_meta" : {
"description" : "default mappings for the logs index template installed by x-pack",
"managed" : true
}
}
}
]
}
設置上的主要重點:
有使用到我們前一天介紹的 dynamic_templates
,其中因為這一個 Index Template 的對象是 Logs,當有大量的文字的欄位時,不希望使用預設的 text
+ sub-fields keyword
的配置,所以直接指定預設 string
的欄位就用 keyword
的型態來處理。
{
"strings_as_keyword" : {
"mapping" : {
"ignore_above" : 1024,
"type" : "keyword"
},
"match_mapping_type" : "string"
}
}
date_detection
有設為 false
,在這邊採取比較嚴謹的方式,不特別去嘗試判斷字串的欄位是否為日期格式,若要使用日期格式的規則,可由另外的 Component Template 來指定。
有一些 Logs general的欄位,直接在 mappings 中先定義出來,例如: @timestamp
、ecs
、host
、message
...等。
我們從 _index_template
可以看到 logs-
開頭的 Index Template 還有蠻多個
找其中一個來看,以 logs-endpoint-events.process
為例:
從 index_pattern
可以發現,他也符合 logs-*-*
的格式,但他更針對某一子集來設置 logs-endpoint.events.process-*
他的 priority 設置到更高的 200
,代表只要符合這個子集範圍的 Index,就直接以這個設置優先套用。
一些基本的 index settings
與 mappings
都直接在 template
中有定義。
他也有設置 Component Template - logs-endpoint.events.process-mappings
{
"component_templates" : [
{
"name" : "logs-endpoint.events.process-mappings",
"component_template" : {
"template" : {
"mappings" : {
"dynamic" : false,
"properties" : {
"@timestamp" : {
"type" : "date"
}
}
}
}
}
}
]
}
這個 Component 很單純的設定了,只要是這種類型的 Logs,就是要把 dynamic
設成 false
。
當 Index Template 及 Component Template 設計的愈複雜,想要驗證結果如何,可以透過兩個 simulate API 來驗證。
Simulate Index
用途:當有個指定名字的 Index 要產生時,最終他被套用的 Template 結果為何,以及是否有其他因同規則發生重疊的 Template。
Simulate Template
用途:當建立這個 Template 後,若有一個 Index 因為這個 Index Template 而建立起來時,裡面的設定會長什麼樣子,以及是否有與其他同規則發生重疊的 Template。
index_pattern
及 priority
建立結構化的管理方式,例如 logs
與 logs-xxxxx-*
這樣的子、從關係。version
一定要給,早期沒有 _meta
時可以考慮以日期來當版本號,不過有 _mate
後,會建議將此 index template 的基本描述及最後更新時間記錄在 _meta
中,以便於維護及管理。Component Template
,可以當作某種角色的定義,讓管理更容易。Simulate API
來驗證這個 Index Template 的產生結果及影響範圍。查看最新 Elasticsearch 或是 Elastic Stack 教育訓練資訊: https://training.onedoggo.com
歡迎追蹤我的 FB 粉絲頁: 喬叔 - Elastic Stack 技術交流
不論是技術分享的文章、公開線上分享、或是實體課程資訊,都會在粉絲頁通知大家哦!
此系列文章已整理成書
喬叔帶你上手 Elastic Stack:Elasticsearch 的最佳實踐與最佳化技巧
書中包含許多的修正、補充,也依照 Elastic 新版本的異動做出不少修改。
有興趣的讀書歡迎支持! 天瓏書局連結