如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者:来自 Elastic Musab Dogan

概述

Elasticsearch 提供两种类型的索引模板:旧(legacy)索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板,两者仍然可以在 Elasticsearch 8 中使用。

本文探讨了这些模板之间的差异以及它们的交互方式。 特别是,我们将重点关注如何在创建索引时检测将使用哪个模板。 让我们首先了解如何创建不同类型的索引模板。

Elasticsearch 中的索引模板

可以使用以下 API 创建旧模板:

PUT _template/t1
{
  "order": 1,
  "index_patterns": [...],
  "mappings": {...},
  "settings": {...},
  "alias": {...}
}

可以使用此 API 创建可组合模板:

PUT _index_template/ct1
{
  "priority": 1,
  "index_patterns": [...],
  "template": {
    "mappings": {...},
    "settings": {...},
    "alias": {...}
  }
}

组件模板是第三种类型,通常用于管理具有相似结构的多个模板。 例如,如果你需要创建数百个具有相似结构的模板,则可以创建具有通用设置、映射和别名的组件模板,然后将其包含在索引模板中。 可以使用此 API 创建组件模板:

PUT _component_template/template_1
{
  "template": {
    "mappings": {...},
    "settings": {...},
    "alias": {...}
  }
}

重要:当旧模板和可组合模板同时存在并且它们匹配相同的索引模式时,旧模板将被忽略。 如果两个可组合模板指向相同的索引模式,则将使用具有最高优先级的模板。 如果两个旧模板指向相同的索引模式,则模板将被合并,高阶模板将覆盖低阶模板。 如果顺序相同,则模板按名称排序并相应合并。

确定创建索引时将使用哪个模板

要确定索引在创建时将使用哪个模板,你可以使用 _simulate_index API。 此 API 将返回将使用的模板以及任何重叠的模板。 但是,如果不存在可组合模板,则 API 将返回空正文。 在这种情况下,你可以创建一个虚拟索引并检查所选主节点的日志以确定将使用哪个模板。

如果你同时拥有旧模板和可组合模板,会发生什么情况?

如上所述,如果你同时拥有旧模板和可组合模板,则旧模板将被忽略,就好像它不存在一样。

PUT _template/t1
{
  "index_patterns": [
    "test_index-*"
  ],
  "mappings": {
    "properties": {
      "field_1": {
        "type": "integer"
      },
      "field_2": {
        "type": "integer"
      }
    }
  }
}

在这种情况下,当你运行命令时,你会收到如下警告消息:

legacy template [t1] has index patterns [test_index-] matching patterns from existing composable templates [ct1] with patterns (ct1 => [test_index-]); this template [t1] may be ignored in favor of a composable template at index creation time

PUT _index_template/ct1
{
  "index_patterns": [
    "test_index-*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "field_1": {
          "type": "integer"
        }
      }
    },
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}

如果新创建的可组合模板与现有旧模板匹配或包含索引模式,你将收到如下警告消息:

index template [ct1] has index patterns [test_index-] matching patterns from existing older templates [t1] with patterns (t1 => [test_index-]); this template [ct1] will take precedence during new index creation

POST _index_template/_simulate_index/test_index-1
#response:
{
  "template": {
    "settings": {
      "index": {
        "number_of_shards": "1",
        "number_of_replicas": "0",
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        }
      }
    },
    "mappings": {
      "properties": {
        "field_1": {
          "type": "integer"
        }
      }
    },
    "aliases": {}
  },
  "overlapping": [
    {
      "name": "t1",
      "index_patterns": [
        "test_index-*"
      ]
    }
  ]
}

如果你想测试它,请使用此命令:

PUT test_index-1
GET test_index-1

更多阅读 “Elasticsearch:Simulate index API”。

现实生活场景的笔记

冲突可能很烦人,并且可能导致应用程序崩溃。 想象一下,你有 logstash-dev-*、logstash-prd-*、logstash-stg-* 旧模板都可以正常工作。 如果有人添加一个包含索引模式(如 logstash-*)的单个可组合模板,所有旧模板都将被忽略,字段类型可能会被更改,最终可能会破坏应用程序。 因此,如果你使用 Elasticsearch 7 及更高版本,建议从旧版模板切换到可组合模板。

另一个需要记住的好点是,如果你在 Elasticsearch 8 或更高版本中运行 Logstash,Logstash 默认情况下会将其模板添加为可组合模板。 因为对于 Elasticsearch 8 及更高版本,manage_template 默认设置为 true,并且 Logstash template_api 设置为可组合。 如果可组合模板不存在,它将创建一个具有 logstash-* 索引模式的 Logstash 可组合模板。 是的,它将忽略所有覆盖 logstash-* 的旧模板并重叠它们。

模板重叠

1. 如果你有两个指向相同索引模式的可组合模板,会发生什么情况?

如前所述,如果你有两个指向相同索引模式的可组合模板,则具有最高优先级的可组合模板将优先。

PUT _index_template/ct1
{
  "priority": 0,
  "index_patterns": [
    "test_index-*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "field_1": {
          "type": "integer"
        }
      }
    },
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}
PUT _index_template/ct2
{
  "priority": 1,
  "index_patterns": [
    "test_index-*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "field_1": {
          "type": "keyword"
        },
        "field_2": {
          "type": "integer"
        }
      }
    },
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 0
    }
  }
}
POST _index_template/_simulate_index/test_index-1
#response:
{
  "template": {
    "settings": {
      "index": {
        "number_of_shards": "2",
        "number_of_replicas": "0",
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        }
      }
    },
    "mappings": {
      "properties": {
        "field_1": {
          "type": "keyword"
        },
        "field_2": {
          "type": "integer"
        }
      }
    },
    "aliases": {}
  },
  "overlapping": [
    {
      "name": "ct1",
      "index_patterns": [
        "test_index-*"
      ]
    }
  ]
}

在此示例中,你有两个模板 - ct1 和 ct2 - 都针对相同的索引模式 test_index-。 但是,ct2 的优先级 (1) 高于 ct1 (0)。 因此,当你创建与模式 test_index- 匹配的索引时,ct2 中定义的设置和映射将在 ct1 之前应用。 如果 ct1 和 ct2 模板中有相同的设置,则 ct2 模板将被覆盖。

2. 如果你有两个指向相同索引模式的旧模板,会发生什么情况?

如上所述,如果你有多个指向相同索引模式的模板,则首先合并具有较低阶值的模板。 具有较高阶值的模板稍后会合并,覆盖具有较低值的模板。

如果两个旧模板具有相同的顺序值,它们将按名称排序。 例如,在 [t2, t1] 的情况下,t1 将首先合并,t2 将稍后合并,如果存在任何相同的映射/设置/别名,则 t2 将覆盖 t1。

PUT _template/t1
{
  "index_patterns": ["test_index-*"],
  "mappings": {
    "properties": {
      "field_1": {
        "type": "integer"
      }
    }
  },
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }
}
PUT _template/t2
{
  "index_patterns": [
    "test_index-*"
  ],
  "mappings": {
    "properties": {
      "field_1": {
        "type": "geo_point"
      },
      "field_2": {
        "type": "long"
      }
    }
  },
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 0
  }
}
POST _index_template/_simulate_index/test_index-1
#response
{}

不幸的是,如果你没有可组合模板,则此 API 调用将返回空正文。 那么如何检查呢?

答案是创建一个虚拟索引并检查 Elasticsearch elected-master 日志。

PUT test_index-test
2023-11-14 14:14:27 {"@timestamp":"2023-11-14T11:14:27.535Z", "log.level": "WARN",  "data_stream.dataset":"deprecation.elasticsearch","data_stream.namespace":"default","data_stream.type":"logs","elasticsearch.event.category":"templates","event.code":"index_template_multiple_match","message":"index [test_index-1] matches multiple legacy templates [t1, t2], composable templates will only match a single template" , "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"deprecation.elasticsearch","process.thread.name":"elasticsearch[elasticsearch][masterService#updateTask][T#3]","log.logger":"org.elasticsearch.deprecation.cluster.metadata.MetadataCreateIndexService","trace.id":"85e0a432ec11e2f2d3c7883f510376ac","elasticsearch.cluster.uuid":"Jc-a46VUSjOwuxWmbnSDZQ","elasticsearch.node.id":"MTX1x5-OTlWhiGa9lwUJPw","elasticsearch.node.name":"elasticsearch","elasticsearch.cluster.name":"elasticsearch-cluster1"}

2023-11-14 14:14:27 {"@timestamp":"2023-11-14T11:14:27.605Z", "log.level": "INFO", "message":"[test_index-1] creating index, cause [api], templates [t2, t1], shards [2]/[0]", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"elasticsearch[elasticsearch][masterService#updateTask][T#3]","log.logger":"org.elasticsearch.cluster.metadata.MetadataCreateIndexService","trace.id":"85e0a432ec11e2f2d3c7883f510376ac","elasticsearch.cluster.uuid":"Jc-a46VUSjOwuxWmbnSDZQ","elasticsearch.node.id":"MTX1x5-OTlWhiGa9lwUJPw","elasticsearch.node.name":"elasticsearch","elasticsearch.cluster.name":"elasticsearch-cluster1"}

从日志中,我们可以看到 “[test_index-1] creating index, cause [api], templates [t2, t1]”。

GET _cat/templates/t*?v
name index_patterns order version composed_of
t2   [test_index-*] 0
t1   [test_index-*] 0

如你所见,旧版模板 t1 和 t2 具有相同的顺序; 那么,哪一个会覆盖另一个呢?

在这种情况下,Elasticsearch 将根据名称对旧索引模板进行排序并应用它们。 将应用两个模板,并且列表中的第一个模板(本例中为 t2)将覆盖该模板。

奖励:如果你有两个旧模板指向具有相同字段名称但类型不合适的相同索引模式,会发生什么情况?

尝试在旧模板中合并属性,无论顺序如何,都可能会失败,因为字段定义应保持原子性。 这个问题是引入新的可组合模板的主要动机。 请参阅下面的示例。 我们感谢 Philipp Krenn 在本文中添加这些评论。

PUT _template/test1
{
  "order": 3,
  "index_patterns": [
    "test-*"
  ],
  "mappings": {
    "properties": {
      "my_field": {
        "type": "integer",
        "ignore_malformed": true
      }
    }
  }
}
PUT _template/test2
{
  "order": 2,
  "index_patterns": [
    "test-*"
  ],
  "mappings": {
    "properties": {
      "my_field": {
        "type": "keyword",
        "ignore_above": 1024
      }
    }
  }
}
PUT test-1/_doc/1
{
  "my_field": "a string..."
}
#response:
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "unknown parameter [ignore_above] on mapper [my_field] of type [integer]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping: unknown parameter [ignore_above] on mapper [my_field] of type [integer]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "unknown parameter [ignore_above] on mapper [my_field] of type [integer]"
    }
  },
  "status": 400
}

注意和最好需要知道的事情

  1. 以相同的顺序使用旧模板可能会导致很多混乱。 这就是为什么建议向模板添加 order 的原因。
  2. 具有较低 order 的模板首先被合并。 具有较高顺序值的模板稍后会被合并,覆盖具有较低 order 的模板。
  3. 你无法创建两个具有相同优先级的可组合模板。
{
  "type": "illegal_argument_exception",
  "reason": "index template [ct2] has index patterns [test_index-*] matching patterns from existing templates [ct1] with patterns (ct1 => [test_index-*]) that have the same priority [0], multiple index templates may not match during index creation, please use a different priority"
}

结论

总之,了解 Elasticsearch 索引模板的工作原理对于有效的索引管理至关重要。 通过了解如何确定索引在创建时将使用哪个模板,你可以确保使用正确的设置、映射和别名创建索引。

原文:Elasticsearch Index Template - Detect which template will be used before creation — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/623437.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS软件损坏怎么修复?10.7分享

前言 我们经常ArcGIS用着用着就会出现一些莫名奇怪的情况,比如ArcGIS的工具箱都打,字体丢失等、dll文件缺失。尝试了很多方法之后没有效果的,我们可以对软件做修复 那么修复改如果做呢? 不需要卸载软件,直接安装deskt…

记录一下 log4j的漏洞

目录 背景 bug的产生 bug复现 JNDI 网络安全学习路线 (2024最新整理) 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明: 背景 log4j这次的bug,我相信大家都已经知道了,仅以…

【异常】SpringBoot整合RabbitMQ-发送消息报错

错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…

【每日刷题】Day39

【每日刷题】Day39 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 622. 设计循环队列 - 力扣(LeetCode) 2. 387. 字符串中的第一个唯一字符 - …

一觉醒来 AI科技圈发生的大小事儿 05月13日

📳博弈论让 AI 更加正确、高效,LLM 与自己竞争 研究团队设计了共识博弈,通过让语言模型的生成器和判别器相互博弈来提高模型的准确性和内部一致性。这种方法不需要对基础模型进行训练或修改,可以在笔记本电脑上快速执行。研究结果…

《云原生安全攻防》-- 构建云原生攻防场景

在本节课程中,我们将学习云原生攻防场景的构建。为了研究云原生安全攻击案例,我们需要搭建一个云原生攻击测试环境,以便进行攻防研究和攻击手法的复现。 在这个课程中,我们将学习以下内容: 构建云原生攻防场景&#xf…

绝地求生:艾伦格回归活动来了,持续近1个月,新版本皮肤、G币等奖励白嫖

嗨,我是闲游盒~ 29.2版本更新在即,新活动来啦!目前这个活动国内官方还没发,我就去台湾官方搬来了中文版方便大家观看,也分析一下这些奖励应该怎样才能获得。 新版本将在周二进行约9小时的停机维护,请注意安…

基于WTVxxx语音芯片方案在智能小家电领域的应用介绍

一、产品市场: WTVxxx系列语音芯片凭借其出色的性价比,在小家电制造业中脱颖而出,它在确保优异音质及全面功能的基础上,大幅度削减了生产成本,为产品在激烈的市场竞争中赢得了价格优势,并为制造商拓宽了盈利…

快速清理系统盘空间

占用系统盘资源比较大,有两种log与cache。 使用如下命令查看 du -h /var/cache --max-depth1 | sort -hr | head -n 10结果如下:

【Java应用】Java提取B站视频教程详情(完整代码|下载可直接运行|自带页面|可直接复制)

提取B站视频教程详情 背景 B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章 效果图 根据关键字获取视频id public Result videoList(RequestBody VideoDto videoDto) {String keyword videoDto.get…

pcdn边缘云常见sla有哪些?如何避免被白嫖

PCDN(Point-to-Point Content Delivery Network)边缘云常见的SLA(Service Level Agreement)规则包括高峰期离线、服务时间、重传延时、限速等。这些规则是为了保证服务质量和用户体验。下面将详细解释这些规则,并提供一…

微服务熔断降级

什么是熔断降级 微服务中难免存在服务之间的远程调用,比如:内容管理服务远程调用媒资服务的上传文件接口,当微服务运行不正常会导致无法正常调用微服务,此时会出现异常,如果这种异常不去处理可能导致雪崩效应。 微服…

RabbitMQ--死信队列

目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者(正常消费者) 6.死信队列消费者 一、…

机器人系统ros2-开发学习实践11-从零开始构建视觉机器人模型(urdf)(02)

接上一个教程继续完善, 我们需要对机器人身体的蓝色,我们定义了一种名为“蓝色”的新材质,其中红色、绿色、蓝色和 alpha 通道分别定义为 0、0、0.8 和 1。所有值都可以在 [0,1] 范围内。然后该材料由 base_link 的视觉元素引用。白色材料的…

【LangChain学习之旅】—(21)聊天客服机器人的开发(上)

【LangChain学习之旅】—(21)聊天客服机器人的开发(上) “聊天机器人”说明项目的技术实现细节技术实现步骤简述第二步:增加记忆机制第三步:增加检索机制总结“聊天机器人”说明 聊天机器人(Chatbot)是 LLM 和 LangChain 的核心用例之一,很多人学习大语言模型,学习 …

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1,R3,R4 接入互联网,配置默认路由连通公网按照图示配置 IP 地址,R1,R3,R4 分别配置 Loopback0 口匹配感兴趣流,Loopback1 口模拟业…

win10系统解除微软账户和本地账户绑定

折腾了好久,终于找到一种方法可以退出微软账号了,不过这种方法我测试是成功的,有人留言自己不成功,具体解决方法只能看这些留言了 win10当中没有注销按钮,win x 弹出的菜单里面有关闭或注销,可以选择注销…

字符编码(十六进制)

题目描述 假设一个简易的变长编码规则XUTF:每个字符有一个唯一编号值 unicodeVal(如汉字“华”的编号十进制值是21326),使用1~6个字节进行编码,编码规则如下: 编码格式: 编号值范围编码后字节长度n二进制格式(x 表示有效位,其它为固定位)[0, 2^7)1字节1xxxxxxx[2^7,…

python数据分析——时间序列

时间序列 前言一、Datetime 模块常用函数和数据结构的详细解释datetime模块示例一示例二 二、时间运算示例一示例二示例三 三、时间序列分析自回归(Autoregressive model/AR)模型示例 滑动平均(moving average model/MA)模型示例 自回归滑动平均(Autoregressive moving average…