The remote clusters module enables you to establish uni-directional connections to a remote cluster. This functionality is used in cross-cluster replication and cross-cluster search.
Remote cluster connections work by configuring a remote cluster and connecting only to a limited number of nodes in that remote cluster. Each remote cluster is referenced by a name and a list of seed nodes. When a remote cluster is registered, its cluster state is retrieved from one of the seed nodes and up to three gateway nodes are selected to be connected to as part of remote cluster requests. All the communication required between different clusters goes through the transport layer. Remote cluster connections consist of uni-directional connections from the coordinating node to the selected remote gateway nodes only.
The gateway nodes selection depends on the following criteria:
Compatibility | 5.0→5.5 | 5.6 | 6.0→6.6 | 6.7 | 7.x |
5.0→5.5 | Yes | Yes | No | No | No |
5.6 | Yes | Yes | Yes | Yes | No |
6.0→6.6 | No | Yes | Yes | Yes | No |
6.7 | No | Yes | Yes | Yes | Yes |
7.x | No | No | No | Yes | Yes |
You can configure remote clusters globally by using
cluster settings, which you can update dynamically.
Alternatively, you can configure them locally on individual nodes by using the
elasticsearch.yml
file.
If you specify the settings in elasticsearch.yml
files, only the nodes with
those settings can connect to the remote cluster. In other words, functionality
that relies on remote cluster requests must be driven specifically from those
nodes. For example:
cluster: remote: cluster_one: seeds: 127.0.0.1:9300 transport.ping_schedule: 30s cluster_two: seeds: 127.0.0.1:9301 transport.compress: true skip_unavailable: true
| |
A keep-alive ping is configured for | |
Compression is explicitly enabled for requests to | |
Disconnected remote clusters are optional for |
For more information about the optional transport settings, see Transport.
If you use cluster settings, the remote clusters are available on every node in the cluster. For example:
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_one": { "seeds": [ "127.0.0.1:9300" ], "transport.ping_schedule": "30s" }, "cluster_two": { "seeds": [ "127.0.0.1:9301" ], "transport.compress": true, "skip_unavailable": true }, "cluster_three": { "seeds": [ "127.0.0.1:9302" ] } } } } }
You can dynamically update the compression and ping schedule settings. However, you must re-include seeds in the settings update request. For example:
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_one": { "seeds": [ "127.0.0.1:9300" ], "transport.ping_schedule": "60s" }, "cluster_two": { "seeds": [ "127.0.0.1:9301" ], "transport.compress": false } } } } }
When the compression or ping schedule settings change, all the existing node connections must close and re-open, which can cause in-flight requests to fail.
A remote cluster can be deleted from the cluster settings by setting its seeds and optional settings to null
:
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_two": { "seeds": null, "skip_unavailable": null, "transport": { "compress": null } } } } } }
|
cluster.remote.connections_per_cluster
3
.
cluster.remote.initial_connect_timeout
30s
.
cluster.remote.node.attr
node.attr.gateway: true
such that only nodes with this attribute will be
connected to if cluster.remote.node.attr
is set to gateway
.
cluster.remote.connect
cluster.remote.connect
setting can be set to
false
(defaults to true
) to prevent certain nodes from connecting to
remote clusters. Remote cluster requests must be sent to a node that is
allowed to act as a cross-cluster client.
cluster.remote.${cluster_alias}.skip_unavailable
false
, meaning that all clusters are mandatory
by default, but they can selectively be made optional by setting this setting
to true
.
cluster.remote.${cluster_alias}.transport.ping_schedule
-1
, application-level ping messages to
this remote cluster are not sent. If unset, application-level ping messages
are sent according to the global transport.ping_schedule
setting, which
defaults to -1
meaning that pings are not sent.
cluster.remote.${cluster_alias}.transport.compress
transport.compress
is used as the fallback setting.
cluster.remote.${cluster_alias}.proxy
You can use the remote cluster info API to retrieve information about the configured remote clusters, as well as the remote nodes that the node is connected to.