本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 版或更高版本
-
已启用精细访问控制
-
已启用节点到节点加密
跨集群搜索定价
跨域搜索不收取额外的费用。
设置连接
“源”域是指跨集群搜索请求从 发起的域。换句话说,源域是向其发送初始搜索请求的域。
“目标”域是源域查询的域。
跨集群连接是从源域到目标域的单向连接。这意味着目标域无法查询源域。但是,可以在相反的方向上设置另一个连接。

源域创建到目标域的“出站”连接。目标域接收来自源域的“入站”连接请求。
设置连接
-
在域控制面板上,选择域,然后选择 Cross-cluster search connections (跨集群搜索连接) 选项卡。
-
在 Outbound cluster connections (出站集群连接) 部分中,选择 Connect (连接)。
-
在 Connect clusters (连接集群) 页面上,在 Connection alias (连接别名) 中为连接输入名称。
-
在连接您的 AWS 账户中的域或连接其他账户中的域之间进行选择。
-
要连接到您的 AWS 账户中的域,请从下拉列表中选择要连接的域,然后选择 Submit (提交)。
-
要连接到其他 AWS 账户中的域,请指定远程域的 ARN,然后选择 Submit (提交)。
-
-
跨集群搜索首先验证连接请求,以确保满足先决条件可确保兼容性。如果发现域不兼容,则连接请求将进入“Validation failed (验证失败)”状态。
-
连接请求验证成功后,将发送到目标域,在此需要进行审批。在此审批进行之前,连接将保持“Pending acceptance (等待接受)”的状态。当目标域接受连接请求后,状态将更改为“Active (活动)”,并且目标域将对查询可用。
-
域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。
-
连接建立之后,在所连接域的节点之间流动的任何流量都将进行加密。如果您将 VPC 域连接到非 VPC 域,并且非 VPC 域是可接收来自 Internet 的流量的公有终端节点,则域之间的跨集群流量仍是加密且安全的。
删除连接
删除连接会停止对其索引执行任何跨集群操作。
-
在域控制面板上,选择 Cross-cluster search connections (跨集群搜索连接) 选项卡。
-
选择要删除的域连接,然后选择 Remove (删除)。
-
要确认删除,请在弹出框中选择 Remove (删除)。
您可以在源域或目标域上执行这些步骤以删除连接。删除连接之后,仍会显示 15 天,其状态为“Deleted (已删除)”。
不能删除具有活动跨集群连接的域。要删除域,请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。
设置安全性和示例演练
-
您将跨集群搜索请求发送到源域。
-
源域根据其域访问策略评估该请求。由于跨集群搜索需要精细访问控制,因此我们建议对源域采用开放访问策略。
{ "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/*" } ] }
-
源域中的精细访问控制将评估请求:
-
该请求是否采用有效的 IAM 或 HTTP 基本凭证签名?
-
如果是这样,用户是否有权执行搜索和访问数据?
如果该请求仅搜索目标域中的数据(例如,
dest-alias:dest-index/_search
),则只需目标域的权限。如果该请求在两个域中搜索数据(例如,
source-index,dest-alias:dest-index/_search
),则需要两个域的权限。在精细访问控制中,对于相关索引,除标准
read
或search
权限之外,用户还必须具备indices:admin/shards/search_shards
权限。 -
-
源域将请求传递到目标域。目标域根据其域访问策略评估该请求。必须包含对目标域的
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" } ] }
注意 默认情况下,对域之间的所有跨集群搜索请求在传输过程中进行加密,作为节点到节点加密的一部分。
-
目标域执行搜索,并将结果返回到源域。
-
源域将自己的结果(如果有)与目标域的结果相结合,并将它们返回给您。
-
我们推荐采用 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_b
的domain-a -> domain-b
与连接别名为cluster_c
的domain-a -> domain-c
之间设置连接,请按以下方式搜索domain-a
、domain-b
和domain-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
匹配。