📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

client.transport.sniff 配置项用于控制 TransportClient 是否启用节点嗅探(sniff)功能。

节点嗅探允许 TransportClient 自动发现集群中的所有数据节点,并建立到这些节点的连接,而不仅仅是连接到手动配置的节点。

配置项属性 #

  • 配置路径: client.transport.sniff
  • 数据类型: boolean
  • 默认值: false
  • 是否可选: 是

配置项详解 #

工作模式 #

简单模式(sniff = false,默认) #

配置节点1 ←→ 客户端 ←→ 配置节点2
    ↓
  只连接手动配置的节点
  • 客户端只连接到通过 addTransportAddress() 明确配置的节点
  • 通过 ping 操作验证节点存活状态
  • 不会发现集群中的其他节点
  • 适用于节点数量固定、连接目标明确的场景

嗅探模式(sniff = true) #

配置节点1 ←→ 客户端 ←→ 配置节点2
     ↓              ↓
  集群节点3      集群节点4
     ↓              ↓
  集群节点5      集群节点6
  自动发现所有数据节点并连接
  • 客户端会向已连接的节点发送集群状态请求
  • 收集集群中所有数据节点的信息
  • 自动发现并连接到所有数据节点
  • 定期更新节点列表(通过 nodes_sampler_interval 控制)

嗅探工作流程 #

1. 连接到手动配置的节点
       ↓
2. 向该节点请求集群状态
       ↓
3. 解析集群状态中的数据节点列表
       ↓
4. 建立到所有数据节点的连接
       ↓
5. 定期重复步骤 2-4(发现新增/移除的节点)

配置建议 #

静态集群环境 #

client.transport.sniff: false

建议: 保持默认值 false。当集群节点数量固定且连接目标明确时,无需嗅探功能。

动态集群环境 #

client.transport.sniff: true

建议: 设置为 true。当集群节点数量可能动态变化(如扩容、缩容)时,启用嗅探可以自动发现新节点。

高可用性要求场景 #

client.transport.sniff: true

建议: 设置为 true。连接到所有数据节点可以实现负载均衡和故障自动切换。

网络受限环境 #

client.transport.sniff: false

建议: 保持 false。当网络环境限制客户端只能访问特定节点时,不应启用嗅探。

代码示例 #

简单模式配置 #

Settings settings = Settings.builder()
    .put("cluster.name", "my-production-cluster")
    .put("client.transport.sniff", false)  // 默认值,可省略
    .build();

TransportClient client = new PreBuiltTransportClient(settings)
    .addTransportAddress(new TransportAddress(InetAddress.getByName("node1.example.com"), 9300))
    .addTransportAddress(new TransportAddress(InetAddress.getByName("node2.example.com"), 9300));
// 只会连接这两个手动配置的节点

嗅探模式配置 #

Settings settings = Settings.builder()
    .put("cluster.name", "my-production-cluster")
    .put("client.transport.sniff", true)  // 启用节点嗅探
    .put("client.transport.nodes_sampler_interval", "5s")  // 控制嗅探频率
    .build();

TransportClient client = new PreBuiltTransportClient(settings)
    .addTransportAddress(new TransportAddress(InetAddress.getByName("seed-node1.example.com"), 9300));
// 会自动发现并连接集群中的所有数据节点

配合采样间隔使用 #

Settings settings = Settings.builder()
    .put("client.transport.sniff", true)
    .put("client.transport.nodes_sampler_interval", "10s")  // 每 10 秒更新一次节点列表
    .build();

相关配置 #

配置项作用默认值
client.transport.nodes_sampler_interval节点采样/嗅探的执行间隔5s
client.transport.ping_timeout节点检测超时时间5s
client.transport.ignore_cluster_name是否忽略集群名称检查false

配置配合说明 #

  • sniff + nodes_sampler_interval: 控制嗅探的执行频率
  • sniff + ping_timeout: 控制获取集群状态请求的超时时间
  • sniff + ignore_cluster_name: 控制是否验证集群名称

两种模式对比 #

特性简单模式(false)嗅探模式(true)
连接范围仅手动配置的节点所有数据节点
负载均衡限于配置的节点自动分发到所有节点
节点发现无自动发现自动发现新节点
网络开销较低稍高(定期获取集群状态)
适用场景节点固定、连接明确动态集群、高可用要求

注意事项 #

  1. 仅适用于 TransportClient: 此配置项只影响基于传输协议的 Java 客户端。

  2. TransportClient 已弃用: 在 Easysearch 8.0 及更高版本中,TransportClient 已被弃用,建议迁移到 RestClient。

  3. 初始节点的重要性: 即使启用嗅探,仍需配置至少一个初始节点用于启动和获取集群状态。

  4. 嗅探只发现数据节点: 嗅探功能只会发现和连接到数据节点,不会连接到仅主节点(master-only nodes)或协调节点。

  5. 定期更新: 节点列表会按照 nodes_sampler_interval 配置的间隔定期更新,自动响应集群拓扑变化。

  6. 网络考虑: 如果客户端与集群之间存在防火墙或网络限制,嗅探可能无法正常工作。