Elasticsearch

简介

WARNING

支持的 ES 版本:8.x

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

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

配置

Jaeger repository 中提供了使用 Elasticsearch 后端的 Jaeger 示例配置:config-elasticsearch.yaml。未来,配置文档将根据 schema 自动生成。在此之前,请参阅 config.go(以此为权威来源)。

分片和副本

分片和副本是需要特别注意的配置值,因为这些值在创建索引时确定。本文更详细地介绍了如何选择分片数量以进行优化。

查询时间范围

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

字段默认值描述
max_span_age72h当读取请求未携带明确的时间范围时应用的回溯时间范围,即 trace-ID 查找以及服务和操作列表。仅在 rotation.periodic 下生效,请参阅下面的警告。
max_trace_duration24h单个 trace 的最大预期持续时间,即其最早和最晚 span 之间的时间。读取器会在两侧将此值加入时间范围过滤条件,以便即使 trace 超出请求的搜索窗口,也能找到该 trace 的所有 span。
WARNING

使用基于别名的轮换(rotation.manual_rollover 和 rotation.auto_rollover)时,max_span_age 会被静默忽略。读取别名已解析到与其关联的每个索引,因此 Jaeger 会将配置值替换为 50 年,以避免时间范围过滤条件排除较旧的 trace。仅为使用 rotation.periodic 的索引类型配置 max_span_age,并使其与 jaeger-es-index-cleaner 的保留期保持一致。使用基于别名的轮换时,保留期完全由 ILM policy 或 rollover cron jobs 控制。

例如,按时间划分的索引保留 7 天,且 trace 的持续时间不超过一小时:

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 配置进行选择(分别针对 spans、services、dependencies 和 sampling)。每种索引类型最多只能设置一种策略;未配置 rotation 时,将使用基于时间的索引。

基于时间的索引(默认)手动轮换使用 ILM 轮换(推荐)
轮换策略rotation.periodicrotation.manual_rolloverrotation.auto_rollover
索引创建方式Jaeger 每天或每小时创建索引(例如 jaeger-span-2024-06-18)jaeger-es-rollover init 创建第一个编号索引(例如 jaeger-span-000001);cron 作业创建后续索引jaeger-es-rollover init 创建第一个索引;Elasticsearch 创建后续索引
轮换触发条件自动(新的时间段)jaeger-es-rollover rollover cron 作业Elasticsearch ILM policy
保留清理jaeger-es-index-cleaner cron 作业jaeger-es-rollover lookback(可选)+ jaeger-es-index-cleaner cron 作业Elasticsearch ILM policy
所需外部工具无jaeger-es-rollover init(一次性)+ cron 作业jaeger-es-rollover init(一次性)+ ILM policy

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

字段策略默认值描述
periodic.date_layout基于时间2006-01-02用于索引日期后缀的 Go 时间格式;控制索引粒度(小时级索引使用 2006-01-02-15)
periodic.rollover_frequency基于时间day用于计算读取期间需要扫描哪些索引的粒度(day 或 hour);必须与 date_layout 匹配
manual_rollover.read_alias / manual_rollover.write_alias手动轮换<index-name>-read / <index-name>-write读/写别名名称(例如 jaeger-span-read);默认值与 jaeger-es-rollover init 创建的别名一致
auto_rollover.read_alias / auto_rollover.write_aliasILM<index-name>-read / <index-name>-write同上
auto_rollover.policy_nameILM(空)Jaeger 创建索引模板时嵌入其中的 ILM policy 名称;当模板由 jaeger-es-rollover init 创建时留空

索引轮换

Elasticsearch 轮换 是一种索引管理策略,可优化分配给索引的资源使用。例如,不包含任何数据的索引仍会分配分片;反之,单个索引可能包含明显多于其他索引的数据。对于每种索引类型,可在 indices.<type> 下配置基于别名的轮换策略(推荐使用 rotation.auto_rollover,或使用 rotation.manual_rollover)来启用轮换功能。

WARNING

旧版轮换标志(use_aliases、use_ilm、span_read_alias、span_write_alias、service_read_alias、service_write_alias)自 Jaeger v2.20.0 起将被拒绝,并导致 collector 启动失败。请迁移到下文所述的 indices.<type>.rotation 配置。

通过轮换功能,您可以根据以下一个或多个条件配置何时轮换到新索引:

  • max_age - 索引的最大存留时间。使用时间单位:d、h、m。
  • max_docs - 索引中的最大文档数。
  • max_primary_shard_size - 单个主分片的最大大小。使用字节大小单位 tb、gb、mb。

如需详细了解 Jaeger 中的索引轮换管理,请参阅这篇文章。

初始化

Alauda Build 的 Jaeger v2 集群插件会将 jaeger-es-rollover 镜像地址发布到 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}')

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

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

如果需要初始化归档存储,请添加 -e ARCHIVE=true。

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

  1. 创建索引模板,定义字段映射、分片/副本设置和索引模式(例如 jaeger-span-*)。所有后续轮换索引都会从这些模板继承其架构。
  2. 创建第一个轮换索引(例如 jaeger-span-000001)。后续轮换会递增此编号。
  3. 创建指向初始索引的读别名和写别名(例如 jaeger-span-read 和 jaeger-span-write)。Jaeger 通过读别名执行查询,并通过写别名写入数据。

初始化完成后,可以使用 manual_rollover 轮换策略(indices.<type>.rotation.manual_rollover: {})部署 Jaeger,该策略的默认别名名称与初始化创建的别名一致。使用此策略时,索引轮换和保留清理必须由外部的 jaeger-es-rollover rollover 和 lookback cron 作业驱动,因此仅当 ILM 不可用时使用此策略(例如,Jaeger Elasticsearch 账户缺少 ILM 权限)。否则,建议使用下文所述的基于 ILM 的 auto_rollover 策略。

ILM 支持

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

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

例如:

  • 根据大小(字节数或文档数)或存留时间轮换到新索引,并归档之前的索引
  • 删除过期索引以执行数据保留标准

启用 ILM 支持:

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

    例如,以下策略会在“active”索引超过 1m 时轮换该索引,并删除超过 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

    如果需要初始化归档存储,请添加 -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"

    初始化程序会执行初始化中所述的相同步骤(创建索引模板、种子索引和别名),并增加以下 ILM 特定操作:

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

初始化完成后,为每种索引类型使用 auto_rollover 轮换策略部署 Jaeger。轮换和保留清理随后由 ILM policy 自动管理,无需外部 cron 作业(rollover、lookback 或 index-cleaner):

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

当设置 create_mappings: false 时(索引模板由 es-rollover init 作业创建),请将 rotation.auto_rollover.policy_name 留空;初始化过程已将 ILM policy 引用嵌入索引模板中。