Elasticsearch
简介
支持的 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 时扫描的时间窗口:
使用基于别名的轮换(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 的持续时间不超过一小时:
在 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 时,将使用基于时间的索引。
indices.<type>.rotation 下的相关配置字段如下:
索引轮换
Elasticsearch 轮换 是一种索引管理策略,可优化分配给索引的资源使用。例如,不包含任何数据的索引仍会分配分片;反之,单个索引可能包含明显多于其他索引的数据。对于每种索引类型,可在 indices.<type> 下配置基于别名的轮换策略(推荐使用 rotation.auto_rollover,或使用 rotation.manual_rollover)来启用轮换功能。
旧版轮换标志(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 版本匹配:
以下命令会为轮换部署准备 Elasticsearch:
如果需要初始化归档存储,请添加 -e ARCHIVE=true。
对于每种索引类型(spans、services、dependencies),初始化程序会执行以下步骤:
- 创建索引模板,定义字段映射、分片/副本设置和索引模式(例如
jaeger-span-*)。所有后续轮换索引都会从这些模板继承其架构。 - 创建第一个轮换索引(例如
jaeger-span-000001)。后续轮换会递增此编号。 - 创建指向初始索引的读别名和写别名(例如
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 支持:
-
在 Elasticsearch 中创建名为
jaeger-ilm-policy的 ILM policy。例如,以下策略会在“active”索引超过 1m 时轮换该索引,并删除超过 2m 的索引。
-
使用
ES_USE_ILM=true运行 Elasticsearch 初始化程序:如果需要初始化归档存储,请添加
-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 触发的轮换所必需的。
- 验证 Elasticsearch 中是否存在 ILM policy(
初始化完成后,为每种索引类型使用 auto_rollover 轮换策略部署 Jaeger。轮换和保留清理随后由 ILM policy 自动管理,无需外部 cron 作业(rollover、lookback 或 index-cleaner):
当设置 create_mappings: false 时(索引模板由 es-rollover init 作业创建),请将 rotation.auto_rollover.policy_name 留空;初始化过程已将 ILM policy 引用嵌入索引模板中。