

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

# 在 Amazon OpenSearch 服务中进行跨集群搜索
<a name="cross-cluster-search"></a>

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

特定于工作负载的域允许您执行以下任务：
+ 通过为特定工作负载选择实例类型来优化每个域。
+ 跨工作负载建立故障隔离边界。这意味着，如果某个工作负载发生了故障，故障将包含在该特定域内，不会影响其他工作负载。
+ 更轻松地跨域扩展。

跨集群搜索支持 OpenSearch 仪表板，因此您可以跨所有域创建可视化和仪表板。对于在域名之间[传输的搜索结果，您需要支付标准 AWS 的数据传输费用](https://aws.amazon.com/opensearch-service/pricing/)。

**注意**  
开源 OpenSearch 还有用于跨集群搜索的[文档](https://opensearch.org/docs/latest/search-plugins/cross-cluster-search/)。与托管的 Amazon S OpenSearch ervice 域相比，开源集群的设置差异很大。最值得注意的是，在 S OpenSearch ervice 中，您可以使用 AWS 管理控制台 而不是通过 curl 配置跨集群连接。此外，除了精细的访问控制外，托管服务还使用 AWS Identity and Access Management (IAM) 进行跨集群身份验证。因此，我们建议使用本文档，而不是开源 OpenSearch 文档，为您的域配置跨集群搜索。

**Topics**
+ [

## 限制
](#cross-cluster-search-limitations)
+ [

## 跨集群搜索先决条件
](#cross-cluster-search-pp)
+ [

## 跨集群搜索定价
](#cross-cluster-search-pricing)
+ [

## 设置连接
](#cross-cluster-search-set-up-connection)
+ [

## 移除连接
](#cross-cluster-search-remove-connection)
+ [

## 设置安全性和示例演练
](#cross-cluster-search-walkthrough)
+ [

## OpenSearch 仪表板
](#cross-cluster-search-dashboards)

## 限制
<a name="cross-cluster-search-limitations"></a>

跨集群搜索有几个重要的限制：
+ 您无法将 Elasticsearch 域名连接到某个 OpenSearch 域名。
+ 您无法连接到自行管理的 OpenSearch/Elasticsearch 集群。
+ 要跨区域连接域名，两个域名都必须位于 Elasticsearch 7.10 或更高版本或。 OpenSearch
+ 一个域最多可以有 20 个传出连接。同样，一个域最多可以有 20 个传入连接。换句话说，一个域最多可以连接到 20 个其他域。
+ 源域的版本必须与目标域相同或更高。如果您在两个域之间设置了双向连接，并且想要升级其中的一个域或同时升级这两个域，则必须先删除其中的一个连接。
+ 不能将自定义字典或 SQL 用于跨集群搜索。
+ 您不能使用 CloudFormation 来连接域名。
+ 不能在 M3 和可突增（T2 和 T3）实例上使用跨集群搜索。

## 跨集群搜索先决条件
<a name="cross-cluster-search-pp"></a>

在设置跨集群搜索之前，请确保域满足以下要求：
+ 两个 OpenSearch 域名，或者版本 6.7 或更高版本上的 Elasticsearch 域名
+ 已启用精细访问控制
+ Node-to-node 已启用加密
+ 如果任一域位于 VPC 中，则必须通过 VPC 对等互连或 Transit Gateway 连接这些域，并且安全组必须允许它们之间的流量。

## 跨集群搜索定价
<a name="cross-cluster-search-pricing"></a>

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

## 设置连接
<a name="cross-cluster-search-set-up-connection"></a>

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

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

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

![\[跨集群搜索授权流\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/images/ccs.png)


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

**设置连接**

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

1. 在 **Outbound connections（出站连接）**部分中，选择 **Request（请求）**。

1. 对于 **Connection alias（连接别名）**，输入您的连接的名称。

1. 在连接您 AWS 账户 和地区的域名之间进行选择，也可以选择连接到其他账户或地区的域名。
   + 要连接到您 AWS 账户 和地区的集群，请从下拉菜单中选择该域并选择**请求**。
   + **要连接到其他 AWS 账户 或区域的集群，请选择远程域的 ARN，然后选择请求。**要跨区域连接域名，两个域名都必须运行 Elasticsearch 7.10 或更高版本或。 OpenSearch

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

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

1. 连接请求验证成功后，将发送到目标域，在此需要进行审批。在此审批进行之前，连接将保持 `Pending acceptance` 的状态。当连接请求被目标域接受后，状态将更改为 `Active`，且目标域变为可供查询。
   + 域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。

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

## 移除连接
<a name="cross-cluster-search-remove-connection"></a>

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

1. 在域控制面板上，转到**连接**选项卡。

1. 选择要移除的域连接，然后选择**删除**，然后确认删除。

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

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

## 设置安全性和示例演练
<a name="cross-cluster-search-walkthrough"></a>

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

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "*"
           ]
         },
         "Action": [
           "es:ESHttp*"
         ],
         "Resource": "arn:aws:es:us-east-1:111122223333: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`。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "arn:aws:iam::111122223333:user/test-user"
           ]
         },
         "Action": "es:ESHttpGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/src-domain/*"
       }
     ]
   }
   ```

------

1. 源域中的[精细访问控制](fgac.md)将评估请求：
   + 该请求是否采用有效的 IAM 或 HTTP 基本凭证签名？
   + 如果是这样，用户是否有权执行搜索和访问数据？

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

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

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

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "*"
         },
         "Action": "es:ESCrossClusterGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain"
       }
     ]
   }
   ```

------

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

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "*"
           ]
         },
         "Action": [
           "es:ESHttp*"
         ],
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain/*"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "*"
         },
         "Action": "es:ESCrossClusterGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain"
       }
     ]
   }
   ```

------
**注意**  
默认情况下，作为加密的一部分，域之间的所有跨集群搜索请求都会在传输过程中进行 node-to-node加密。

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

1. 源域将自己的结果（如果有）与目标域的结果相结合，并将它们返回给您。

1. 我们推荐采用 [Postman](https://www.postman.com/) 来测试请求：
   + 在目标域上，为文档编制索引：

     ```
     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": "This is message 1",
               "likes": 0
             }
           },
           {
             "_index": "cluster_b:b_index",
             "_type": "_doc",
             "_id": "0",
             "_score": 2,
             "_source": {
               "user": "domino",
               "message": "This is message 2",
               "likes": 0
             }
           },
           {
             "_index": "cluster_c:c_index",
             "_type": "_doc",
             "_id": "0",
             "_score": 3,
             "_source": {
               "user": "domino",
               "message": "This is message 3",
               "likes": 0
             }
           }
         ]
       }
     }
     ```

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

## OpenSearch 仪表板
<a name="cross-cluster-search-dashboards"></a>

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