使用索引別名和Rollover滾動創建索引
在ElasticSearch6.3.2 集群做節點冷(warm) 熱(hot) 分離中,實現了ElasticSearch集群節點的冷熱分離,新創建的索引只允許分配到hot節點上,而隨着時間推移,舊的歷史索引數據需要遷移到warm節點上。因此,ES索引上存儲的數據一般是按時間划分的:比如每個月自動生成一個索引,用來存儲這個月生產的所有數據。為了更方便地管理按時間生成的索引,可采用索引模板並結合ES的Rollover功能來方便地管理索引。
先創建索引模板,索引模板里面定義的索引別名是不能用於rollover的。因為,索引模板里面的索引別名一般會指向多個"物理"索引。具體可參考:rollover-failing。指向多個"物理"索引的索引別名不能用來寫數據。
PUT _template/pubchat
{
"index_patterns": "pubchat-*",
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1",
"routing": {
"allocation": {
"exclude": {
"box_type": "warm"
},
"require": {
"box_type": "hot"
}
}
}
}
},
"mappings": {
"_doc": {
"_source": {
"enabled": true
},
"properties": {
"uid": {
"type": "keyword"
},
"nick": {
"type": "keyword"
},
"chatTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
},
"aliases": {
"pubchat-search-alias": {}
}
}
索引別名 pubchat-search-alias 主要是為了用來搜索(讀操作)。要注意區分2類索引別名:一種是write index,另一種是read index,具體可參考 ES Index Alias 官方文檔。
創建新索引,自動命中索引模板,並為索引pubchat-202001創建一個專門用來搜索的別名:pubchat-search-alias
#創建一個索引
PUT pubchat-202001
指定一個專門 進行rollover(滾動寫入) 的索引別名。索引別名 pubchat-write-alias 是為了數據寫入使用
#為索引再指定一個只用來 rollover 的別名
POST _aliases
{
"actions": [
{
"add": {
"index": "pubchat-202001",
"alias": "pubchat-write-alias"
}
}
]
}
rollover別名pubchat-write-alias只需要在創建第一個索引時指定一次,后面pubchat-write-alias會自動滾動指向:pubchat-202002、pubchat-202003……
rollover 索引別名的主要作用是"滾動寫入",因此rollover索引別名只能指向一個具體的索引。
An alias that points to one and only one index can be used to read and write data. An alias that points to more than one index is read-only.
關於索引別名的詳細描述可參考官方文檔:Write Index
為索引指定滾動策略。這里為了測試方便,當一個索引中超過2篇文檔時,就生成一個新索引。
# 指定rollover 的策略
POST /pubchat-write-alias/_rollover
{
"conditions": {
"max_docs": 2
}
}
由於是新創建的索引,里面沒有數據,因此應該返回如下:
{
"acknowledged": false,
"shards_acknowledged": false,
"old_index": ""pubchat-202001",
"new_index": "pubchat-202002",
"rolled_over": false,
"dry_run": false,
"conditions": {
"[max_docs: 2]": false
}
}
最后,只需要向rollover索引別名 pubchat-write-alias 寫數據即可,當滿足rollover指定的策略時,會自動創建下一個新索引。
# 寫一點測試數據進去
PUT pubchat-write-alias/_doc/1
{
"uid" : "111",
"nick" : "test"
}
值得注意的是:index.refresh_interval 參數會影響滾動策略准確性。比如max_docs設置成2,受refresh_interval 影響,索引中包含的文檔數量是有可能大於2個的。
一個示例說明:
為了一個月生成一個索引(pubchat-yyyyMM),比如:pubchat-202001、pubchat-202002、pubchat-202003……
引入了Rollover之后,寫數據只需要往 pubchat-write-alias 索引(別名)上寫,當寫入的數據觸發 指定的 rollover 策略時,會自動生成新的索引(會去匹配已定義好的索引模板)
restHighLevelClient.bulkWrite("pubchat-write-alias");
若不采用Rollover,則需要自己在代碼邏輯中寫數據時,按月判斷生成索引名稱。
restHighLevelClient.bulkWrite("pubchat-202001");//1月份
restHighLevelClient.bulkWrite("pubchat-202002");//2月份
....
顯然rollover簡化了索引的管理。另,ES6.7版本引入了 Index LifeCycle Management,應該能更方便地管理索引了吧。