本地英文版地址: ../en/modules-transport.html
传输网络层用于集群内的节点之间的内部通信。
从一个节点到另一个节点的每个调用都使用传输层(例如,当一个 HTTP GET 请求由一个节点处理,而实际上应该由保存相关数据的另一个节点处理时)。
传输模块亦被用于 Elasticsearch Java API 中的 TransportClient
。
传输机制本质上是完全异步的,这意味着没有等待响应的阻塞线程。 使用异步通信的好处,首先就是解决了 C10k 问题,也是分散(广播)/聚集操作(如 Elasticsearch 中的搜索)的理想解决方案。
内部传输通过 TCP 进行通信。可以使用以下设置对其进行配置:
Setting | Description |
---|---|
|
绑定端口的范围,默认为 |
|
集群中的其他节点在与此节点通信时应使用的端口。
当集群节点位于代理或防火墙之后,并且 |
|
传输服务要绑定到的主机地址。
默认值为 |
|
为集群中要连接的节点发布的主机地址。(原文: The host address to publish for nodes in the cluster to connect to. )
默认值为 |
|
用于设置 |
|
启动新连接的连接超时(以时间设置格式)。默认为 |
|
设置为 |
|
安排定期的应用程序级 ping 消息,以确保节点之间的传输连接保持活动状态。
在传输客户端中默认为 |
它还使用通用 网络设置。
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 的接收缓冲区大小
Elasticsearch 在集群中的每对节点之间打开许多 TCP 长连接,其中一些连接可能会长时间处于空闲状态。
尽管如此,Elasticsearch要求这些连接保持打开状态,如果任何节点间的连接被外部影响(如防火墙)而关闭,它会中断集群的运行。
配置网络以使 Elasticsearch 节点之间保持长时间的空闲连接是非常重要的,例如保留 tcp.keep_alive
,并确保 keepalive 间隔小于任何可能导致空闲连接关闭的超时时间;或者,如果无法配置 keepalive,则通过设置 transport.ping_schedule
的方式。
默认情况下,transport.compress
设置为 false
,集群节点之间的网络级请求压缩是禁用的。
这个默认值通常对于本地集群通信是有意义的,因为压缩会带来显著的CPU成本,并且本地集群倾向于在节点之间建立快速的网络连接。
transport.compress
设置总是配置本地集群请求压缩,并且是远程集群请求压缩的备用设置。
如果你想以不同于本地请求压缩的方式配置远程请求压缩,可以在每个远程集群的基础上设置它,使用 cluster.remote.${cluster_alias}.transport.compress
设置。
传输层有一个专用的跟踪记录器,当它被激活时,会记录传入和传出的请求。
通过将 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/*" } }