2017-01-05 10:10:34 -05:00
|
|
|
[[modules-cross-cluster-search]]
|
|
|
|
== Cross cluster search
|
|
|
|
|
|
|
|
The _cross cluster search_ feature allows any node to act as a federated client across
|
|
|
|
multiple clusters. In contrast to the _tribe_ feature, a _cross cluster search_ node won't
|
2017-01-09 12:17:43 -05:00
|
|
|
join the remote cluster, instead it connects to a remote cluster in a light fashion in order to execute
|
2017-01-05 10:10:34 -05:00
|
|
|
federated search requests.
|
|
|
|
|
|
|
|
The _cross cluster search_ feature works by configuring a remote cluster in the cluster state and connects only to a
|
|
|
|
limited number of nodes in the remote cluster. Each remote cluster is referenced by a name and a list of seed nodes.
|
|
|
|
Those seed nodes are used to discover other nodes eligible as so-called _gateway nodes_. Each node in a cluster that
|
2017-01-09 12:17:43 -05:00
|
|
|
has remote clusters configured connects to one or more _gateway nodes_ and uses them to federate search requests to
|
2017-01-05 10:10:34 -05:00
|
|
|
the remote cluster.
|
|
|
|
|
|
|
|
Remote clusters can either be configured as part of the `elasticsearch.yml` file or be dynamically updated via
|
|
|
|
the <<cluster settings API, cluster-update-settings>>. If a remote cluster is configured via `elasticsearch.yml` only
|
2017-01-11 08:52:41 -05:00
|
|
|
the nodes with the configuration set will be connecting to the remote cluster in which case federated search requests
|
2017-01-11 09:10:36 -05:00
|
|
|
will have to be sent specifically to those nodes. Remote clusters set via the
|
2017-01-05 10:10:34 -05:00
|
|
|
<<cluster settings API, cluster-update-settings>> will be available on every node in the cluster.
|
|
|
|
|
|
|
|
The `elasticsearch.yml` config file for a _cross cluster search_ node just needs to list the
|
|
|
|
remote clusters that should be connected to, for instance:
|
|
|
|
|
|
|
|
[source,yaml]
|
|
|
|
--------------------------------
|
|
|
|
search:
|
|
|
|
remote:
|
2017-01-11 06:36:00 -05:00
|
|
|
cluster_one: <1>
|
|
|
|
seeds: 127.0.0.1:9300
|
|
|
|
cluster_two: <1>
|
|
|
|
seeds: 127.0.0.1:9301
|
2017-01-05 10:10:34 -05:00
|
|
|
|
|
|
|
--------------------------------
|
2017-01-11 08:52:41 -05:00
|
|
|
<1> `cluster_one` and `cluster_two` are arbitrary cluster aliases representing the connection to each cluster.
|
|
|
|
These names are subsequently used to distinguish between local and remote indices.
|
2017-01-05 10:10:34 -05:00
|
|
|
|
|
|
|
[float]
|
|
|
|
=== Using cross cluster search
|
|
|
|
|
2017-01-11 08:52:41 -05:00
|
|
|
To search the `twitter` index on remote cluster `cluster_1` the index name must be prefixed with the cluster alias
|
2017-01-05 11:03:12 -05:00
|
|
|
separated by a `:` character:
|
2017-01-05 10:10:34 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2017-01-05 11:03:12 -05:00
|
|
|
POST /cluster_one:twitter/tweet/_search
|
2017-01-05 10:10:34 -05:00
|
|
|
{
|
|
|
|
"match_all": {}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
2017-01-11 08:52:41 -05:00
|
|
|
In contrast to the `tribe` feature cross cluster search can also search indices with the same name on different
|
|
|
|
clusters:
|
2017-01-05 10:10:34 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2017-01-05 11:03:12 -05:00
|
|
|
POST /cluster_one:twitter,twitter/tweet/_search
|
2017-01-05 10:10:34 -05:00
|
|
|
{
|
|
|
|
"match_all": {}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
|
|
|
Search results are disambiguated the same way as the indices are disambiguated in the request. Even if index names are
|
2017-01-11 08:52:41 -05:00
|
|
|
identical these indices will be treated as different indices when results are merged. All results retrieved from a
|
|
|
|
remote index
|
2017-01-09 12:22:11 -05:00
|
|
|
will be prefixed with their remote cluster name:
|
2017-01-05 10:10:34 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"took" : 89,
|
|
|
|
"timed_out" : false,
|
|
|
|
"_shards" : {
|
|
|
|
"total" : 10,
|
|
|
|
"successful" : 10,
|
|
|
|
"failed" : 0
|
|
|
|
},
|
|
|
|
"hits" : {
|
|
|
|
"total" : 2,
|
|
|
|
"max_score" : 1.0,
|
|
|
|
"hits" : [
|
|
|
|
{
|
2017-01-05 11:03:12 -05:00
|
|
|
"_index" : "cluster_one:twitter",
|
2017-01-05 10:10:34 -05:00
|
|
|
"_type" : "tweet",
|
|
|
|
"_id" : "1",
|
|
|
|
"_score" : 1.0,
|
|
|
|
"_source" : {
|
|
|
|
"user" : "kimchy",
|
|
|
|
"postDate" : "2009-11-15T14:12:12",
|
|
|
|
"message" : "trying out Elasticsearch"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
2017-01-05 11:03:12 -05:00
|
|
|
"_index" : "twitter",
|
2017-01-05 10:10:34 -05:00
|
|
|
"_type" : "tweet",
|
|
|
|
"_id" : "1",
|
|
|
|
"_score" : 1.0,
|
|
|
|
"_source" : {
|
|
|
|
"user" : "kimchy",
|
|
|
|
"postDate" : "2009-11-15T14:12:12",
|
|
|
|
"message" : "trying out Elasticsearch"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
|
|
|
|
[float]
|
|
|
|
=== Cross cluster search settings
|
|
|
|
|
|
|
|
* `search.remote.connections_per_cluster` - the number of nodes to connect to per remote cluster. The default is `3`
|
2017-01-11 08:52:41 -05:00
|
|
|
* `search.remote.initial_connect_timeout` - the time to wait for remote connections to be established when the node
|
|
|
|
starts. The default is `30s`.
|
2017-01-17 05:47:29 -05:00
|
|
|
* `search.remote.node.attr` - a node attribute to filter out nodes that are eligible as a gateway node in the
|
2017-01-11 08:52:41 -05:00
|
|
|
remote cluster. For instance a node can have a node attribute `node.attr.gateway: true` such that only nodes with this
|
2017-01-17 05:47:29 -05:00
|
|
|
attribute will be connected to if `search.remote.node.attr` is set to `gateway`
|
2017-01-05 10:10:34 -05:00
|
|
|
|