在 Amazon OpenSearch Service 中执行跨集群搜索 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon OpenSearch Service 中执行跨集群搜索

Amazon OpenSearch Service 中的跨集群搜索让您可跨多个相连的域执行查询和聚合。使用多个较小的域而不是单个大型的域通常更有意义,尤其是在运行不同类型的工作负载时。

特定于工作负载的域允许您执行以下任务:

  • 通过为特定工作负载选择实例类型来优化每个域。

  • 跨工作负载建立故障隔离边界。这意味着,如果某个工作负载发生了故障,故障将包含在该特定域内,不会影响其他工作负载。

  • 更轻松地跨域扩展。

跨集群搜索支持 OpenSearch Dashboards,因此您可以跨所有域创建可视化和控制面板。您需要为在域之间传输的搜索结果支付标准的 Amazon 数据传输费用

注意

开源 OpenSearch 还提供了有关跨集群搜索的文档。与托管式 Amazon OpenSearch Service 域相比,开源集群的设置差异很大。特别是在 OpenSearch Service 中,您可以使用 Amazon Web Services Management Console而不是通过 cURL 来配置跨集群连接。此外,除精细访问控制外,托管式服务还使用 Amazon Identity and Access Management(IAM)进行跨集群身份验证。因此,我们建议在为您的域配置跨集群搜索时使用本文档,而不是开源 OpenSearch 文档。

限制

跨集群搜索有几个重要的限制:

  • 不能将 Elasticsearch 域连接到 OpenSearch 域。

  • 不能连接到自行管理的 OpenSearch/Elasticsearch 集群。

  • 要跨区域连接域,两个域必须位于 Elasticsearch 7.10 或更高版本或者 OpenSearch 上。

  • 一个域最多可以有 20 个传出连接。同样,一个域最多可以有 20 个传入连接。换句话说,一个域最多可以连接到 20 个其他域。

  • 源域的版本必须与目标域相同或更高。如果您在两个域之间设置了双向连接,并且想要升级其中的一个域或同时升级这两个域,则必须先删除其中的一个连接。

  • 不能将自定义字典或 SQL 用于跨集群搜索。

  • 不能使用 Amazon CloudFormation 连接域。

  • 不能在 M3 和可突增(T2 和 T3)实例上使用跨集群搜索。

跨集群搜索先决条件

在设置跨集群搜索之前,请确保域满足以下要求:

  • 两个 OpenSearch 域,或者版本 6.7 或更高版本上的 Elasticsearch 域

  • 已启用精细访问控制

  • 已启用节点到节点加密

跨集群搜索定价

跨域搜索不收取额外的费用。

设置连接

“源”域指的是发出跨集群搜索请求的域。换句话说,源域是向其发送初始搜索请求的域。

“目标”域是源域查询的域。

跨集群连接是从源域到目标域的单向连接。这意味着目标域无法查询源域。但是,可以在相反的方向上设置另一个连接。

跨集群搜索授权流

源域创建到目标域的“出站”连接。目标域接收来自源域的“入站”连接请求。

设置连接
  1. 在域控制面板上,选择域,然后前往连接选项卡。

  2. Outbound connections(出站连接)部分中,选择 Request(请求)

  3. 对于 Connection alias(连接别名),输入您的连接的名称。

  4. 选择连接您的 Amazon Web Services 账户 和区域中的域还是其他账户或区域中的域。

    • 要连接到您的 Amazon Web Services 账户 和区域中的集群,请从下拉菜单中选择域并选择 Request(请求)。

    • 要连接到另一个 Amazon Web Services 账户 或区域中的集群,请指定远程域的 ARN,然后选择 Request(请求)。要跨区域连接域,两个域必须运行 Elasticsearch 版本 7.10 或更高版本或者 OpenSearch。

  5. 要在执行集群查询时跳过不可用集群,请选择跳过不可用。此设置可确保即使一个或多个远程集群发生故障,跨集群查询仍能返回部分结果。

  6. 跨集群搜索首先验证连接请求,以确保满足先决条件。如果发现域不兼容,则连接请求将进入 Validation failed 状态。

  7. 连接请求验证成功后,将发送到目标域,在此需要进行审批。在此审批进行之前,连接将保持 Pending acceptance 的状态。当连接请求被目标域接受后,状态将更改为 Active,且目标域变为可供查询。

    • 域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。

连接建立之后,在所连接域的节点之间流动的任何流量都将进行加密。如果将 VPC 域连接到非 VPC 域,且非 VPC 域是可接收 Internet 流量的公有终端节点,则域之间的跨集群流量仍然是加密的并且是安全的。

移除连接

移除连接会停止对其索引执行任何跨集群操作。

  1. 在域控制面板上,转到 Connections(连接)选项卡。

  2. 选择要移除的域连接,然后选择 Delete,然后确认删除。

您可以在源域或目标域上执行这些步骤以删除连接。删除连接之后,仍会显示 15 天,其状态为 Deleted

不能删除具有活动跨集群连接的域。要删除域,请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。

设置安全性和示例演练

  1. 您将跨集群搜索请求发送到源域。

  2. 源域根据其域访问策略评估该请求。由于跨集群搜索需要精细访问控制,因此我们建议对源域采用开放访问策略。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account:domain/src-domain/*" } ] }
    注意

    如果路径中包含远程索引,则必须在域 ARN 中对 URI 进行 URL 编码。例如,使用 arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst%3Aremote_index 而不是 arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst:remote_index

    如果除了精细访问控制,还选择使用限制性访问策略,那么策略必须至少允许访问 es:ESHttpGet

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:region:account:domain/src-domain/*" } ] }
  3. 源域中的精细访问控制将评估请求:

    • 该请求是否采用有效的 IAM 或 HTTP 基本凭证签名?

    • 如果是这样,用户是否有权执行搜索和访问数据?

    如果该请求仅搜索目标域中的数据(例如,dest-alias:dest-index/_search),则只需目标域的权限。

    如果该请求在两个域中搜索数据(例如,source-index,dest-alias:dest-index/_search),则需要两个域的权限。

    在精细访问控制中,除相关索引的标准 readsearch 权限之外,用户还必须拥有 indices:admin/shards/search_shards 权限。

  4. 源域将请求传递到目标域。目标域根据其域访问策略评估该请求。必须包含对目标域的 es:ESCrossClusterGet 权限:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }

    请确保对 /dst-domain,而不是 /dst-domain/* 应用了 es:ESCrossClusterGet 权限。

    但是,此最低策略仅允许跨集群搜索。要执行其他操作,例如,为文档编制索引和执行标准搜索,需要额外的权限。我们建议对目标域采取以下策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account:domain/dst-domain/*" }, { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }
    注意

    默认情况下,对域之间的所有跨集群搜索请求在传输过程中进行加密,作为节点到节点加密的一部分。

  5. 目标域执行搜索,并将结果返回到源域。

  6. 源域将自己的结果(如果有)与目标域的结果相结合,并将它们返回给您。

  7. 我们推荐采用 Postman 来测试请求:

    • 在目标域上,为文档编制索引:

      POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1 { "Dracula": "Bram Stoker" }
    • 要从源域查询此索引,请在查询内包含目标域的连接别名。

      GET https://src-domain.us-east-1.es.amazonaws.com/<connection_alias>:books/_search { ... "hits": [ { "_index": "source-destination:books", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "Dracula": "Bram Stoker" } } ] }

      您可以在域控制面板的连接选项卡上找到连接别名。

    • 如果要在连接别名为 cluster_bdomain-a -> domain-b 与连接别名为 cluster_cdomain-a -> domain-c 之间设置连接,请按以下方式搜索 domain-adomain-bdomain-c

      GET https://src-domain.us-east-1.es.amazonaws.com/local_index,cluster_b:b_index,cluster_c:c_index/_search { "query": { "match": { "user": "domino" } } }

      响应

      { "took": 150, "timed_out": false, "_shards": { "total": 3, "successful": 3, "failed": 0, "skipped": 0 }, "_clusters": { "total": 3, "successful": 3, "skipped": 0 }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "local_index", "_type": "_doc", "_id": "0", "_score": 1, "_source": { "user": "domino", "message": "Lets unite the new mutants", "likes": 0 } }, { "_index": "cluster_b:b_index", "_type": "_doc", "_id": "0", "_score": 2, "_source": { "user": "domino", "message": "I'm different", "likes": 0 } }, { "_index": "cluster_c:c_index", "_type": "_doc", "_id": "0", "_score": 3, "_source": { "user": "domino", "message": "So am I", "likes": 0 } } ] } }

      如果您没有选择在连接设置中跳过不可用集群,搜索的所有目标集群必须可用才能成功运行搜索请求。否则,整个请求将失败——即使只有一个域不可用,也不会返回任何搜索结果。

OpenSearch 控制面板

您可以采用与单个域相同的方式可视化来自多个相连接域的数据,但必须使用 connection-alias:index 访问远程索引。因此,索引模式必须与 connection-alias:index 相匹配。