Elastic 5.0 Transport Client出现TCP连接过多问题求助
你用的是Elasticsearch 5.0的Transport Client,还开了嗅探功能,出现14个TCP连接其实是有原因的——开启嗅探后,客户端会自动发现集群里的所有节点,并且和每个节点建立多组连接;如果是连接多个集群的话,每个集群的节点都会触发连接建立,自然数量就上去了。下面给你几个实用的解决办法:
1. 关闭自动嗅探,手动指定连接节点
这是最直接控制连接数的方式。关闭嗅探后,客户端只会和你手动指定的节点建立连接,不会自动去发现所有节点,能大幅减少连接数量。
修改你的代码,把client.transport.sniff设为false,然后手动添加需要连接的节点(建议每个集群选1-2个稳定的主节点或者数据节点即可):
val esSettings = Settings.builder() .put("cluster.name", "someName") .put("client.transport.sniff", false) // 关闭自动嗅探 .build() val esClient = new TransportClient(esSettings, somePlugins) {} // 手动添加目标节点,每个集群选少量节点即可 esClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("es-node-1"), 9300)) esClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("es-node-2"), 9300))
注意:如果集群节点后续有变动,你需要手动更新客户端的节点配置,但换来了连接数的可控性。
2. 确保客户端实例单例化,避免重复创建
如果你是连接多个ES集群,千万不要为每个集群反复创建新的Transport Client实例——每个实例都会单独建立一批连接,实例多了连接数自然暴涨。
正确的做法是:每个集群对应一个单例的Transport Client实例,整个服务生命周期只初始化一次,并且在服务关闭时调用esClient.close()来主动释放所有连接,避免闲置连接残留。
3. 调整单节点连接数参数
如果你还想保留嗅探功能(比如集群节点经常变动,需要自动发现),可以调整客户端每个节点的连接数上限。Elasticsearch 5.0里默认每个节点会建立10个连接,你可以通过client.transport.connections_per_node参数把这个值调小,比如设为1或2:
val esSettings = Settings.builder() .put("cluster.name", "someName") .put("client.transport.sniff", true) .put("client.transport.connections_per_node", 1) // 每个节点仅建立1个连接 .build() val esClient = new TransportClient(esSettings, somePlugins) {}
这个参数要根据你的业务并发量来调整,别调得太小导致请求排队阻塞。
4. 排查是否存在客户端实例泄漏
检查你的代码逻辑,有没有地方创建了Transport Client但没有正确关闭。比如在某些请求方法里临时创建客户端,用完后没调用close(),这些闲置的客户端会保留着TCP连接,时间久了就会累积成大量连接。
一定要确保所有创建的客户端实例都能在不再使用时被正确关闭,尤其是在异常分支里也要做好资源释放。
内容的提问来源于stack exchange,提问作者jeremie

