OpenSearch
简介
支持的 OpenSearch 版本:3.x
OpenSearch 在各个版本之间保持 API 一致性,并与 Elasticsearch 7.10.2 兼容。OpenSearch 版本会从 root/ping 端点自动获取。Jaeger 根据此版本使用兼容的索引映射和 OpenSearch REST API。也可以通过 version: 配置属性显式提供版本。
除了安装并运行 OpenSearch 外,OpenSearch 不需要其他初始化操作。启动后,将正确的配置值传递给 Jaeger。
对于 OpenSearch,Jaeger 使用与 Elasticsearch 相同的存储实现。大多数配置选项的行为也相同,因此共享的详细信息请参阅 Elasticsearch 文档。
配置
Jaeger 仓库中提供了使用 OpenSearch 后端的示例配置:config-opensearch.yaml。由于 OpenSearch 与 Elasticsearch 共享实现,请将 config.go 作为可用选项的权威来源。
分片和副本
分片和副本是需要特别注意的配置值,因为它们在创建索引时确定。Elasticsearch 的分片和副本指南同样适用于 OpenSearch。
查询时间范围
max_span_age 和 max_trace_duration 的行为与 Elasticsearch 中相同,请参阅查询时间范围。
Alauda Distributed Tracing 在 OpenSearch 上使用基于别名的轮换(rotation.auto_rollover),因此 max_span_age 会被静默替换为 50 年,保留期限完全由 ISM 策略控制。只有 max_trace_duration 值得调整:将其设置为预期的最长 trace,因为默认值 24h 会使每次查询两侧的范围各扩大整整一天。
索引管理策略
Jaeger 在 OpenSearch 上提供与 Elasticsearch 相同的三种轮换策略,通过 rotation 下的 indices.<type> 配置进行选择。有关对比表和字段参考,请参阅索引管理策略。唯一特定于后端的差异是,生命周期管理由 OpenSearch Index State Management(ISM)插件提供,而不是 Elasticsearch ILM。
Alauda Distributed Tracing 为全部四种索引类型配置 rotation.auto_rollover,并由 ISM 策略驱动轮换和删除。
索引轮换
jaeger-es-rollover init 对 OpenSearch 执行与 Elasticsearch 完全相同的准备工作:创建索引模板、每种类型的第一个编号索引(例如 jaeger-span-000001),以及读写别名。有关常规说明和轮换触发条件,请参阅索引轮换。
该工具从 ping 端点检测后端,并切换生命周期相关部分:
jaeger-es-rollover 镜像地址由 Alauda Build of Jaeger v2 集群插件发布到 jaeger-cluster-plugin-manifest ConfigMap 中,因此始终与部署的 Jaeger 版本一致:
ISM 支持
OpenSearch ISM 根据由状态和转换组成的策略自动管理索引。它承担与 Elasticsearch ILM 相同的作用:按索引年龄或大小轮换写入索引,并在索引超过保留期限后将其删除。
Jaeger 从不创建生命周期策略。jaeger-es-rollover init 仅验证名为 ES_ILM_POLICY_NAME 的策略是否存在;如果不存在,则失败并显示 ILM/ISM policy <name> doesn't exist. Please create it and re-run init。请先创建 ISM 策略,再运行初始化程序。
启用 ISM 支持:
-
在 OpenSearch 中创建 ISM 策略,例如命名为
jaeger-ism-policy。description是必需项,并且策略必须包含ism_template部分,因为 OpenSearch 在创建时通过匹配索引名称来附加策略,而不是通过模板设置来附加:WARNING将
ism_template模式限制为带有-0*后缀的编号轮换索引。类似jaeger-span-*的模式也会匹配之后创建的日期后缀索引,例如回滚到rotation.periodic后创建的索引。随后 ISM 会接管这些索引并在其上执行失败,因为这些索引未附加到轮换别名。使用 OpenSearch 安装 Alauda Distributed Tracing 中提供了涵盖全部四种索引类型的完整策略。
-
将
ES_USE_ILM=true和ES_ILM_POLICY_NAME设置为策略名称,然后运行初始化程序。在 OpenSearch 上,这些变量保留其ES_前缀:除了索引轮换中所述的模板、种子索引和别名外,初始化程序还会:
- 通过
_plugins/_ism/policies/端点验证 ISM 策略是否存在。 - 将
index.plugins.index_state_management.rollover_alias嵌入索引模板。 - 在写入别名上设置
is_write_index: true,这是 ISM 执行索引轮换所必需的。
ADAPTIVE_SAMPLING=true还会创建sampling别名。当 Jaeger 配置为sampling索引类型声明轮换策略时,请设置此变量;否则,由于其写入别名不存在,向该索引写入会失败。 - 通过
-
为每种索引类型配置
create_mappings: false和auto_rollover轮换策略,然后部署 Jaeger:将
auto_rollover.policy_name留空。它只会将策略名称嵌入 Jaeger 自行创建的模板,而 OpenSearch 不会读取该设置。WARNING此处必须设置
create_mappings: false,并且没有配置验证会强制执行这一点。使用默认值create_mappings: true时,Jaeger 会在启动时使用相同的名称重新创建索引模板,并删除读别名和 ISM 轮换别名。写入仍会成功,因此部署看起来正常,直到第一次轮换生成一个读别名未覆盖、且 ISM 无法再对其执行轮换的索引:新的 trace 会被存储,但永远不会显示在 Jaeger UI 中。请通过设置create_mappings: false、重新运行jaeger-es-rollover init,并手动修复受影响的索引来恢复。
ISM 管理索引后,轮换和保留将自动执行,不需要 rollover、lookback 或 index-cleaner cron 作业。
更新 ISM 策略
更改运行中部署的保留期限或轮换条件需要执行两个步骤。
-
OpenSearch 会拒绝对现有策略执行
PUT,并返回version_conflict_engine_exception,除非请求携带当前序列号。因此,请先读取策略,然后传回这些值:<seq-no>和<primary-term>是GET _plugins/_ism/policies/jaeger-ism-policy返回的_seq_no和_primary_term值。 -
ISM 会在接管索引时将策略复制到该索引中,因此新的定义只会应用于之后创建的索引。请针对现有索引显式应用新定义,每种索引类型发送一个请求:
将模式限定在单个索引类型上。中间包含通配符(例如
-jaeger-*-0*)也会匹配日期后缀索引,并导致请求报告失败。
_plugins/_ism/explain 最终一致:策略更改后以及创建索引后,它可能会在几分钟内报告 policy_id: null。用于发现新索引的后台扫描每隔 plugins.index_state_management.coordinator.sweep_period 运行一次(默认为 10 分钟),随后每个受管理索引每隔 plugins.index_state_management.job_interval 评估一次(默认为 5 分钟),并带有抖动。测试策略时,请避免使用分钟级条件。
有关部署步骤,请参阅使用 OpenSearch 安装 Alauda Distributed Tracing。