Elasticsearch(ES)模板(Templates)

66 阅读3分钟

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:

Web服务器

代理服务器

ZooKeeper

Kafka

RabbitMQ

Hadoop HDFS

Elasticsearch ES (本章节)

我们在前面介绍索引时候,直接向不存在的索引写入数据,会自动创建索引,这个创建的索引可能并不能满足需求,而且分片又无法调整。比如我们有的索引需要3分片2副本,有的索引需要5分片1副本。这个时候我们就可以通过定义不同的模板(Templates)来满足我们的需求。

Elasticsearch 模板(Template)是一种用于预先定义索引设置、映射(Mapping)和别名等配置的机制,能帮助用户在创建新索引时自动应用一致的规则,避免重复配置,同时确保索引结构的标准化。

1. 索引模板(Index Templates)

适用版本:Elasticsearch 7.x 及更早版本(8.x 中仍可使用,但推荐使用组件模板)。

组成:由 index_patterns(匹配索引名称的模式)、settings(索引设置)、mappings(字段映射)、aliases(别名)等组成。

curl -X PUT "localhost:9200/_index_template/logs_template" -H 'Content-Type: application/json' -d'
{
  "index_patterns": ["logs-*"], 
  "priority": 200,               # 
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 2,
      "index.lifecycle.name": "logs_policy"  # 关联ILM策略
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "message": { "type": "text" },
        "host": { "type": "keyword" }
      }
    },
    "aliases": {
      "all_logs": {}  # 为匹配索引添加别名
    }
  },
  "_meta": {
    "description": "Template for log indices"
  }
}
'

logs_template:模板的名字。

index_patterns:匹配所有以 logs- 开头的索引。

priority:优先级,数值越大优先级越高。

number_of_shards:命中以后的分区数量。

number_of_replicas:命中以后的副本数量。

index.lifecycle.name:生命周期策略(ILM)。

mappings:定义一些全局Mapping(手动创建索引时显式指定的 mappings > 模板中定义的 mappings > Elasticsearch 自动推断的动态映射)。

aliases:别名,搜索的时候可以代替所有模板创建的索引。

一句话总结就是所有以logs-*的索引默认是3分片,2副本,而不会是默认的1分片1副本。

在一般的情况下下ES的很多索引都会按照时间进行轮转,而我们创建不同的模板,就可以满足相同类型的索引都以固定分片和副本来创建。

2.组件模板(Component Templates)

适用版本:Elasticsearch 7.8+ 及更高版本(8.x 推荐使用)。

特点:可复用的配置片段,需通过索引模板引用组合使用,避免重复定义。

定义一个组件模板(通用分片设置)。

{
  "component_template": {
    "name": "shard-settings",
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1
    }
  }
}

定义一个索引模板,引用组件模板。

{
  "index_template": {
    "name": "logs-template",
    "index_patterns": ["logs-*"],
    "composed_of": ["shard-settings"],  // 引用组件模板
    "mappings": {
      "properties": { "timestamp": { "type": "date" } }
    }
  }
}

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。