# 跨集群搜索

原文链接 :

[https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=2883720](http://www.apache.wiki/pages/viewpage.action?pageId=2883720)

贡献者 : [张学](/display/~zhangxue)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

注意

此功能处于测试阶段，可能会发生变化。设计和代码不如官方**GA**功能成熟。弹性将采取最大的努力来解决任何问题，但**beta**功能不受**SLA**官方**GA**功能的支持。

**cross cluster search**（跨集群搜索）功能允许任何节点在多个集群之间充当**federated client**（联合客户端）。 与**tribe node**（部落节点）功能相比，进行**cross cluster search**（跨集群搜索）的节点将不会加入远程集群，而是以轻量的方式连接到远程集群，以便执行联合搜索请求。

 **cross cluster search**（跨集群搜索）的工作原理是在集群状态中配置一个远程集群，并且仅连接到远程集群中有限数量的节点。 每个远程集群都由一个名称和一个**seed nodes**（种子节点）的列表引用。 这些**seed nodes**（种子节点）用于发现远程集群中有资格作为**gateway nodes**（网关节点）的节点。 集群中配置了远程集群的每个节点都连接到一个或多个**gateway nodes**（网关节点），并使用它们将搜索请求联合到远程集群。

### 配置跨集群搜索

远程集群可以通过**cluster settings API**（集群设置api）来全局性地指定（可以动态更新），或者在各个节点的**elasticsearch.yml**文件中单独设定

如果通过**elasticsearch.yml**配置远程集群，则只有具有该配置的节点才能连接到远程集群。 换句话说，联合搜索请求必须被专门发送到那些节点。 通过**cluster settings API**（集群设置api）设置的远程集群在集群中的每个节点上都可用。

注意

此功能已添加到**Elasticsearch v5.3**中，并且要求gateway eligible（具有网关资格）的节点在**v5.3**之后。

对于**cross cluster search**（跨集群搜索）节点的**elasticsearch.yml**配置文件只需要列出应连接到远程集群，例如

```
search:
    remote:
        cluster_one: #1
            seeds: 127.0.0.1:9300
        cluster_two: #2
            seeds: 127.0.0.1:9301
```

| 1,2 | **cluster_one**和**cluster_two**是表示与每个集群的连接的任意集群别名。 这些名称随后用于区分本地和远程索引。 |

使用**cluster settings API**（集群设置api）将远程集群添加到集群中的所有节点的示例如下：

```
PUT _cluster/settings
{
  "persistent": {
    "search": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "127.0.0.1:9300"
          ]
        },
        "cluster_two": {
          "seeds": [
            "127.0.0.1:9301"
          ]
        }
      }
    }
  }
}
```

通过将其种子设置为**null**，可以从群集设置中删除远程群集：

```
PUT _cluster/settings
{
  "persistent": {
    "search": {
      "remote": {
        "cluster_one": { #1
          "seeds": null 
        }
      }
    }
  }
}
```

| 1 | **cluster_one**将从集群设置中删除，**cluster_two**保持不变。 |

### 使用跨集群搜索

要搜索远程群集**cluster_one**上的**twitter**索引，**index**（索引）名称必须带有以**:**字符分隔的群集别名的前缀：

```
POST /cluster_one:twitter/tweet/_search
{
    "match_all": {}
}
```

与**tribe**（部落）功能相反，**cross cluster search**（跨群集搜索）还可以搜索具有相同名称的不同群集的索引：

```
 POST /cluster_one:twitter,twitter/tweet/_search
{
    "match_all": {}
}
```

搜索结果的消歧与在请求中消除索引歧义的方法相同。 即使索引名称相同，当结果合并时，这些索引将被视为不同的索引。 从远程索引检索的所有结果将以其远程集群名称作为前缀：

```
  {
  "took" : 89,
  "timed_out" : false,
  "_shards" : {
    "total" : 10,
    "successful" : 10,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "cluster_one:twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "kimchy",
          "postDate" : "2009-11-15T14:12:12",
          "message" : "trying out Elasticsearch"
        }
      },
      {
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "kimchy",
          "postDate" : "2009-11-15T14:12:12",
          "message" : "trying out Elasticsearch"
        }
      }
    ]
  }
}
```

### 跨集群搜索配置

search.remote.connections_per_cluster

要连接到每个远程集群的节点数。 默认值为3。 

`search.remote.initial_connect_timeout`

节点启动时与远程节点建立连接的等待时间。 默认是30秒。 

`search.remote.node.attr`

过滤掉远程集群中有资格作为**gateway node**（网关节点）的节点的节点属性。 例如，节点可以具有节点属性**node.attr.gateway：true**，如果**search.remote.node.attr**设置为**gateway**，只有具有此属性的节点才能将连接到。 

`search.remote.connect`

默认情况下，群集中的任何节点都可以充当 **cross-cluster client**（跨群集客户端）并连接到远程群集。 **search.remote.connect**设置可以设置为**false**（默认为**true**），以防止某些节点连接到远程群集。 **Cross-cluster search**（跨群集搜索）请求必须发送到允许充当跨群集客户端的节点。