CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页/开源项目/Jaeger/Elasticsearch
文档目录
BadgerCassandraElasticsearchKafka内存OpenSearch

Jaeger

Elasticsearch

支持的 ES 版本:7.x、8.x Elasticsearch 版本会自动从 root/ping 端点获取。根据此版本,Jaeger 使用兼容的索引映射和 Elasticsearch REST API。版本也可以通过 version: 配置属性显式提供。 Elasticsearch 除了安装和运行 Elasticsearch 之外不需要其他初始化操作。启动运行后,将正确的配置值传递给...

简介

  • 支持的 ES 版本:7.x、8.x

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

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

Elasticsearch 还提供以下来自社区和 Elastic 的官方支持资源:

  • Elastic 提供的 Docker 容器,用于快速启动单节点
  • Elastic 提供的 Helm chart
  • RedHat 提供的 Kubernetes Operator

配置

Jaeger 使用 Elasticsearch 后端的示例配置可在 Jaeger 仓库中找到:config-elasticsearch.yaml。未来配置文档将从 schema 自动生成。在此之前,请参考 config.go 作为权威来源。

分片和副本

分片和副本是需要特别注意的配置值,因为它们在索引创建时就已确定。这篇文章提供了关于如何选择分片数量以进行优化的更多信息。

索引翻转

Elasticsearch 翻转是一种索引管理策略,可以优化分配给索引的资源使用。例如,不包含任何数据的索引仍然会分配分片,相反,单个索引可能包含明显多于其他索引的数据。Jaeger 默认将数据存储在按日创建的索引中,这可能无法最优地利用资源。可以通过 use_aliases: true 配置属性启用翻转功能。

翻转允许您根据以下一个或多个条件配置何时切换到新索引:

  • max_age - 索引的最大存在时间。使用时间单位:d、h、m。
  • max_docs - 索引中的最大文档数。
  • max_size - 主分片的最大估计大小(自 Elasticsearch 6.x 起)。使用字节大小单位 tb、gb、mb。

翻转索引管理策略比使用默认的按日索引更复杂,它需要一个初始化任务来准备存储,以及两个定时任务来管理索引。

要了解更多关于 Jaeger 中翻转索引管理的信息,请参阅这篇文章。

有关自动翻转,请参阅 Elasticsearch ILM 支持。

Info

以下 jaeger-es-rollover 和 jaeger-es-index-cleaner 工具的示例使用 Docker 调用方式展示,但它们也可以作为独立二进制文件在 Jaeger GitHub 发布页面获取。

初始化

以下命令通过创建索引别名、索引和索引模板来准备 Elasticsearch 以进行翻转部署:

docker run -it --rm --net=host \
  jaegertracing/jaeger-es-rollover:latest \
  init http://localhost:9200 # <1>

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

初始化完成后,可以使用 use-aliases: true 部署 Jaeger。

执行翻转

下一步是定期执行翻转 API,该 API 根据提供的条件将写入别名切换到新索引。该命令还会将新索引添加到读取别名中,以使新数据可供搜索。

docker run -it --rm --net=host \
  -e CONDITIONS='{"max_age": "2d"}' \
  jaegertracing/jaeger-es-rollover:latest \
  rollover  http://localhost:9200 # <1>

<1> 如果当前写入索引的存在时间超过 2 天,该命令会将别名切换到新索引。有关更多条件,请参阅 Elasticsearch 文档。

下一步是从读取别名中移除旧索引。这意味着旧数据将不可被搜索。这模拟了默认按日部署中 max_span_age: 配置属性的行为。此步骤是可选的,旧索引也可以在下一步中通过索引清理器直接删除。

docker run -it --rm --net=host \
  -e UNIT=days -e UNIT_COUNT=7 \
  jaegertracing/jaeger-es-rollover:latest \
  lookback http://localhost:9200 # <1>

<1> 从读取别名中移除超过 7 天的索引。

删除旧数据

历史数据可以使用 jaeger-es-index-cleaner 删除,该工具同样适用于按日索引。

docker run -it --rm --net=host \
  -e ROLLOVER=true \
  jaegertracing/jaeger-es-index-cleaner:latest \
  14 http://localhost:9200 # <1>

<1> 删除超过 14 天的索引。

ILM 支持

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

ILM 支持是上述手动翻转 + 回溯 + 索引清理工作流的替代方案。启用 ILM 后,Elasticsearch 会根据配置的策略自动管理翻转和保留。

例如:

  • 按大小(字节或文档数)或时间翻转到新索引,同时归档之前的索引
  • 删除过期索引以执行数据保留标准

要启用 ILM 支持:

  • 在 Elasticsearch 中创建一个名为 jaeger-ilm-policy 的 ILM 策略。

    例如,以下策略将在"活跃"索引超过 1 分钟时执行翻转,并删除超过 2 分钟的索引。

    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
    
  • 使用 ES_USE_ILM=true 运行 Elasticsearch 初始化器:

    docker run -it --rm --net=host\
      -e ES_USE_ILM=true \
      jaegertracing/jaeger-es-rollover:latest \
      init http://localhost:9200 # <1>
    

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

Info

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

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

初始化完成后,使用 use_ilm: true 和 use_aliases: true 部署 Jaeger。

升级

Elasticsearch 定义了通信兼容版本和索引兼容版本。索引兼容性定义了节点可以读取数据的最低版本。例如,Elasticsearch 8 可以读取 Elasticsearch 7 创建的索引,但无法读取 Elasticsearch 6 创建的索引,即使它们使用相同的索引映射。因此,从 Elasticsearch 7 升级到 8 不需要任何数据迁移。但是,从 Elasticsearch 6 升级到 8 必须先通过 Elasticsearch 7,并等待 ES 6.x 创建的索引被删除或显式地重新索引。

有关通信和索引兼容版本的信息,请参阅 Elasticsearch 文档。通常可以从 root/ping REST 端点获取此信息。

重新索引

当从 Elasticsearch 6 升级到 8(通过 Elasticsearch 7)且不想等待 Elasticsearch 6 创建的索引被删除时,可以使用手动重新索引。

  1. 将所有 span 索引重新索引到带有 -1 后缀的新索引:
curl -ivX POST -H "Content-Type: application/json" \
  http://localhost:9200/_reindex -d @reindex.json
{
  "source": {
    "index": "jaeger-span-*"
  },
  "dest": {
    "index": "jaeger-span"
  },
  "script": {
    "lang": "painless",
    "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length())) + '-1'"
  }
}
  1. 删除使用旧映射的索引:

    curl -ivX DELETE -H "Content-Type: application/json" \
      http://localhost:9200/jaeger-span-\*,-\*-1
    
  2. 创建不带 -1 后缀的索引:

    curl -ivX POST -H "Content-Type: application/json" \
      http://localhost:9200/_reindex -d @reindex.json
    {
      "source": {
        "index": "jaeger-span-*"
      },
      "dest": {
        "index": "jaeger-span"
      },
      "script": {
        "lang": "painless",
        "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length() - 2))"
      }
    }
    
  3. 删除带后缀的索引:

    curl -ivX DELETE -H "Content-Type: application/json" \
      http://localhost:9200/jaeger-span-\*-1
    

对其他 Jaeger 索引执行类似的操作。

可能存在更高效的迁移过程。请将您的发现与社区分享。

文章大纲