Post

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个的。

参考:使用索引别名和Rollover滚动创建索引

This post is licensed under CC BY 4.0 by the author.