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 索引滚动(rollover)是一种索引管理策略,可以优化分配给索引的资源使用。例如,不包含任何数据的索引仍然会分配分片,反之,单个索引可能包含比其他索引多得多的数据。Jaeger 默认将数据存储在每日索引中,这可能无法最佳地利用资源。可以通过配置属性 use_aliases: true
启用索引滚动功能。
索引滚动允许您根据以下一个或多个标准配置何时滚动到新索引
max_age
- 索引的最大年龄。它使用时间单位 :d
、h
、m
。max_docs
- 索引中的最大文档数。max_size
- 主分片的最大估算大小(自 Elasticsearch 6.x 起)。它使用字节大小单位 :tb
、gb
、mb
。
索引滚动管理策略比使用默认的每日索引更复杂,它需要一个初始化作业来准备存储,以及两个 cron 作业来管理索引。
要了解更多关于 Jaeger 中索引滚动管理的信息,请参考这篇文章 。
有关自动索引滚动,请参考Elasticsearch ILM 支持。
初始化
以下命令通过创建索引别名、索引和索引模板来准备 Elasticsearch 进行索引滚动部署
docker run -it --rm --net=host \
jaegertracing/jaeger-es-rollover:latest \
init https://:9200 # <1>
如果需要初始化归档存储,请添加 -e ARCHIVE=true
。
初始化后,Jaeger 可以使用 use-aliases: true
进行部署。
滚动
下一步是定期执行 rollover API,它根据提供的条件将写入别名滚动到一个新索引。该命令还会将新索引添加到读取别名中,以使新数据可供搜索。
docker run -it --rm --net=host \
-e CONDITIONS='{"max_age": "2d"}' \
jaegertracing/jaeger-es-rollover:latest \
rollover https://: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 https://:9200 # <1>
<1> 从读取别名中移除超过 7 天的索引。
移除旧数据
历史数据可以通过 jaeger-es-index-cleaner
移除,该工具也用于每日索引。
docker run -it --rm --net=host \
-e ROLLOVER=true \
jaegertracing/jaeger-es-index-cleaner:latest \
14 https://:9200 # <1>
<1> 移除超过 14 天的索引。
ILM 支持
Elasticsearch ILM 根据性能、弹性与保留要求自动管理索引。
例如
- 按大小(字节或文档数)或年龄滚动到新索引,并归档旧索引
- 删除过期索引以强制执行数据保留标准
要启用 ILM 支持
在 Elasticsearch 中创建一个名为
jaeger-ilm-policy
的 ILM 策略。例如,以下策略将在“活动”索引超过 1 分钟时进行滚动,并删除超过 2 分钟的索引。
curl -X PUT \ https://: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 https://:9200 # <1>
<1> 如果需要初始化归档存储,请添加
-e ARCHIVE=true
。在使用 ILM 支持进行初始化时,请确保事先在 Elasticsearch 中创建了一个名为
jaeger-ilm-policy
的 ILM 策略(请参见上一步),否则将显示以下错误消息“Elasticsearch 中不存在 ILM 策略 jaeger-ilm-policy。请创建它并重新运行 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 创建的索引被移除。
- 将所有 span 索引重新索引到带有后缀
-1
的新索引。
curl -ivX POST -H "Content-Type: application/json" \
https://: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'"
}
}
删除带有旧映射的索引
curl -ivX DELETE -H "Content-Type: application/json" \ https://:9200/jaeger-span-\*,-\*-1
创建不带
-1
后缀的索引curl -ivX POST -H "Content-Type: application/json" \ https://: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))" } }
移除带后缀的索引
curl -ivX DELETE -H "Content-Type: application/json" \ https://:9200/jaeger-span-\*-1
对其他 Jaeger 索引类似地运行这些命令。
可能存在更有效的迁移过程。请与社区分享任何发现。