Elasticsearch
简介
支持的 ES 版本:8.x
Elasticsearch 版本会自动从 root/ping 端点获取。基于该版本,Jaeger 会使用兼容的索引映射和 Elasticsearch REST API。也可以通过 version: 配置属性显式提供该版本。
除了安装并运行 Elasticsearch 之外,Elasticsearch 不需要其他初始化步骤。一旦它运行起来,请将正确的配置值传递给 Jaeger。
配置
Jaeger 中提供了一个使用 Elasticsearch 后端的示例配置,位于 Jaeger 仓库中:config-elasticsearch.yaml。未来配置文档将根据 schema 自动生成。与此同时,请参考 config.go 作为权威来源。
分片和副本
分片和副本是需要特别关注的几个配置值,因为它们是在索引创建时决定的。这篇文章 更详细地介绍了如何选择合适数量的分片以进行优化。
查询时间范围
有两个选项控制查询服务在读取 span 时扫描的时间窗口:
在基于 alias 的轮转(rotation.manual_rollover 和 rotation.auto_rollover)中,max_span_age 会被静默忽略。读取 alias 已经会解析到其关联的所有索引,因此 Jaeger 会将配置值替换为 50 年,以防时间范围过滤条件排除旧 trace。请仅针对使用 rotation.periodic 的索引类型配置 max_span_age,并使其与 jaeger-es-index-cleaner 的保留期保持一致。对于基于 alias 的轮转,保留策略完全由 ILM policy 或 rollover cron job 决定。
例如,对于保留 7 天、且 trace 不超过 1 小时的基于时间的索引:
在 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 下相关的配置字段如下:
索引 Rollover
Elasticsearch rollover 是一种索引管理策略,可优化分配给索引的资源使用。例如,不包含任何数据的索引仍然会占用分片;反过来,某个单一索引也可能包含远多于其他索引的数据。可以通过在 indices.<type> 下为每种索引类型配置基于 alias 的轮转策略(推荐使用 rotation.auto_rollover,或使用 rotation.manual_rollover)来启用 rollover 功能。
自 Jaeger v2.20.0 起,旧版轮转标志(use_aliases、use_ilm、span_read_alias、span_write_alias、service_read_alias、service_write_alias)已被拒绝使用,并会导致 collector 在启动时失败。请迁移到下面描述的 indices.<type>.rotation 配置。
通过 rollover,你可以根据以下一个或多个条件配置何时切换到新的索引:
max_age- 索引的最大年龄。它使用 time units:d、h、m。max_docs- 索引中的最大文档数。max_primary_shard_size- 单个主分片的最大大小。它使用 byte size unitstb、gb、mb。
要了解更多关于 Jaeger 中 rollover 索引管理的信息,请参阅这篇 article。
初始化
jaeger-es-rollover 镜像地址由 Alauda Build of Jaeger v2 cluster plugin 发布在 jaeger-cluster-plugin-manifest ConfigMap 中,因此它始终与已部署的 Jaeger 版本保持一致:
以下命令会为 rollover 部署准备 Elasticsearch:
如果你需要初始化 archive storage,请添加 -e ARCHIVE=true。
初始化器会针对每种索引类型(spans、services、dependencies)执行以下步骤:
- 创建索引模板,定义字段映射、分片/副本设置以及索引模式(例如
jaeger-span-*)。所有未来的 rollover 索引都会继承这些模板中的 schema。 - 创建第一个 rollover 索引(例如
jaeger-span-000001)。后续 rollover 会递增该编号。 - 创建读和写 alias(例如
jaeger-span-read和jaeger-span-write)并指向初始索引。Jaeger 通过读 alias 查询,通过写 alias 写入。
初始化完成后,可以使用 manual_rollover 轮转策略部署 Jaeger(indices.<type>.rotation.manual_rollover: {}),其默认 alias 名称与初始化时创建的 alias 匹配。使用该策略时,索引 rollover 和保留必须由外部的 jaeger-es-rollover rollover 和 lookback cron job 驱动,因此仅在 ILM 不可用时使用它(例如 Jaeger 的 Elasticsearch 账号缺少 ILM 权限时)。否则,应优先使用下面描述的基于 ILM 的 auto_rollover 策略。
ILM 支持
Elasticsearch ILM 会根据性能、弹性和保留要求自动管理索引。
ILM 支持是对手动 rollover + lookback + index-cleaner 工作流的替代方案。启用 ILM 后,Elasticsearch 会根据配置的 policy 自动管理 rollover 和保留。
例如:
- 根据大小(字节数或文档数)或年龄 rollover 到新索引,并归档之前的索引
- 删除过期索引以满足数据保留标准
要启用 ILM 支持:
-
在 Elasticsearch 中创建名为
jaeger-ilm-policy的 ILM policy。例如,下面的 policy 会在“active”索引超过 1m 时执行 rollover,并删除超过 2m 的索引。
-
使用
ES_USE_ILM=true运行 Elasticsearch 初始化器:如果你需要初始化 archive storage,请添加
-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"
初始化器会执行与 初始化 中相同的步骤(创建索引模板、种子索引和 alias),并额外执行以下 ILM 相关操作:
- 验证 Elasticsearch 中是否存在 ILM policy(
jaeger-ilm-policy)。 - 在索引模板中嵌入
index.lifecycle.name和index.lifecycle.rollover_alias,以便 Elasticsearch 自动将 ILM policy 应用于每个新的 rollover 索引。 - 在写 alias 上设置
is_write_index: true,这是 Elasticsearch 执行 ILM 触发的 rollover 所必需的。
- 验证 Elasticsearch 中是否存在 ILM policy(
初始化完成后,针对每种索引类型使用 auto_rollover 轮转策略部署 Jaeger。此后,rollover 和保留将由 ILM policy 自动管理,不再需要任何外部 cron job(rollover、lookback 或 index-cleaner):
当设置了 create_mappings: false(索引模板由 es-rollover init job 创建)时,请将 rotation.auto_rollover.policy_name 保持为空;ILM policy 引用已经在初始化过程中嵌入到了索引模板中。