我们使用ElasticSearch时一般需要自己创建ElasticSearch的索引的Mapping,当索引非常多的时候,可能需要配置一个索引模板Template来对类似的索引做统一配置,让索引模板Template中配置匹配索引的规则,来确定该Template会被应用到哪些索引上。
Template配置方式
当Logstash在整合ElasticSearch的时候,会有下面三种方式的Template配置:
1. 使用ElasticSearch默认自带的索引模板
ElasticSearch默认自带了一个名字为”logstash”
的模板,默认应用于Logstash写入数据到ElasticSearch使用
- 优点:最简单,无须任何配置
- 缺点:无法自定义一些配置,例如:分词,数据类型
2. 在Logstash Indexer端自定义配置索引模板
Logstash的output插件中使用template指定本机器上的一个模板json文件路径,可以在json文件中设置对应的Template模板信息。例如:template => “/tmp/logstash.json”
- 优点:配置简单
- 缺点:因为分散在Logstash Indexer机器上,维护起来比较麻烦
3. 在ElasticSearch服务端自定义配置索引模板
由ElasticSearch负责加载模板。这种方式需要在ElasticSearch的集群中的config/templates路径下配置模板json
。而且ElasticSearch提供了Restful API接口维护索引模板信息。
- 优点:维护比较容易,可动态更改,全局生效。
- 缺点:需要注意模板的命名规则,比较容易通过看Template名字就能够确定模板应用到哪些索引
这里可能使用第三种方式统一管理Template最好,推荐使用第三种方式
,但是具体问题具体分析。例如我现在的场景就使用的第二种方式,因为我们的Logstash Indexer和ElasticSearch只有一台服务器,所以在Logstash Indexer端维护Template文件也可以。
模板类型
ElasticSearch的模板类型主要由两种:静态模板和动态模板
1. 静态模板
适合索引字段数据固定的场景
,一旦配置完成,不能向里面加入多余的字段,否则会报错
- 优点:scheam已知,业务场景明确,不容易出现因字段随便映射从而造成元数据撑爆es内存,从而导致es集群全部宕机
- 缺点:字段数多的情况下配置稍繁琐,针对于每个索引可能需要的模板都不同,很有可能需要配置很多个模板
2.动态模板
适合字段数不明确
,大量字段的配置类型相同的场景,可以按照类型规则动态添加新字段,新加字段不会报错。主要需要配置”dynamic_templates”
- 优点:可动态添加任意字段,无须改动schema
- 缺点:无标准schema导致数据不规则,如果添加的字段非常多,有可能造成ES集群宕机
- 需要注意:模板在设置生效后,仅对ES集群中新建立的索引生效,而对已存在的索引及时索引名满足模板的匹配规则,也不会生效,因此如果需要改变现有索引的Mapping信息,仍需要在正确的Mapping基础上建立新的索引,并将数据从原索引拷贝至新索引,变更新索引别名为原索引这种方式来实现。