使用索引别名和Rollover滚动建立索引
在ElasticSearch6.3.2 集群作节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新建立的索引只容许分配到hot节点上,而随着时间推移,旧的历史索引数据须要迁移到warm节点上。所以,ES索引上存储的数据通常是按时间划分的:好比每月自动生成一个索引,用来存储这个月生产的全部数据。为了更方便地管理按时间生成的索引,可采用索引模板并结合ES的Rollover功能来方便地管理索引。html
先建立索引模板,索引模板里面定义的索引别名是不能用于rollover的。由于,索引模板里面的索引别名通常会指向多个"物理"索引。具体可参考:rollover-failing。指向多个"物理"索引的索引别名不能用来写数据。java
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 官方文档。app
建立新索引,自动命中索引模板,并为索引pubchat-202001建立一个专门用来搜索的别名:pubchat-search-aliaselasticsearch
#建立一个索引 PUT pubchat-202001
指定一个专门 进行rollover(滚动写入) 的索引别名。索引别名 pubchat-write-alias 是为了数据写入使用ide
#为索引再指定一个只用来 rollover 的别名 POST _aliases { "actions": [ { "add": { "index": "pubchat-202001", "alias": "pubchat-write-alias" } } ] }
rollover别名pubchat-write-alias只须要在建立第一个索引时指定一次,后面pubchat-write-alias会自动滚动指向:pubchat-20200二、pubchat-202003……测试
rollover 索引别名的主要做用是"滚动写入",所以rollover索引别名只能指向一个具体的索引。ui
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.spa
关于索引别名的详细描述可参考官方文档:Write Indexrest
为索引指定滚动策略。这里为了测试方便,当一个索引中超过2篇文档时,就生成一个新索引。code
# 指定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-20200一、pubchat-20200二、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,应该能更方便地管理索引了吧。