Elasticsearch

简介

WARNING

支持的 ES 版本:8.x

Elasticsearch 版本会自动从 root/ping 端点获取。基于该版本,Jaeger 会使用兼容的索引映射和 Elasticsearch REST API。也可以通过 version: 配置属性显式提供该版本。

除了安装并运行 Elasticsearch 之外,Elasticsearch 不需要其他初始化步骤。一旦它运行起来,请将正确的配置值传递给 Jaeger。

配置

Jaeger 中提供了一个使用 Elasticsearch 后端的示例配置,位于 Jaeger 仓库中:config-elasticsearch.yaml。未来配置文档将根据 schema 自动生成。与此同时,请参考 config.go 作为权威来源。

分片和副本

分片和副本是需要特别关注的几个配置值,因为它们是在索引创建时决定的。这篇文章 更详细地介绍了如何选择合适数量的分片以进行优化。

查询时间范围

有两个选项控制查询服务在读取 span 时扫描的时间窗口:

FieldDefaultDescription
max_span_age72h当读取请求未携带显式时间范围时应用的回溯时间,即 trace-ID 查询以及 service 和 operation 列表。仅在 rotation.periodic 下生效,请参见下面的警告。
max_trace_duration24h单个 trace 的最大预期持续时间,即其最早和最晚 span 之间的时间。读取器会在时间范围过滤条件的两侧都按该值扩展,这样即使 trace 跨越了请求的搜索窗口,也能找到该 trace 的所有 span。
WARNING

在基于 alias 的轮转(rotation.manual_rolloverrotation.auto_rollover)中,max_span_age 会被静默忽略。读取 alias 已经会解析到其关联的所有索引,因此 Jaeger 会将配置值替换为 50 年,以防时间范围过滤条件排除旧 trace。请仅针对使用 rotation.periodic 的索引类型配置 max_span_age,并使其与 jaeger-es-index-cleaner 的保留期保持一致。对于基于 alias 的轮转,保留策略完全由 ILM policy 或 rollover cron job 决定。

例如,对于保留 7 天、且 trace 不超过 1 小时的基于时间的索引:

max_span_age: 168h
max_trace_duration: 1h
WARNING

在 Jaeger v2.20.0 之前,时间范围补偿被硬编码为 ±1h。自 v2.20.0 起,它可通过 max_trace_duration 进行配置,默认值为 ±24h。这可以更可靠地找到 span 跨越索引边界的 trace,但也会扩大每次查询的范围。对于基于时间的索引(rotation.periodic),请求范围两侧都会额外扫描一个索引,从而增加查询成本。如果你的 trace 生命周期较短,请相应降低 max_trace_duration

索引管理策略

Jaeger 支持三种索引管理策略,通过 indices.<type> 下的 rotation 配置进行选择(适用于 spansservicesdependenciessampling)。每种索引类型最多只能设置一种策略;当未配置 rotation 时,将使用基于时间的索引。

基于时间的索引(默认)手动 rollover基于 ILM 的 rollover(推荐)
Rotation strategyrotation.periodicrotation.manual_rolloverrotation.auto_rollover
索引创建方式Jaeger 创建按天或按小时的索引(例如 jaeger-span-2024-06-18jaeger-es-rollover init 创建第一个带编号的索引(例如 jaeger-span-000001);后续索引由 cron job 创建jaeger-es-rollover init 创建第一个索引;后续索引由 Elasticsearch 创建
Rollover 触发条件自动(进入新的时间周期)jaeger-es-rollover rollover cron jobElasticsearch ILM policy
保留清理jaeger-es-index-cleaner cron jobjaeger-es-rollover lookback(可选)+ jaeger-es-index-cleaner cron jobsElasticsearch ILM policy
是否需要外部工具jaeger-es-rollover init(一次性)+ cron jobsjaeger-es-rollover init(一次性)+ ILM policy

indices.<type>.rotation 下相关的配置字段如下:

FieldStrategyDefaultDescription
periodic.date_layout基于时间2006-01-02索引日期后缀的 Go time 格式;控制索引粒度(按小时索引时为 2006-01-02-15
periodic.rollover_frequency基于时间day用于计算读取时应扫描哪些索引的粒度(dayhour);必须与 date_layout 一致
manual_rollover.read_alias / manual_rollover.write_alias手动 rollover<index-name>-read / <index-name>-write读/写 alias 名称(例如 jaeger-span-read);默认值与 jaeger-es-rollover init 创建的 alias 一致
auto_rollover.read_alias / auto_rollover.write_aliasILM<index-name>-read / <index-name>-write同上
auto_rollover.policy_nameILM(empty)当 Jaeger 创建索引模板时嵌入其中的 ILM policy 名称;如果模板由 jaeger-es-rollover init 创建,则保持为空

索引 Rollover

Elasticsearch rollover 是一种索引管理策略,可优化分配给索引的资源使用。例如,不包含任何数据的索引仍然会占用分片;反过来,某个单一索引也可能包含远多于其他索引的数据。可以通过在 indices.<type> 下为每种索引类型配置基于 alias 的轮转策略(推荐使用 rotation.auto_rollover,或使用 rotation.manual_rollover)来启用 rollover 功能。

WARNING

自 Jaeger v2.20.0 起,旧版轮转标志(use_aliasesuse_ilmspan_read_aliasspan_write_aliasservice_read_aliasservice_write_alias)已被拒绝使用,并会导致 collector 在启动时失败。请迁移到下面描述的 indices.<type>.rotation 配置。

通过 rollover,你可以根据以下一个或多个条件配置何时切换到新的索引:

  • max_age - 索引的最大年龄。它使用 time unitsdhm
  • max_docs - 索引中的最大文档数。
  • max_primary_shard_size - 单个主分片的最大大小。它使用 byte size units tbgbmb

要了解更多关于 Jaeger 中 rollover 索引管理的信息,请参阅这篇 article

初始化

jaeger-es-rollover 镜像地址由 Alauda Build of Jaeger v2 cluster plugin 发布在 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}')

以下命令会为 rollover 部署准备 Elasticsearch:

nerdctl run -it --rm --net=host \
  ${JAEGER_ES_ROLLOVER_IMAGE} \
  init http://localhost:9200

如果你需要初始化 archive storage,请添加 -e ARCHIVE=true

初始化器会针对每种索引类型(spans、services、dependencies)执行以下步骤:

  1. 创建索引模板,定义字段映射、分片/副本设置以及索引模式(例如 jaeger-span-*)。所有未来的 rollover 索引都会继承这些模板中的 schema。
  2. 创建第一个 rollover 索引(例如 jaeger-span-000001)。后续 rollover 会递增该编号。
  3. 创建读和写 alias(例如 jaeger-span-readjaeger-span-write)并指向初始索引。Jaeger 通过读 alias 查询,通过写 alias 写入。

初始化完成后,可以使用 manual_rollover 轮转策略部署 Jaeger(indices.<type>.rotation.manual_rollover: {}),其默认 alias 名称与初始化时创建的 alias 匹配。使用该策略时,索引 rollover 和保留必须由外部的 jaeger-es-rollover rolloverlookback cron job 驱动,因此仅在 ILM 不可用时使用它(例如 Jaeger 的 Elasticsearch 账号缺少 ILM 权限时)。否则,应优先使用下面描述的基于 ILM 的 auto_rollover 策略。

ILM 支持

Elasticsearch ILM 会根据性能、弹性和保留要求自动管理索引。

ILM 支持是对手动 rollover + lookback + index-cleaner 工作流的替代方案。启用 ILM 后,Elasticsearch 会根据配置的 policy 自动管理 rollover 和保留。

例如:

  • 根据大小(字节数或文档数)或年龄 rollover 到新索引,并归档之前的索引
  • 删除过期索引以满足数据保留标准

要启用 ILM 支持

  1. 在 Elasticsearch 中创建名为 jaeger-ilm-policy 的 ILM policy。

    例如,下面的 policy 会在“active”索引超过 1m 时执行 rollover,并删除超过 2m 的索引。

    curl -X PUT \
      http://localhost:9200/_ilm/policy/jaeger-ilm-policy \
      -H 'Content-Type: application/json; charset=utf-8' \
      --data-binary @- << EOF
    {
      "policy": {
        "phases": {
          "hot": {
            "min_age": "0ms",
            "actions": {
              "rollover": {
                "max_age": "1m"
              },
              "set_priority": {
                "priority": 100
              }
            }
          },
          "delete": {
            "min_age": "2m",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    EOF
  2. 使用 ES_USE_ILM=true 运行 Elasticsearch 初始化器:

    nerdctl run -it --rm --net=host \
      -e ES_USE_ILM=true \
      ${JAEGER_ES_ROLLOVER_IMAGE} \
      init http://localhost:9200

    如果你需要初始化 archive storage,请添加 -e ARCHIVE=true

    WARNING

    在启用 ILM 支持进行初始化时,请确保已事先在 Elasticsearch 中创建名为 jaeger-ilm-policy 的 ILM policy(参见上一步),否则会显示以下错误信息:

    "ILM policy jaeger-ilm-policy doesn't exist in Elasticsearch. Please create it and rerun init"

    初始化器会执行与 初始化 中相同的步骤(创建索引模板、种子索引和 alias),并额外执行以下 ILM 相关操作:

    • 验证 Elasticsearch 中是否存在 ILM policy(jaeger-ilm-policy)。
    • 在索引模板中嵌入 index.lifecycle.nameindex.lifecycle.rollover_alias,以便 Elasticsearch 自动将 ILM policy 应用于每个新的 rollover 索引。
    • 在写 alias 上设置 is_write_index: true,这是 Elasticsearch 执行 ILM 触发的 rollover 所必需的。

初始化完成后,针对每种索引类型使用 auto_rollover 轮转策略部署 Jaeger。此后,rollover 和保留将由 ILM policy 自动管理,不再需要任何外部 cron job(rolloverlookbackindex-cleaner):

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

当设置了 create_mappings: false(索引模板由 es-rollover init job 创建)时,请将 rotation.auto_rollover.policy_name 保持为空;ILM policy 引用已经在初始化过程中嵌入到了索引模板中。