ElasticSearch中使用Index Template、Index Alias和Rollover 维护索引
关于es的基本原理,请参看:从原理到应用,Elasticsearch详解
随着es中数据不断同步,会出现索引膨胀,导致查询性能下降,可以使用Index Template和Rollover机制每个月创建新的索引并通过Index Alias让客户端无感知得查询和写入数据。同时可以分离冷热集群来管理这些索引。
ES6.7版本引入了 Index LifeCycle Management, 7.9版本引入Data Streams替代Roll over an index alias with a write index。
先创建索引模板,索引模版用于规定索引的mapping、alias等配置信息,符合模板规则的索引在创建时自动按照模板的配置生成。需要注意的是,索引模板中设置的alias是用于读:alias分为 read alias 和 write alias ,read alias可以对应多个索引,而 write alias只能对应一个索引,可以通过 is_write_index 指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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-01创建别名:pubchat-search-alias用于查询。使用索引别名查询,会将所有的索引都查一遍做并集,所以如果输入可以确定在某个索引,可以不通过别名查,提升查询性能。
1
2
#创建一个索引
PUT pubchat-01
此外,需要设置一个write alias 用于写操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#为索引再指定一个只用来 rollover 的别名
POST _aliases
{
"actions": [
{
"add": {
"index": "pubchat-01",
"alias": "pubchat-write-alias",
"is_write_index": true
}
}
]
}
#为索引再指定一个只用来 rollover 的别名,rollover生成的索引名和日期联动
# PUT <my-index-{now/d}-000001> 这个<符号要转换成字母
PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
{
"aliases": {
"my-alias": {
"is_write_index": true
}
}
}
rollover别名pubchat-write-alias只需要在创建第一个索引时指定一次,后面pubchat-write-alias会自动滚动指向:pubchat-01、pubchat-02……,这个的前提是索引的命名必须 end with - and a number such as my-index-000001 or my-index-3,当然自动rollover生成的索引名也可以跟日期联动,参考Increment index names for an alias 。而且,PUT <my-index-{now/d}-000001>
不能直接发请求,必须把里面的字符转换,转换参考: 比如当前时间是 2024年3月22号,{}中表达式示例如下:
下面设置rollover策略,可参考官网Rollover API文档:
1
2
3
4
5
6
7
8
9
10
# 指定rollover 的策略
POST /pubchat-write-alias/_rollover
{
"conditions": {
"max_docs": 2
}
}
POST /索引别名/_rollover/
POST /索引别名/_rollover/索引
值得注意的是:index.refresh_interval 参数会影响滚动策略准确性。比如max_docs设置成2,受refresh_interval 影响,索引中包含的文档数量是有可能大于2个的。