本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon OpenSearch Service 中执行跨集群搜索
Amazon OpenSearch Service 中的跨集群搜索让您可跨多个相连的域执行查询和聚合。使用多个较小的域而不是单个大型的域通常更有意义,尤其是在运行不同类型的工作负载时。
特定于工作负载的域允许您执行以下任务:
-
通过为特定工作负载选择实例类型来优化每个域。
-
跨工作负载建立故障隔离边界。这意味着,如果某个工作负载发生了故障,故障将包含在该特定域内,不会影响其他工作负载。
-
更轻松地跨域扩展。
跨集群搜索支持 OpenSearch Dashboards,因此您可以跨所有域创建可视化和控制面板。您需要为在域之间传输的搜索结果支付标准的 Amazon 数据传输费用
注意
开源 OpenSearch 还提供了有关跨集群搜索的文档
限制
跨集群搜索有几个重要的限制:
-
不能将 Elasticsearch 域连接到 OpenSearch 域。
-
不能连接到自行管理的 OpenSearch/Elasticsearch 集群。
-
要跨区域连接域,两个域必须位于 Elasticsearch 7.10 或更高版本或者 OpenSearch 上。
-
一个域最多可以有 20 个传出连接。同样,一个域最多可以有 20 个传入连接。换句话说,一个域最多可以连接到 20 个其他域。
-
源域的版本必须与目标域相同或更高。如果您在两个域之间设置了双向连接,并且想要升级其中的一个域或同时升级这两个域,则必须先删除其中的一个连接。
-
不能将自定义字典或 SQL 用于跨集群搜索。
-
不能使用 Amazon CloudFormation 连接域。
-
不能在 M3 和可突增(T2 和 T3)实例上使用跨集群搜索。
跨集群搜索先决条件
在设置跨集群搜索之前,请确保域满足以下要求:
-
两个 OpenSearch 域,或者版本 6.7 或更高版本上的 Elasticsearch 域
-
已启用精细访问控制
-
已启用节点到节点加密
跨集群搜索定价
跨域搜索不收取额外的费用。
设置连接
“源”域指的是发出跨集群搜索请求的域。换句话说,源域是向其发送初始搜索请求的域。
“目标”域是源域查询的域。
跨集群连接是从源域到目标域的单向连接。这意味着目标域无法查询源域。但是,可以在相反的方向上设置另一个连接。
源域创建到目标域的“出站”连接。目标域接收来自源域的“入站”连接请求。
设置连接
-
在域控制面板上,选择域,然后前往连接选项卡。
-
在 Outbound connections(出站连接)部分中,选择 Request(请求)。
-
对于 Connection alias(连接别名),输入您的连接的名称。
-
选择连接您的 Amazon Web Services 账户 和区域中的域还是其他账户或区域中的域。
-
要连接到您的 Amazon Web Services 账户 和区域中的集群,请从下拉菜单中选择域并选择 Request(请求)。
-
要连接到另一个 Amazon Web Services 账户 或区域中的集群,请指定远程域的 ARN,然后选择 Request(请求)。要跨区域连接域,两个域必须运行 Elasticsearch 版本 7.10 或更高版本或者 OpenSearch。
-
-
要在执行集群查询时跳过不可用集群,请选择跳过不可用。此设置可确保即使一个或多个远程集群发生故障,跨集群查询仍能返回部分结果。
-
跨集群搜索首先验证连接请求,以确保满足先决条件。如果发现域不兼容,则连接请求将进入
Validation failed
状态。 -
连接请求验证成功后,将发送到目标域,在此需要进行审批。在此审批进行之前,连接将保持
Pending acceptance
的状态。当连接请求被目标域接受后,状态将更改为Active
,且目标域变为可供查询。-
域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。
-
连接建立之后,在所连接域的节点之间流动的任何流量都将进行加密。如果将 VPC 域连接到非 VPC 域,且非 VPC 域是可接收 Internet 流量的公有终端节点,则域之间的跨集群流量仍然是加密的并且是安全的。
移除连接
移除连接会停止对其索引执行任何跨集群操作。
-
在域控制面板上,转到 Connections(连接)选项卡。
-
选择要移除的域连接,然后选择 Delete,然后确认删除。
您可以在源域或目标域上执行这些步骤以删除连接。删除连接之后,仍会显示 15 天,其状态为 Deleted
。
不能删除具有活动跨集群连接的域。要删除域,请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。
设置安全性和示例演练
-
您将跨集群搜索请求发送到源域。
-
源域根据其域访问策略评估该请求。由于跨集群搜索需要精细访问控制,因此我们建议对源域采用开放访问策略。
{ "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/*" } ] }
-
源域中的精细访问控制将评估请求:
-
该请求是否采用有效的 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" } } ] }
您可以在域控制面板的连接选项卡上找到连接别名。
-
如果要在连接别名为
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 } } ] } }
如果您没有选择在连接设置中跳过不可用集群,搜索的所有目标集群必须可用才能成功运行搜索请求。否则,整个请求将失败——即使只有一个域不可用,也不会返回任何搜索结果。
-
OpenSearch 控制面板
您可以采用与单个域相同的方式可视化来自多个相连接域的数据,但必须使用 connection-alias:index
访问远程索引。因此,索引模式必须与 connection-alias:index
相匹配。