原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-remote-clusters.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/modules-remote-clusters.html

远程集群 (Remote clusters)

远程集群(remote clusters) 功能使你能够建立与远程集群的单向连接。 跨集群复制跨集群搜索 需要远程集群。

远程集群连接通过配置远程集群并连接到该远程集群中有限数量的节点来工作。 远程集群连接有两种模式:嗅探模式(sniff mode)代理模式(proxy mode)

不同集群之间所需的所有通信都要经过 传输层。 远程集群连接由从协调节点到远程连接的单向连接组成。

嗅探模式(sniff mode)

在嗅探模式中,使用一个名称和一个种子节点列表来创建集群。 注册远程集群时,从其中一个种子节点检索其集群状态,并选择最多三个 网关节点(gateway node) 作为远程集群请求的一部分。 此模式要求本地集群可以访问网关节点的发布地址。

嗅探模式是默认的连接模式。

网关节点选择 (gateway nodes selection)

g网关节点 的选择取决于以下标准:

  • version:远程节点必须与它们注册到的集群兼容。 这受制于与 滚动升级(Rolling upgrades)相似的规则。 任何节点都可以与同一主版本上的任何其他节点通信(例如,7.0 可以与任何 7.x 版本的节点通信)。 只有某个主要版本的最后一个次要版本上的节点才能与下一个主要版本上的节点通信。 注意,在 6.x 系列中,6.8 可以与任何 7.x 节点通信,而 6.7 只能与 7.0 通信。 版本兼容性是对称的,意味着如果 6.7 可以与 7.0 通信,那么 7.0 也可以与 6.7 通信。 下表总结了如上所述的兼容性。

兼容性

5.0→5.5

5.6

6.0→6.6

6.7

6.8

7.0

7.1→7.x

5.0→5.5

Yes

Yes

No

No

No

No

No

5.6

Yes

Yes

Yes

Yes

Yes

No

No

6.0→6.6

No

Yes

Yes

Yes

Yes

No

No

6.7

No

Yes

Yes

Yes

Yes

Yes

No

6.8

No

Yes

Yes

Yes

Yes

Yes

Yes

7.0

No

No

No

Yes

Yes

Yes

Yes

7.1→7.x

No

No

No

No

Yes

Yes

Yes

  • 角色(role):专用主节点永远不会被选中。
  • 属性(attributes): 你可以标记应该选择哪些节点(请参阅所有模式下的远程集群设置),尽管这样标记的节点仍然必须满足上述两个要求。

代理模式 (Proxy mode)

在代理模式下,使用名称和单个代理地址创建集群。 注册远程集群时,会向代理地址打开可配置数量的 socket 连接。 代理需要将这些连接路由到远程集群。 代理模式不要求远程集群节点具有可访问的发布地址。

代理模式不是默认的连接模式,必须进行配置。 与嗅探模式下的 网关节点 类似,远程连接遵循与 滚动升级 相同的版本兼容性规则。

配置远程集群

可以使用 集群设置 来全局配置远程集群,集群设置可以动态更新。 或者,你可以使用 elasticsearch.yml 文件在单个节点上进行本地配置。

如果在 elasticsearch.yml 文件中指定设置,则只有具有这些设置的节点才能连接到远程集群。 换句话说,依赖于远程集群请求的功能必须由这些节点专门驱动。例如:

cluster:
    remote:
        cluster_one: 
            seeds: 127.0.0.1:9300 
            transport.ping_schedule: 30s 
        cluster_two: 
            mode: sniff 
            seeds: 127.0.0.1:9301 
            transport.compress: true 
            skip_unavailable: true 
        cluster_three: 
            mode: proxy 
            proxy_address: 127.0.0.1:9302 

cluster_onecluster_twocluster_three 是代表到每个集群的连接的任意集群别名。 这些名称随后用于区分本地索引和远程索引。

远程集群中种子节点的主机名和传输端口(默认值:9300)。

cluster_one 配置了保持活动的 ping。

配置的连接模式。 默认情况下,它是 sniff,因此该模式对于 cluster_one 隐式的。 但是,它可以按 cluster_two 所示显式配置,并且必须按 cluster_three 所示显式配置为 代理模式

cluster_two 的请求显式启用压缩。

对于 cluster_two,断开连接的远程集群是可选的。

用于连接 cluster_three 的代理端点的地址。

有关可选的传输设置的更多信息,参考 传输

如果使用 集群设置,远程集群在集群中的每个节点上都可用。例如:

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "127.0.0.1:9300"
          ],
          "transport.ping_schedule": "30s"
        },
        "cluster_two": {
          "mode": "sniff",
          "seeds": [
            "127.0.0.1:9301"
          ],
          "transport.compress": true,
          "skip_unavailable": true
        },
        "cluster_three": {
          "mode": "proxy",
          "proxy_address": "127.0.0.1:9302"
        }
      }
    }
  }
}

可以动态更新 压缩 和 ping 时间表设置。 但是,必须在更新设置的请求中重新包含 seedsproxy_address。例如:

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "127.0.0.1:9300"
          ],
          "transport.ping_schedule": "60s"
        },
        "cluster_two": {
          "mode": "sniff",
          "seeds": [
            "127.0.0.1:9301"
          ],
          "transport.compress": false
        },
        "cluster_three": {
          "mode": "proxy",
          "proxy_address": "127.0.0.1:9302",
          "transport.compress": true
        }
      }
    }
  }
}

当 压缩 或 ping 时间表设置更改时,所有现有节点连接必须关闭并重新打开,这可能会导致正在进行的请求失败。

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

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_two": { 
          "mode": null,
          "seeds": null,
          "skip_unavailable": null,
          "transport": {
            "compress": null
          }
        }
      }
    }
  }
}

cluster_two 将从集群设置中删除,而 cluster_onecluster_three保持不变。

所有模式下的远程集群配置 (Remote cluster settings for all modes)

这些设置适用于 嗅探模式代理模式嗅探模式设置代理模式设置 设置如下:

cluster.remote.<cluster_alias>.mode
用于远程集群连接的模式。 支持的模式仅限 sniffproxy
cluster.remote.initial_connect_timeout
节点启动时等待建立远程连接的时间。默认值为 30s
node.remote_cluster_client
默认情况下,集群中的任何节点都可以充当跨集群客户端,并连接到远程集群。 node.remote_cluster_client 设置可以设置为 false (默认为 true),以防止某些节点连接到远程集群。 远程集群请求必须发送到允许充当跨集群客户端的节点。
cluster.remote.<cluster_alias>.skip_unavailable
每个集群布尔值设置,当没有属于某个集群的节点可用且它们是远程集群请求的目标时,允许跳过特定集群。 默认值为 false,这意味着默认情况下所有集群都是强制的,但是通过将此设置设置为 true,可以有选择地将它们设置为可选的。
cluster.remote.<cluster_alias>.transport.ping_schedule
设置发送常规应用程序级 ping 消息的时间间隔,以确保到属于远程集群的节点的传输连接保持活动状态。 如果设置为 -1,则不会向该远程集群发送应用程序级别的 ping 消息。 如果未设置,则根据全局 transport.ping_schedule 设置发送应用程序级别的 ping 消息,默认值为 -1,表示不发送 ping。
cluster.remote.<cluster_alias>.transport.compress
每个集群布尔值设置,使你能够为特定远程集群的请求配置压缩。 此设置仅影响发送到远程集群的请求。 如果入站请求被压缩,Elasticsearch 会压缩响应。 如果未设置,全局 transport.compress 将用作回退设置。

嗅探模式的远程集群设置

cluster.remote.<cluster_alias>.seeds
用于探查远程集群状态的种子节点列表。
cluster.remote.<cluster_alias>.node_connections
该远程集群要连接的网关节点数。默认值为 3
cluster.remote.node.attr
一个节点属性,用于筛选出可作为远程集群中网关节点的节点。 例如,节点可以具有节点属性 node.attr.gateway: true ,这样,如果 cluster.remote.node.attr 设置为 gateway,则只有具有该属性的节点才会连接到。

代理模式下远程集群的配置

cluster.remote.<cluster_alias>.proxy_address
用于所有远程连接的地址。
cluster.remote.<cluster_alias>.proxy_socket_connections
每个远程集群要打开的 socket 连接数。默认值为 18
cluster.remote.<cluster_alias>.server_name
可选的主机名字符串,如果启用了 TLS,则在 TLS 服务器名称指示(TLS SNI, TLS Server Name Indication) 扩展的 server_name 字段中发送。 如果此字段不是 TLS SNI 规范定义的有效主机名,TLS 传输将无法打开远程连接。

检索远程集群信息

可以使用 远程集群信息API 来检索关于已配置的远程集群以及该节点所连接的远程节点的信息。