OpenSearch

简介

WARNING

支持的 OpenSearch 版本:3.x

OpenSearch 在各个版本之间保持 API 一致性,并与 Elasticsearch 7.10.2 兼容。OpenSearch 版本会从 root/ping 端点自动获取。Jaeger 根据此版本使用兼容的索引映射和 OpenSearch REST API。也可以通过 version: 配置属性显式提供版本。

除了安装并运行 OpenSearch 外,OpenSearch 不需要其他初始化操作。启动后,将正确的配置值传递给 Jaeger。

对于 OpenSearch,Jaeger 使用与 Elasticsearch 相同的存储实现。大多数配置选项的行为也相同,因此共享的详细信息请参阅 Elasticsearch 文档。

配置

Jaeger 仓库中提供了使用 OpenSearch 后端的示例配置:config-opensearch.yaml。由于 OpenSearch 与 Elasticsearch 共享实现,请将 config.go 作为可用选项的权威来源。

分片和副本

分片和副本是需要特别注意的配置值,因为它们在创建索引时确定。Elasticsearch 的分片和副本指南同样适用于 OpenSearch。

查询时间范围

max_span_age 和 max_trace_duration 的行为与 Elasticsearch 中相同,请参阅查询时间范围。

Alauda Distributed Tracing 在 OpenSearch 上使用基于别名的轮换(rotation.auto_rollover),因此 max_span_age 会被静默替换为 50 年,保留期限完全由 ISM 策略控制。只有 max_trace_duration 值得调整:将其设置为预期的最长 trace,因为默认值 24h 会使每次查询两侧的范围各扩大整整一天。

索引管理策略

Jaeger 在 OpenSearch 上提供与 Elasticsearch 相同的三种轮换策略,通过 rotation 下的 indices.<type> 配置进行选择。有关对比表和字段参考,请参阅索引管理策略。唯一特定于后端的差异是,生命周期管理由 OpenSearch Index State Management(ISM)插件提供,而不是 Elasticsearch ILM。

Alauda Distributed Tracing 为全部四种索引类型配置 rotation.auto_rollover,并由 ISM 策略驱动轮换和删除。

索引轮换

jaeger-es-rollover init 对 OpenSearch 执行与 Elasticsearch 完全相同的准备工作:创建索引模板、每种类型的第一个编号索引(例如 jaeger-span-000001),以及读写别名。有关常规说明和轮换触发条件,请参阅索引轮换。

该工具从 ping 端点检测后端,并切换生命周期相关部分:

ElasticsearchOpenSearch
生命周期插件ILMISM
策略 API_ilm/policy/<name>_plugins/_ism/policies/<name>
索引模板中的轮换别名index.lifecycle.rollover_aliasindex.plugins.index_state_management.rollover_alias
策略如何附加到索引index.lifecycle.name,写入索引模板ism_template 模式,在策略内部声明

jaeger-es-rollover 镜像地址由 Alauda Build of Jaeger v2 集群插件发布到 jaeger-cluster-plugin-manifest ConfigMap 中,因此始终与部署的 Jaeger 版本一致:

export JAEGER_ES_ROLLOVER_IMAGE=$(kubectl -ncpaas-system get configmap jaeger-cluster-plugin-manifest -o jsonpath='{.data.jaeger-es-rollover-image}')

ISM 支持

OpenSearch ISM 根据由状态和转换组成的策略自动管理索引。它承担与 Elasticsearch ILM 相同的作用:按索引年龄或大小轮换写入索引,并在索引超过保留期限后将其删除。

Jaeger 从不创建生命周期策略。jaeger-es-rollover init 仅验证名为 ES_ILM_POLICY_NAME 的策略是否存在;如果不存在,则失败并显示 ILM/ISM policy <name> doesn't exist. Please create it and re-run init。请先创建 ISM 策略,再运行初始化程序。

启用 ISM 支持:

  1. 在 OpenSearch 中创建 ISM 策略,例如命名为 jaeger-ism-policy。description 是必需项,并且策略必须包含 ism_template 部分,因为 OpenSearch 在创建时通过匹配索引名称来附加策略,而不是通过模板设置来附加:

    {
      "policy": {
        "description": "Jaeger index rollover and retention",
        "default_state": "hot",
        "states": [
          {
            "name": "hot",
            "actions": [ { "rollover": { "min_index_age": "1d", "min_primary_shard_size": "50gb" } } ],
            "transitions": [ { "state_name": "delete", "conditions": { "min_index_age": "7d" } } ]
          },
          { "name": "delete", "actions": [ { "delete": {} } ], "transitions": [] }
        ],
        "ism_template": [
          { "index_patterns": ["jaeger-span-0*"], "priority": 100 }
        ]
      }
    }
    WARNING

    将 ism_template 模式限制为带有 -0* 后缀的编号轮换索引。类似 jaeger-span-* 的模式也会匹配之后创建的日期后缀索引,例如回滚到 rotation.periodic 后创建的索引。随后 ISM 会接管这些索引并在其上执行失败,因为这些索引未附加到轮换别名。

    使用 OpenSearch 安装 Alauda Distributed Tracing 中提供了涵盖全部四种索引类型的完整策略。

  2. 将 ES_USE_ILM=true 和 ES_ILM_POLICY_NAME 设置为策略名称,然后运行初始化程序。在 OpenSearch 上,这些变量保留其 ES_ 前缀:

    nerdctl run -it --rm --net=host \
      -e ES_USE_ILM=true \
      -e ES_ILM_POLICY_NAME=jaeger-ism-policy \
      -e ADAPTIVE_SAMPLING=true \
      ${JAEGER_ES_ROLLOVER_IMAGE} \
      init https://localhost:9200

    除了索引轮换中所述的模板、种子索引和别名外,初始化程序还会:

    • 通过 _plugins/_ism/policies/ 端点验证 ISM 策略是否存在。
    • 将 index.plugins.index_state_management.rollover_alias 嵌入索引模板。
    • 在写入别名上设置 is_write_index: true,这是 ISM 执行索引轮换所必需的。

    ADAPTIVE_SAMPLING=true 还会创建 sampling 别名。当 Jaeger 配置为 sampling 索引类型声明轮换策略时,请设置此变量;否则,由于其写入别名不存在,向该索引写入会失败。

  3. 为每种索引类型配置 create_mappings: false 和 auto_rollover 轮换策略,然后部署 Jaeger:

    create_mappings: false
    indices:
      spans:
        rotation:
          auto_rollover: {}
      services:
        rotation:
          auto_rollover: {}
      dependencies:
        rotation:
          auto_rollover: {}
      sampling:
        rotation:
          auto_rollover: {}

    将 auto_rollover.policy_name 留空。它只会将策略名称嵌入 Jaeger 自行创建的模板,而 OpenSearch 不会读取该设置。

    WARNING

    此处必须设置 create_mappings: false,并且没有配置验证会强制执行这一点。使用默认值 create_mappings: true 时,Jaeger 会在启动时使用相同的名称重新创建索引模板,并删除读别名和 ISM 轮换别名。写入仍会成功,因此部署看起来正常,直到第一次轮换生成一个读别名未覆盖、且 ISM 无法再对其执行轮换的索引:新的 trace 会被存储,但永远不会显示在 Jaeger UI 中。请通过设置 create_mappings: false、重新运行 jaeger-es-rollover init,并手动修复受影响的索引来恢复。

ISM 管理索引后,轮换和保留将自动执行,不需要 rollover、lookback 或 index-cleaner cron 作业。

更新 ISM 策略

更改运行中部署的保留期限或轮换条件需要执行两个步骤。

  1. OpenSearch 会拒绝对现有策略执行 PUT,并返回 version_conflict_engine_exception,除非请求携带当前序列号。因此,请先读取策略,然后传回这些值:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" -X PUT \
      "${OPENSEARCH_ENDPOINT}/_plugins/_ism/policies/jaeger-ism-policy?if_seq_no=<seq-no>&if_primary_term=<primary-term>" \
      -H 'Content-Type: application/json' --data-binary @policy.json

    <seq-no> 和 <primary-term> 是 GET _plugins/_ism/policies/jaeger-ism-policy 返回的 _seq_no 和 _primary_term 值。

  2. ISM 会在接管索引时将策略复制到该索引中,因此新的定义只会应用于之后创建的索引。请针对现有索引显式应用新定义,每种索引类型发送一个请求:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" -X POST \
      "${OPENSEARCH_ENDPOINT}/_plugins/_ism/change_policy/${JAEGER_ES_INDEX_PREFIX}-jaeger-span-0*" \
      -H 'Content-Type: application/json' \
      -d '{"policy_id": "jaeger-ism-policy"}'

    将模式限定在单个索引类型上。中间包含通配符(例如 -jaeger-*-0*)也会匹配日期后缀索引,并导致请求报告失败。

NOTE

_plugins/_ism/explain 最终一致:策略更改后以及创建索引后,它可能会在几分钟内报告 policy_id: null。用于发现新索引的后台扫描每隔 plugins.index_state_management.coordinator.sweep_period 运行一次(默认为 10 分钟),随后每个受管理索引每隔 plugins.index_state_management.job_interval 评估一次(默认为 5 分钟),并带有抖动。测试策略时,请避免使用分钟级条件。

有关部署步骤,请参阅使用 OpenSearch 安装 Alauda Distributed Tracing。