🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 跨集群搜索 原文链接 : [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**(跨群集搜索)请求必须发送到允许充当跨群集客户端的节点。