--- title: "客户端传输节点嗅探配置" date: 2026-02-10 lastmod: 2026-02-10 description: "client.transport.sniff 配置项用于控制 TransportClient 是否启用节点嗅探功能,实现自动发现和连接集群中的所有数据节点。" tags: ["客户端", "传输", "节点嗅探", "TransportClient", "自动发现"] summary: "配置项作用 # 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." --- ## 配置项作用 `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(发现新增/移除的节点) ``` ## 配置建议 ## 静态集群环境 ```yaml client.transport.sniff: false ``` **建议**: 保持默认值 `false`。当集群节点数量固定且连接目标明确时,无需嗅探功能。 ## 动态集群环境 ```yaml client.transport.sniff: true ``` **建议**: 设置为 `true`。当集群节点数量可能动态变化(如扩容、缩容)时,启用嗅探可以自动发现新节点。 ## 高可用性要求场景 ```yaml client.transport.sniff: true ``` **建议**: 设置为 `true`。连接到所有数据节点可以实现负载均衡和故障自动切换。 ## 网络受限环境 ```yaml client.transport.sniff: false ``` **建议**: 保持 `false`。当网络环境限制客户端只能访问特定节点时,不应启用嗅探。 ## 代码示例 ## 简单模式配置 ```java 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)); // 只会连接这两个手动配置的节点 ``` ## 嗅探模式配置 ```java 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)); // 会自动发现并连接集群中的所有数据节点 ``` ## 配合采样间隔使用 ```java 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. **网络考虑**: 如果客户端与集群之间存在防火墙或网络限制,嗅探可能无法正常工作。