统一你的数据:使用 ES|QL 的跨集群搜索现在已正式发布!

85 阅读9分钟

作者:来自 Elastic Najwa Harif 及 Stas Malyshev

Elasticsearch 带来了大量新功能,帮助你为你的使用场景构建最佳搜索方案。深入了解我们的示例 notebooks,开始免费云试用,或立即在本地机器上尝试 Elastic。


我们很高兴地宣布,基于 ES|QL 的跨集群搜索( CCS )现在已作为 Enterprise 功能正式发布。你现在可以利用 ES|QL 的高级分析能力和简化语法,无缝查询整个 Elasticsearch 集群中的数据。无论你是按地理区域、环境还是业务单元分布集群, ES|QL 的 CCS 功能都能让你通过一条优雅的查询,从所有数据中获取答案。

`

1.  One query to rule them all
2.  Querying with ES|QL across multiple clusters is incredibly intuitive. As with existing cross-cluster search with the _search/ DSL API, simply prefix your index name with the alias of your configured remote cluster. That’s it.

4.  Imagine you want to find the top 10 client IPs with the highest average response time, and your data lives in your local cluster plus two remote clusters: cluster-one and cluster-two. With ES|QL, your query is this simple:

`AI写代码

这条查询可以安全高效地从所有指定集群中收集数据并计算最终结果,无需移动或重新索引任何数据,即可获得统一视图。所有其他跨集群索引模式语法功能也同样支持,例如通配符和排除项,例如: FROM logs-* , cluster-:logs- , -cluster-three:*

远程查询处理的工作方式如下:

  1. 用户将查询发送到本地 Elasticsearch 集群。该查询会被路由到集群中的某个节点,该节点被称为协调节点。该节点负责执行查询、聚合结果并将结果返回给用户。协调节点解析查询,进行验证,并生成查询计划,描述查询的具体执行方式。然后协调节点确定需要联系哪些本地节点和远程集群来执行该查询。
  2. 协调节点随后将查询计划发送到其他本地节点以及远程集群。由于每个远程集群自己管理其节点,协调节点只与远程集群中的一个协调节点通信。这种方式与跨集群 DSL 查询中的 “minimize roundtrips” 模式相同。
  3. 本地节点执行查询计划。需要注意的是,某些命令(如 SORT、 STATS 和 LIMIT)无法完全在远程执行,因为它们需要访问完整数据集。远程节点仅执行部分任务,其余部分将在后续聚合阶段处理。
  4. 本地集群节点将结果返回给本地协调节点,远程节点将结果返回给远程集群的协调节点,远程协调节点在必要时进行预聚合,并将结果转发给本地协调节点。
  5. 本地协调节点执行最终聚合阶段,如 SORT、 STATS、 LIMIT 等命令,这些命令需要完整数据集后才能执行。需要注意的是,由于部分工作可能已在远程完成(例如对每个节点的输出进行排序或统计 STATS 行数),协调节点通常处理的数据量比整个结果集要少。
  6. 所有阶段完成后,协调节点会格式化响应并将其返回给用户。

天生具备弹性

在分布式环境中运行查询需要稳健且可预测的故障处理机制。我们在 ES|QL CCS 中构建了多层弹性模型。

  • 处理不可用的集群和分片:默认情况下,如果部分远程集群或分片不可用, ES|QL CCS 不会让整个查询失败。这由两个设置控制:
    • skip_unavailable: true(默认):这个远程集群设置确保当远程集群无法访问或没有匹配索引时,会被优雅地跳过。

    • allow_partial_results: true(默认):这个查询级别设置确保当某个分片在查询过程中失败(例如在滚动重启期间),查询依然会成功返回所有可用分片的结果。引擎还会自动优先重试失败的分片,最大化完整响应的可能性。

  • 透明的故障检测:当查询返回部分结果时,客户端应用和用户必须知情。查询响应包含用于此目的的元数据(当使用 include_ccs_metadata 查询设置请求时):
    • is_partial 标志被设为 true。

    • _clusters 对象提供每个集群的状态详细信息(成功、跳过或失败),你可以通过程序识别问题来源。

    • 在 Kibana 中,查询检查器 UI 会如下显示这些元数据:

  • 客户端超时管理:为防止长时间运行的查询导致资源耗尽, Kibana 等客户端可以强制超时控制。如果某个 ES|QL 查询超过了 Kibana 配置的超时时间( search:timeout,默认 10 分钟),Kibana 会自动通过调用 stop 命令停止查询,并返回到那时为止已收集的所有结果。这个功能同样适用于使用异步查询的其他客户端。

数据增强 —— 本地与远程

ES|QL 的 ENRICH 命令允许将丰富策略(enrichment policy)中的数据添加到查询结果中。此功能支持跨集群使用,提供三种模式。

默认情况下,查询引擎会根据性能和查询语义自行决定在哪些集群和节点上执行数据合并操作。这要求所有集群上的增强策略包含相同的数据,以确保一致性。示例:

`

1.  FROM logs,cluster-*:logs
2.  | ENRICH hosts ON ip
3.  | WHERE region=="us-aws1"
4.  | SORT by @timestamp
5.  | LIMIT 10

`AI写代码

默认模式会根据查询的性质,在协调节点模式或远程模式之间进行选择。

协调节点模式会让本地协调节点执行 ENRICH 命令,因此远程集群无需维护各自的 enrich 策略。但这可能带来性能开销,因为需要将所有远程数据传输到本地协调节点后才能继续处理。示例:

`

1.  FROM logs,cluster-*:logs
2.  | ENRICH _coordinator:hosts ON ip
3.  | WHERE region=="us-aws1"
4.  | SORT by @timestamp
5.  | LIMIT 10

`AI写代码

在这种情况下,数据流如下所示:

请注意,在协调节点模式中,所有 ENRICH 数据处理及后续操作必须在本地集群的协调节点上执行,因此需要传输更多数据,且无法利用远程集群的处理能力。

而远程模式则让每个远程集群执行 ENRICH 命令。此模式不要求各集群策略数据相同,每个集群可以有自己的策略。适用于每个集群拥有本地化数据的场景,比如不同数据中心使用私有 IP 地址时,IP 到主机名的映射。示例:

`

1.  FROM cluster-*:logs
2.  | ENRICH _remote:hosts ON ip
3.  | WHERE region=="us-aws1"
4.  | SORT by @timestamp
5.  | LIMIT 10

`AI写代码

在这种情况下,数据流如下所示:

请注意,在这种情况下, ENRICH 处理及部分后续处理留在远程端,从而利用了分布式处理优势,并减少了发送到协调节点的数据量。

大规模性能

性能不是事后考虑,而是核心特性。我们优化了协调层,确保跨集群查询快速。基准分析显示,大多数查询中跨集群协调的开销呈对数增长。这意味着即使增加更多集群,每个集群上的本地执行时间仍然是整体查询延迟的主要因素。

我们在集群级别聚合优化上取得了显著成果。对于常见的 SORT 查询(“top-N” 类型分析的关键),该优化可带来约 50% 的加速。通过将更多聚合工作下推到数据集群,我们减少了协调开销,使你能比以往更大规模地扩展分析任务。

以下是基准测试样例,展示了根据远程集群数量(从仅本地到连接 250 个远程集群)不同,查询性能的变化。可以看到,尽管随着集群数增加计算速度有所下降(网络流量开销不可避免),但增长远小于集群数量的线性增长。

监控你的集群

为了帮助你了解跨集群搜索的使用情况,_cluster/stats 数据已扩展,增加了 ES|QL 远程查询监控数据。在数据的 ccs/_esql 部分,你可以找到已执行的跨集群 ES|QL 查询数据、各集群的性能统计、成功和失败的查询数量等信息。示例:

`

1.  "ccs": {
2.      "_esql": {
3.        "total": 4,
4.        "success": 3,
5.        "skipped": 0,
6.        "took": {
7.          "max": 123,
8.          "avg": 441,
9.          "p90": 456
10.        },
11.        "remotes_per_search_max": 1,
12.        "remotes_per_search_avg": 0.25,
13.        "failure_reasons": {
14.          "not_found": 1
15.        },
16.        "features": {},
17.        "clients": {},
18.        "clusters": {
19.          "(local)": {
20.            "total": 4,
21.            "skipped": 0,
22.            "took": {
23.              "max": 123,
24.              "avg": 441,
25.              "p90": 456
26.            }
27.          },
28.          "remote1": {
29.            "total": 4,
30.            "skipped": 0,
31.            "took": {
32.              "max": 789,
33.              "avg": 327,
34.              "p90": 312
35.            }
36.          }
37.        }
38.      }
39.    }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

接下来是什么?

这只是开始。我们正在为 ES|QL CCS 带来更多功能,下一步计划支持跨远程集群的 LOOKUP JOIN —— 允许用户无需创建和维护增强策略即可进行数据增强。

基于 ES|QL 的跨集群搜索现已作为 Enterprise 功能发布。升级到最新版本的 Elasticsearch,统一你的数据,提升你的分析能力。

想了解更多,请查看文档。我们期待看到你用它创造出的成果!

本文中描述的任何功能或特性发布时间及发布与否,均由 Elastic 单方面决定。当前不可用的功能可能不会按时或根本不会发布。

原文:Unify your data: Cross-cluster search with ES|QL is now generally available! - Elasticsearch Labs