深入解析 Elasticsearch 8.X 索引模板:从传统到可组合模板的全面指南

共 8216字,需浏览 17分钟

 ·

2024-07-14 10:36

在 Elasticsearch 中,索引模板用于定义索引的创建预设,包括映射、设置和别名等。

Elasticsearch 提供了两种类型的索引模板:传统模板(Legacy templates)和可组合模板(Composable templates)。

了解这两种模板的使用及其互动方式,对于有效管理索引至关重要。

1. 索引模板概览

1.1 传统模板

传统模板主要指Elasticsearch 7.7(含)以及之前版本的模板

使用 API 创建,主要用于早期版本的 Elasticsearch。配置示例如下:

PUT _template/t1
{
  "order": 1,
  "index_patterns": ["my-logs-*"],
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "timestamp": {"type""date"},
      "message": {"type""text"}
    }
  },
  "aliases": {
    "logs": {}
  }
}

提示信息详情如下:

1.2 组件模板

引入于 Elasticsearch 7.8,为现代索引模板提供更灵活的配置选项。

用于管理具有相似结构的多个模板,通常包括通用的设置、映射和别名。

假设我们需要创建一个组件模板,该模板包含一些基本的设置和映射,适用于日志数据的处理。这个模板将定义日志索引的分片数量、映射类型以及一个别名。

创建示例如下:

PUT _component_template/template_logs_base
{
 "template": {
   "settings": {
     "number_of_shards": 2,
     "number_of_replicas": 1
   },
   "mappings": {
     "properties": {
       "timestamp": {
         "type""date",
         "format""epoch_millis"
       },
       "log_level": {
         "type""keyword"
       },
       "message": {
         "type""text",
         "fields": {
           "keyword": {
             "type""keyword",
             "ignore_above": 256
           }
         }
       }
     }
   },
   "aliases": {
     "logs_all": {}
   }
 }
}

1.3 可组合模板

同 1.2 章节,引入于 Elasticsearch 7.8,为现代索引模板提供更灵活的配置选项。

创建方式如下:

提示信息如下:

PUT _index_template/logs_template
{
  "priority": 100,
  "index_patterns": ["my-logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 3  // 使用了独立的设置,而不是从组件模板继承
    },
    "mappings": {
      "_source": {
        "enabled"true  // 特定的设置可以覆盖组件模板的默认行为
      }
    },
    "aliases": {
      "all_logs": {}  // 定义特定的别名,也可以覆盖组件模板中的别名
    }
  },
  "composed_of": ["template_logs_base"]  // 引用组件模板
}

2. 模板冲突和优先级

当存在多个匹配同一索引模式的模板时,Elasticsearch 会根据模板的类型和优先级决定使用哪个模板:


《一本书讲透 Elasticsearch》P62-P66 系统讲解索引模板
  • 如果同时存在传统模板和可组合模板,且它们匹配相同的索引模式,将忽略传统模板。
  • 对于可组合模板,具有更高优先级的模板将被使用。
  • 对于传统模板,根据模板的顺序(order)进行合并,顺序值较高的模板将覆盖较低的设置。

举例:假设同时存在上述的 t1 传统模板和 logs_template 可组合模板,并且它们都适用于 my-logs-* 索引模式。logs_template ,将覆盖传统模板 t1。下面会详细举例解读:

3、传统模板中的 order 和 可组合模板 priority 什么区别?

在 Elasticsearch 中,传统模板(Legacy templates)的 order 和可组合模板(Composable templates)的 priority 都是用来解决模板冲突的机制,但它们在行为和应用场景上有一些区别。

3.1 传统模板中的 order

在传统模板中,order 属性用于确定当多个模板匹配到同一个索引时哪个模板应该优先应用。order 的值是一个整数,当两个或多个模板都适用于一个索引时:

较高的 order 值意味着较高的优先级——具有较高 order 值的模板会后应用,因此其配置会覆盖具有较低 order 值的模板中的相应配置。

合并行为——如果多个模板的 order 值相同,那么 Elasticsearch 会根据模板的名称按字典顺序合并它们,后加载的模板(在字典顺序上后出现的)可以覆盖先前的设置。

3.2 可组合模板中的 priority

对于可组合模板,priority 用于解决冲突的方式类似于传统模板中的 order,但它是专为可组合模板设计的:

较高的 priority 表示较高的优先级:当多个模板匹配到同一个索引模式时,具有较高 priority 值的模板将被使用,其设置将覆盖较低 priority 值的模板。原理同传统模板中的“order”。

单一选择——不同于传统模板的合并行为,当两个可组合模板冲突时,Elasticsearch 仅应用具有最高 priority 的模板。不进行合并,只选择一个模板应用。

3.3 关键区别

区别1:合并与选择层面

传统模板可以合并多个模板的设置(如果 order 相同),而可组合模板在冲突时只会选择一个使用(基于 priority)。

区别2:设计意图不同

priority 的设计更适用于现代 Elasticsearch 环境,其中模板可能非常复杂且多变,而且更强调清晰的配置覆盖而非配置的合并。

选择使用 order 还是 priority 取决于你的 Elasticsearch 版本和你对模板管理的需求。

随着 Elasticsearch 向可组合模板的过渡,了解和适应使用 priority 将有助于更好地管理索引模板,尤其是在复杂的或者需要高度自定义的环境中。

特性 传统模板 order 可组合模板 priority
优先级解决 较高的 order 值表示优先级高,可合并多个模板 较高的 priority 表示优先级高,仅应用一个最高优先级模板
冲突处理 如果 order 值相同,根据名称字典顺序合并设置 在冲突时,只选择 priority 最高的模板,不进行合并
设计目的 适用于早期的 Elasticsearch 版本,支持设置合并 为现代 Elasticsearch 环境设计,强调清晰的配置覆盖
适用场景 当需要综合多个模板设置时适用 当需要明确哪个模板设置应当优先应用时适用

所谓的“字典顺序合并设置”,举例说明一下:

PUT _template/template_a
{
  "order": 1,
  "index_patterns": ["mingyi-logs-*"],
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "message": {
        "type""text",
        "analyzer""standard"
      }
    }
  }
}


PUT _template/template_b
{
  "order": 1,
  "index_patterns": ["mingyi-logs-*"],
  "settings": {
    "number_of_shards": 3
  },
  "mappings": {
    "properties": {
      "message": {
        "type""text",
        "analyzer""whitespace"
      }
    }
  }
}


PUT mingyi-logs-01
GET mingyi-logs-01

当两个或多个传统模板具有相同的 order 值时,Elasticsearch 通常会根据模板名称的字典序(按字母顺序)来决定合并的先后顺序。

这意味着,如果模板名称为 template_a 和 template_b,且都有相同的 order 值,则 template_a(因为 'a' 在 'b' 之前)将先被应用,其设置可能会被随后应用的 template_b 覆盖

如果再结合下面的例子,会更通透理解!先创建template_b,再创建template_a, 也是会 template_b 覆盖 template_a。

4. 如何预测索引创建时将使用哪个模板

要确定创建索引时将使用哪个模板,可以使用 _simulate_index API。此 API 将返回将被用于新索引的模板信息,示例命令如下:

POST _index_template/_simulate_index/logs-2023

如果 API 返回空结果,可能需要通过创建一个虚拟索引并检查主节点的日志来确定使用的模板。

上图,我们可以得出其对应的模板就是我们刚才创建的:logs_template 可组合模板。

5、进一步操作示例

如果你想创建一个新的日志索引,并确保使用最新的模板设置,可以按照以下步骤操作:

创建索引:

PUT my-logs-2024-07

查询索引信息确认模板应用:

GET my-logs-2024-07

也就是通过创建索引,也可以看出其对应的到底是哪个模板!

6. 实际应用场景和注意事项

  • 日志管理场景

如果你的日志管理系统(如 Logstash)升级到 Elasticsearch 8 或更高版本,它默认将使用可组合模板。这意味着所有旧的传统模板将被新模板覆盖。

  • 模板冲突

在模板存在冲突时,可能会导致应用程序出现问题。推荐从传统模板迁移到可组合模板,尤其是在使用 Elasticsearch 7 及以上版本时。

7.小结

理解和掌握 Elasticsearch 的索引模板功能对于确保索引正确创建非常重要。通过使用 _simulate_index API,你可以预先检查并调整模板设置,避免生产环境中的意外错误。

通过本指南,希望你能更好地管理和优化 Elasticsearch 索引模板,从而提升数据操作的效率和准确性。

还有,如果你的企业应用环境是:Elasticsearch 7.8 + 及以上版本,推荐组合模板

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html

https://www.elastic.co/search-labs/blog/elasticsearch-index-template

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路


短时间快习得多干货!

和全球2000+ Elastic 爱好者一起精进!

http://elastic6.cn——ElasticStack进阶助手


抢先一步学习进阶干货

浏览 70
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐