跨集群搜索

原文链接 :

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

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

贡献者 : 张学ApacheCNApache中文网

注意

此功能处于测试阶段,可能会发生变化。设计和代码不如官方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配置文件只需要列出应连接到远程集群,例如

  1. search:
  2. remote:
  3. cluster_one: #1
  4. seeds: 127.0.0.1:9300
  5. cluster_two: #2
  6. seeds: 127.0.0.1:9301

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

使用cluster settings API(集群设置api)将远程集群添加到集群中的所有节点的示例如下:

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "search": {
  5. "remote": {
  6. "cluster_one": {
  7. "seeds": [
  8. "127.0.0.1:9300"
  9. ]
  10. },
  11. "cluster_two": {
  12. "seeds": [
  13. "127.0.0.1:9301"
  14. ]
  15. }
  16. }
  17. }
  18. }
  19. }

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

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "search": {
  5. "remote": {
  6. "cluster_one": { #1
  7. "seeds": null
  8. }
  9. }
  10. }
  11. }
  12. }

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

使用跨集群搜索

要搜索远程群集cluster_one上的twitter索引,index(索引)名称必须带有以:字符分隔的群集别名的前缀:

  1. POST /cluster_one:twitter/tweet/_search
  2. {
  3. "match_all": {}
  4. }

tribe(部落)功能相反,cross cluster search(跨群集搜索)还可以搜索具有相同名称的不同群集的索引:

  1. POST /cluster_one:twitter,twitter/tweet/_search
  2. {
  3. "match_all": {}
  4. }

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

  1. {
  2. "took" : 89,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 10,
  6. "successful" : 10,
  7. "failed" : 0
  8. },
  9. "hits" : {
  10. "total" : 2,
  11. "max_score" : 1.0,
  12. "hits" : [
  13. {
  14. "_index" : "cluster_one:twitter",
  15. "_type" : "tweet",
  16. "_id" : "1",
  17. "_score" : 1.0,
  18. "_source" : {
  19. "user" : "kimchy",
  20. "postDate" : "2009-11-15T14:12:12",
  21. "message" : "trying out Elasticsearch"
  22. }
  23. },
  24. {
  25. "_index" : "twitter",
  26. "_type" : "tweet",
  27. "_id" : "1",
  28. "_score" : 1.0,
  29. "_source" : {
  30. "user" : "kimchy",
  31. "postDate" : "2009-11-15T14:12:12",
  32. "message" : "trying out Elasticsearch"
  33. }
  34. }
  35. ]
  36. }
  37. }

跨集群搜索配置

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(跨群集搜索)请求必须发送到允许充当跨群集客户端的节点。