Amazon Elasticsearch Service 的跨集群搜索 - Amazon Elasticsearch Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Amazon Elasticsearch Service 的跨集群搜索

Amazon Elasticsearch Service 的跨集群搜索让您可跨多个相连的域执行查询和聚合。

使用多个小域而不是单个大域通常更有意义, 尤其是 运行不同类型的工作负荷时。

特定于工作负载的域使您能够:

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

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

  • 更轻松地跨域扩展。

跨集群搜索支持 Kibana,因此您可以跨所有域创建可视化和控制面板。

Limitations

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

  • 您只能对2020年6月3日当天或之后创建的域执行跨集群搜索。

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

  • 不能连接到不同 AWS 区域中的域。

  • 一个域最多可以有 20 个传出连接。同样,一个域最多可以有 20 个传入连接。

  • 域必须共享相同的主要版本,或者是最后一个次要版本和下一个主要版本(例如,6.8 和 7.x 是兼容的)。

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

  • 不能使用 AWS CloudFormation 连接域。

  • 不能在 M3 和 T2 实例上使用跨集群搜索。

跨集群搜索先决条件

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

  • Elasticsearch 6.7 版或更高版本

  • 已启用精细访问控制

  • 已启用节点到节点加密

跨集群搜索定价

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

设置连接

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

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

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


        跨集群搜索授权流

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

设置连接

  1. 在域控制面板上,选择域,然后选择 Cross-cluster search connections (跨集群搜索连接) 选项卡。

  2. Outbound cluster connections (出站集群连接) 部分中,选择 Connect (连接)

  3. Connect clusters (连接集群) 页面上,在 Connection alias (连接别名) 中为连接输入名称。

  4. 在连接您的 AWS 账户中的域或连接其他账户中的域之间进行选择。

    • 要连接到您的 AWS 账户中的域,请从下拉列表中选择要连接的域,然后选择 Submit (提交)

    • 要连接到其他 AWS 账户中的域,请指定远程域的 ARN,然后选择 Submit (提交)

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

  6. 连接请求验证成功后,将发送到目标域,在此需要进行审批。在此审批进行之前,连接将保持“Pending acceptance (等待接受)”的状态。当在目标域接受连接请求时,状态变为“活动”,目标域可用于查询。

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

连接建立之后,在所连接域的节点之间流动的任何流量都将进行加密。如果您将VPC域连接至非VPC域 和 非VPC域是可以从互联网接收流量的公共终点,这些域之间的交叉集群流量仍然加密且安全。

删除连接

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

  1. 在域控制面板上,选择 Cross-cluster search connections (跨集群搜索连接) 选项卡。

  2. 选择要删除的域连接,然后选择 Remove (删除)

  3. 要确认删除,请在弹出框中选择 Remove (删除)

您可以在源域或目标域上执行这些步骤以删除连接。删除连接之后,仍会显示 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/*" } ] }
    注意

    域资源策略按字面评估 URI,因此如果路径中包含远程索引,请使用 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-es-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" } } ] }

      您可以在域控制面板的 Cross-cluster search connections (跨集群搜索连接) 选项卡上找到连接别名。

    • 如果要在连接别名为 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 } } ] } }

      要成功运行,您的搜索请求需要所有目标群集可用。否则,整个申请 失败—即使其中一个域不可用,也不会返回搜索结果。

Kibana

您可以将多个连接域的数据以与单个域相同的方式可视化,但您必须使用 connection-alias:index。因此,您的指数模式必须与 connection-alias:index.