乌克兰国旗 我们与我们在乌克兰的朋友和同事同在。要支持乌克兰度过难关,请访问此页面

Elasticsearch

版本  2.6 最新 转到最新的 1.x 版本

简介

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

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

Elasticsearch 除了安装并运行外部链接 - Jaeger 分布式追踪平台之外,无需其他初始化。一旦它运行起来,就将正确的配置值传递给 Jaeger。

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

配置

Jaeger 仓库中提供了 Elasticsearch 后端的示例配置:config-elasticsearch.yaml外部链接 - Jaeger 分布式追踪平台。将来,配置文档将从模式中自动生成。与此同时,请参考 config.go外部链接 - Jaeger 分布式追踪平台 作为权威来源。

分片 (Shards) 和副本 (Replicas)

分片和副本是需要特别注意的配置值,因为它们在索引创建时就已确定。这篇文章外部链接 - Jaeger 分布式追踪平台提供了关于选择最佳分片数量以进行优化的更多信息。

索引滚动 (Index Rollover)

Elasticsearch 滚动外部链接 - Jaeger 分布式追踪平台是一种索引管理策略,用于优化分配给索引的资源使用。例如,不包含任何数据的索引仍会分配分片,反之,一个索引可能包含比其他索引多得多的数据。Jaeger 默认将数据存储在每日索引中,这可能无法最佳地利用资源。可以通过 use_aliases: true 配置属性启用滚动功能。

滚动允许您根据以下一个或多个标准配置何时滚动到新索引:

滚动索引管理策略比使用默认的每日索引更复杂,它需要一个初始化作业来准备存储,以及两个 cron 作业来管理索引。

要了解更多关于 Jaeger 中的滚动索引管理,请参考这篇文章外部链接 - Jaeger 分布式追踪平台

关于自动滚动,请参考Elasticsearch ILM 支持

初始化

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

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

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

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

滚动 (Roll over)

下一步是定期执行滚动 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 文档外部链接 - Jaeger 分布式追踪平台

下一步是从读取别名中移除旧索引。这意味着旧数据将无法用于搜索。这模拟了默认的每日索引部署中使用的 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外部链接 - Jaeger 分布式追踪平台 根据性能、弹性和保留要求自动管理索引。

例如:

  • 按大小(字节或文档数量)或年龄将索引滚动到新索引,并归档旧索引
  • 删除过时的索引以强制执行数据保留标准

要启用 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
    
  • 运行 elasticsearch 初始化程序,并带上 ES_USE_ILM=true 参数

    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

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

    “Elasticsearch 中不存在 ILM 策略 jaeger-ilm-policy。请创建它并重新运行初始化程序”

    初始化后,使用 use_ilm: trueuse_aliases: true 部署 Jaeger。

升级

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

请参考 Elasticsearch 的文档外部链接 - Jaeger 分布式追踪平台,了解线协议兼容版本和索引兼容版本。通常,此信息可以从 root/ping REST 端点获取。

重新索引 (Reindex)

从 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 索引执行类似的命令。

可能存在更有效的迁移过程。请将任何发现分享给社区。