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

传输(transport)

传输网络层用于集群内的节点之间的内部通信。 从一个节点到另一个节点的每个调用都使用传输层(例如,当一个 HTTP GET 请求由一个节点处理,而实际上应该由保存相关数据的另一个节点处理时)。 传输模块亦被用于 Elasticsearch Java API 中的 TransportClient

传输机制本质上是完全异步的,这意味着没有等待响应的阻塞线程。 使用异步通信的好处,首先就是解决了 C10k 问题,也是分散(广播)/聚集操作(如 Elasticsearch 中的搜索)的理想解决方案。

传输设置

内部传输通过 TCP 进行通信。可以使用以下设置对其进行配置:

Setting Description

transport.port

绑定端口的范围,默认为 9300-9400.

transport.publish_port

集群中的其他节点在与此节点通信时应使用的端口。 当集群节点位于代理或防火墙之后,并且 transport.port 不能从外部直接访问时,此功能非常有用。 默认为通过 transport.port分配的实际端口。

transport.bind_host

传输服务要绑定到的主机地址。 默认值为 transport.host (如果设置了) 或者 network.bind_host

transport.publish_host

为集群中要连接的节点发布的主机地址。(原文: The host address to publish for nodes in the cluster to connect to. ) 默认值为 transport.host (如果设置了) 或者 network.publish_host

transport.host

用于设置 transport.bind_hosttransport.publish_host

transport.connect_timeout

启动新连接的连接超时(以时间设置格式)。默认为 30s

transport.compress

设置为 true 以在所有节点之间启用压缩(DEFLATE)。默认为 false

transport.ping_schedule

安排定期的应用程序级 ping 消息,以确保节点之间的传输连接保持活动状态。 在传输客户端中默认为 5s,在其他地方默认为 -1(表示禁用)。 最好正确配置 TCP keep-alives,而不是使用此功能,因为 TCP keep-alives 适用于所有类型的长连接,而不仅仅是传输连接。

它还使用通用 网络设置

传输配置 (transport profiles)

Elasticsearch 允许使用 传输配置文件 绑定到不同接口上的多个端口。请看以下配置示例:

transport.profiles.default.port: 9300-9400
transport.profiles.default.bind_host: 10.0.0.1
transport.profiles.client.port: 9500-9600
transport.profiles.client.bind_host: 192.168.0.1
transport.profiles.dmz.port: 9700-9800
transport.profiles.dmz.bind_host: 172.16.1.2

default配置是特殊的。 如果其他配置没有特别指定,它将用作这些配置文件的备用配置,并且指定了该节点如何与集群中其他节点进行连接。

可以在每个传输配置上配置以下参数,如上例所示:

  • port: 要绑定的端口
  • bind_host: 要绑定的主机名
  • publish_host: 在信息API中发布的主机名
  • tcp.no_delay: 为此 socket 配置 TCP_NO_DELAY(TCP无延迟) 选项
  • tcp.keep_alive: 为此 socket 配置 SO_KEEPALIVE 选项
  • tcp.keep_idle: 为此 socket 配置 TCP_KEEPIDLE 选项,它指定了在开始发送 TCP keepalive探测之前连接必须空闲的时间(秒)。 仅适用于Linux和Mac,并且需要JDK 11或更新版本。 默认为 -1,表示不在 socket 级别设置该选项,而是使用默认的系统配置。
  • tcp.keep_interval: 为此 socket 配置 TCP_KEEPINTVL 选项,它指定了发送 TCP keepalive 探测之间的时间间隔(秒)。 仅适用于Linux和Mac,并且需要JDK 11或更新版本。 默认为 -1,表示不在 socket 级别设置该选项,而是使用默认的系统配置。
  • tcp.keep_count: 为此 socket 配置 TCP_KEEPCNT 选项, 它指定了在断开连接之前可以在连接上发送的未确认 TCP keepalive 探测的数量。 仅适用于Linux和Mac,并且需要JDK 11或更新版本。 默认为 -1,表示不在 socket 级别设置该选项,而是使用默认的系统配置。
  • tcp.reuse_address: 为此 socket 配置 SO_REUSEADDR 选项
  • tcp.send_buffer_size: 配置 socket 的发送缓冲区大小
  • tcp.receive_buffer_size: 配置 socket 的接收缓冲区大小

空闲长连接 (long-lived idle connections)

Elasticsearch 在集群中的每对节点之间打开许多 TCP 长连接,其中一些连接可能会长时间处于空闲状态。 尽管如此,Elasticsearch要求这些连接保持打开状态,如果任何节点间的连接被外部影响(如防火墙)而关闭,它会中断集群的运行。 配置网络以使 Elasticsearch 节点之间保持长时间的空闲连接是非常重要的,例如保留 tcp.keep_alive,并确保 keepalive 间隔小于任何可能导致空闲连接关闭的超时时间;或者,如果无法配置 keepalive,则通过设置 transport.ping_schedule 的方式。

请求压缩 (request compression)

默认情况下,transport.compress 设置为 false,集群节点之间的网络级请求压缩是禁用的。 这个默认值通常对于本地集群通信是有意义的,因为压缩会带来显著的CPU成本,并且本地集群倾向于在节点之间建立快速的网络连接。

transport.compress 设置总是配置本地集群请求压缩,并且是远程集群请求压缩的备用设置。 如果你想以不同于本地请求压缩的方式配置远程请求压缩,可以在每个远程集群的基础上设置它,使用 cluster.remote.${cluster_alias}.transport.compress 设置

响应压缩 (response compression)

压缩设置不为 响应(response) 配置压缩。 如果入站请求被压缩,Elasticsearch 会压缩响应——即使没有启用压缩。 类似地,如果入站请求是未压缩的,那么 Elasticsearch 也不会压缩响应——即使启用了压缩。

传输跟踪 (transport tracer)

传输层有一个专用的跟踪记录器,当它被激活时,会记录传入和传出的请求。 通过将 org.elasticsearch.transport.TransportService.tracer 日志程序的级别设置为 TRACE 可以动态激活日志:

PUT _cluster/settings
{
   "transient" : {
      "logger.org.elasticsearch.transport.TransportService.tracer" : "TRACE"
   }
}

还可以使用一组 包含 和 排除 的通配符模式来控制要跟踪的操作。 默认情况下将跟踪每个请求,但 故障检测的ping请求 除外:

PUT _cluster/settings
{
   "transient" : {
      "transport.tracer.include" : "*",
      "transport.tracer.exclude" : "internal:coordination/fault_detection/*"
   }
}