跨集群使用 ES|QL编辑

ES|QL 的跨集群搜索处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。

使用 ES|QL,您可以在多个集群中执行单个查询。

先决条件编辑

  • 跨集群搜索需要远程集群。要在 Elasticsearch Service 上设置远程集群,请参阅在 Elasticsearch Service 上配置远程集群。如果您在自己的硬件上运行 Elasticsearch,请参阅远程集群

    要确保您的远程集群配置支持跨集群搜索,请参阅支持的跨集群搜索配置

  • 为了获得完整的跨集群搜索功能,本地集群和远程集群必须处于相同的订阅级别
  • 本地协调节点必须具有remote_cluster_client节点角色。
  • 如果您使用嗅探模式,则本地协调节点必须能够连接到远程集群上的种子节点和网关节点。

    我们建议使用能够充当协调节点的网关节点。种子节点可以是这些网关节点的子集。

  • 如果您使用代理模式,则本地协调节点必须能够连接到已配置的proxy_address。此地址上的代理必须能够将连接路由到远程集群上的网关节点和协调节点。
  • 跨集群搜索需要在本地集群和远程集群上使用不同的安全权限。请参阅为跨集群搜索配置权限远程集群

安全模型编辑

Elasticsearch 支持两种用于跨集群搜索 (CCS) 的安全模型

要检查使用哪种安全模型来连接您的集群,请运行GET _remote/info。如果您使用的是 API 密钥身份验证方法,您将在响应中看到"cluster_credentials"键。

TLS 证书身份验证编辑

TLS 证书身份验证使用相互 TLS 保护远程集群。当单个管理员完全控制两个集群时,这可能是首选模型。我们通常建议两个集群中的角色及其权限相同。

有关先决条件和详细的设置说明,请参阅TLS 证书身份验证

API 密钥身份验证编辑

当将 ES|QL 与基于 API 密钥的安全模型一起使用时,此版本不支持ENRICH

以下信息与使用基于 API 密钥的安全模型跨集群使用 ES|QL 有关。您需要按照该页面上的步骤进行完整设置说明。此页面仅包含特定于 ES|QL 的其他信息。

基于 API 密钥的跨集群搜索 (CCS) 可以更精细地控制集群之间允许的操作。当您对不同的集群有不同的管理员并且希望更好地控制谁可以访问哪些数据时,这可能是首选模型。在此模型中,集群管理员必须明确定义授予集群和用户的访问权限。

您需要

将 ES|QL 与基于 API 密钥的安全模型一起使用需要一些额外的权限,这些权限在使用传统的基于查询 DSL 的搜索时可能不需要。以下示例 API 调用创建了一个角色,该角色在使用基于 API 密钥的安全模型时可以使用 ES|QL 查询远程索引。

POST /_security/role/remote1
{
  "cluster": ["cross_cluster_search"], 
  "indices": [
    {
      "names" : [""], 
      "privileges": ["read"]
    }
  ],
  "remote_indices": [ 
    {
      "names": [ "logs-*" ],
      "privileges": [ "read","read_cross_cluster" ], 
      "clusters" : ["my_remote_cluster"] 
    }
  ]
}

本地集群需要cross_cluster_search集群权限。

通常,用户将具有读取本地索引和远程索引的权限。但是,对于仅打算搜索远程集群的角色,本地集群仍然需要read权限。要提供对本地集群的读取访问权限,但不允许读取本地集群中的任何索引,names字段可以是空字符串。

允许读取访问远程集群的索引。配置的跨集群 API 密钥也必须允许读取此索引。

将 ES|QL 与基于 API 密钥的安全模型一起使用时,始终需要read_cross_cluster权限。

这些权限适用的远程集群。必须使用跨集群 API 密钥配置此远程集群,并在查询远程索引之前将其连接到远程集群。使用远程集群信息API 验证连接。

然后,您将需要一个具有您在上面创建的权限的用户或 API 密钥。以下示例 API 调用使用remote1角色创建一个用户。

POST /_security/user/remote_user
{
  "password" : "<PASSWORD>",
  "roles" : [ "remote1" ]
}

请记住,来自本地集群的所有跨集群请求都受跨集群 API 密钥权限的约束,这些权限由远程集群的管理员控制。

远程集群设置编辑

配置安全模型后,您可以添加远程集群。

以下集群更新设置API 请求添加了三个远程集群:cluster_onecluster_twocluster_three

response = client.cluster.put_settings(
  body: {
    persistent: {
      cluster: {
        remote: {
          cluster_one: {
            seeds: [
              '35.238.149.1:9300'
            ],
            skip_unavailable: true
          },
          cluster_two: {
            seeds: [
              '35.238.149.2:9300'
            ],
            skip_unavailable: false
          },
          cluster_three: {
            seeds: [
              '35.238.149.3:9300'
            ]
          }
        }
      }
    }
  }
)
puts response
PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "35.238.149.1:9300"
          ],
          "skip_unavailable": true
        },
        "cluster_two": {
          "seeds": [
            "35.238.149.2:9300"
          ],
          "skip_unavailable": false
        },
        "cluster_three": {  
          "seeds": [
            "35.238.149.3:9300"
          ]
        }
      }
    }
  }
}

由于未在cluster_three上设置skip_unavailable,因此它使用默认值false。有关详细信息,请参阅可选远程集群部分。

跨多个集群查询编辑

FROM命令中,使用<remote_cluster_name>:<target>格式指定远程集群上的数据流和索引。例如,以下 ES|QL 请求查询名为cluster_one的单个远程集群上的my-index-000001索引

FROM cluster_one:my-index-000001
| LIMIT 10

同样,此 ES|QL 请求从三个集群查询my-index-000001索引

  • 本地(“查询”)集群
  • 两个远程集群,cluster_onecluster_two
FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
| LIMIT 10

同样,此 ES|QL 请求从所有远程集群(cluster_onecluster_twocluster_three)查询my-index-000001索引

FROM *:my-index-000001
| LIMIT 10

跨集群充实编辑

跨集群的 ES|QL 中的充实操作类似于本地充实。如果充实策略及其充实索引在所有集群中一致,只需像没有远程集群一样编写充实命令。在此默认模式下,ES|QL 可以在本地集群或远程集群上执行充实命令,旨在最大限度地减少计算或集群间数据传输。确保策略在本地集群和远程集群上都存在一致的数据对于 ES|QL 产生一致的查询结果至关重要。

当将 ES|QL 与基于 API 密钥的安全模型一起使用时,此版本不支持跨集群充实。

在以下示例中,可以使用hosts策略的充实在本地集群或远程集群cluster_one上执行。

FROM my-index-000001,cluster_one:my-index-000001
| ENRICH hosts ON ip
| LIMIT 10

仅针对远程集群的 ES|QL 查询的充实也可以发生在本地集群上。这意味着以下查询要求hosts充实策略也存在于本地集群上。

FROM cluster_one:my-index-000001,cluster_two:my-index-000001
| LIMIT 10
| ENRICH hosts ON ip
使用协调器模式充实编辑

ES|QL 提供了充实_coordinator模式来强制 ES|QL 在本地集群上执行充实命令。当远程集群上不可用充实策略或维护集群间充实索引的一致性具有挑战性时,应使用此模式。

FROM my-index-000001,cluster_one:my-index-000001
| ENRICH _coordinator:hosts ON ip
| SORT host_name
| LIMIT 10

使用_coordinator模式充实通常会增加本地集群上的集群间数据传输和工作负载。

使用远程模式扩充编辑

ES|QL 还提供扩充 _remote 模式,强制 ES|QL 在目标索引所在的每个远程集群上独立执行扩充命令。此模式对于管理每个集群上的不同扩充数据非常有用,例如目标(主)索引包含来自这些主机的日志事件的每个区域的主机的详细信息。

在下面的示例中,hosts 扩充策略需要存在于所有远程集群上:querying 集群(因为包含本地索引)、远程集群 cluster_onecluster_two

FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
| ENRICH _remote:hosts ON ip
| SORT host_name
| LIMIT 10

stats 命令之后不能执行 _remote 扩充。以下示例将导致错误

FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
| STATS COUNT(*) BY ip
| ENRICH _remote:hosts ON ip
| SORT host_name
| LIMIT 10
多个扩充命令编辑

您可以在同一个查询中包含多个具有不同模式的扩充命令。ES|QL 将尝试相应地执行它们。例如,此查询执行两次扩充,首先使用任何集群上的 hosts 策略,然后使用本地集群上的 vendors 策略。

FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
| ENRICH hosts ON ip
| ENRICH _coordinator:vendors ON os
| LIMIT 10

_coordinator 扩充命令之后不能执行 _remote 扩充命令。以下示例将导致错误。

FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
| ENRICH _coordinator:hosts ON ip
| ENRICH _remote:vendors ON os
| LIMIT 10

从 ES|QL 查询中排除集群或索引编辑

要排除整个集群,请在 FROM 命令中使用减号作为集群别名前缀,例如:-my_cluster:*

FROM my-index-000001,cluster*:my-index-000001,-cluster_three:*
| LIMIT 10

要排除特定的远程索引,请在 FROM 命令中使用减号作为索引前缀,例如 my_cluster:-my_index

FROM my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001
| LIMIT 10

可选的远程集群编辑

ES|QL 的跨集群搜索当前不支持 skip_unavailable 设置。因此,如果请求中指定的远程集群不可用或出现故障,则无论设置如何,ES|QL 查询的跨集群搜索都将失败。

我们正在积极努力使 ES|QL 的跨集群搜索行为与其他跨集群搜索 API 保持一致。这包括在响应中提供每个集群的详细执行信息,例如执行时间、选定的目标索引和分片。

升级期间跨集群查询编辑

在本地集群上执行滚动升级时,您仍然可以搜索远程集群。但是,本地协调节点的“升级前”和“升级后”版本必须与远程集群的网关节点兼容。

不支持在升级期间之外的同一集群中运行多个版本的 Elasticsearch。

有关升级的更多信息,请参阅升级 Elasticsearch