Hazelcast 5.2.1嵌入式模式下新实例间歇性无法通过TCP连接主节点问题求助
大家好,我最近碰到一个Hazelcast的间歇性问题,折腾了好一阵没解决,想请教下社区的朋友们:
环境背景
- 我在Spring Boot应用中使用Hazelcast 5.2.1嵌入式模式,采用TCP IP集群配置
- 应用部署在Cloud Foundry上,集群跨多个CF应用,已开启Zone Aware分区特性提升韧性,集群规模通常保持在18个实例以上
- TCP IP配置的
members参数中指定了多个apps.internal路由 - Cloud Foundry对应用有5分钟的健康检查窗口,如果新实例在这个窗口内无法确认加入集群,就会被强制重启;目前的情况是通常重启几次后,某个实例能成功连接主节点
问题现象
这个问题是间歇性出现的,只有当新实例从非主节点获取主节点IP时才会触发:
- 开启Trace级日志后,首先会看到这两条日志:
"thread":"main","level":"DEBUG","logger":"c.h.i.s.tcp.TcpServerConnectionManager","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Connection to: [domain_1]:5701 streamId:-1 is not yet in progress"
"thread":"hz.peaceful_faraday.cached.thread-2","level":"TRACE","logger":"c.h.i.server.tcp.TcpServerConnector","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Starting to connect to [domain_1]:5701"
- 之后实例会持续打印以下日志,直到最终崩溃:
thread":"main","level":"DEBUG","logger":"c.h.internal.cluster.impl.TcpIpJoiner","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Sending join request to [master_ip]:5701"
thread":"hz.magical_elgamal.generic-operation.thread-0","level":"DEBUG","logger":"c.h.i.cluster.impl.ClusterJoinManager","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Handling master response [master_ip]:5701 from [non_master_ip]:5701"
thread":"hz.magical_elgamal.generic-operation.thread-0","level":"DEBUG","logger":"c.h.internal.cluster.ClusterService","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Setting master address to [master_ip]:5701"
thread":"hz.magical_elgamal.generic-operation.thread-0","level":"DEBUG","logger":"c.h.i.cluster.impl.ClusterJoinManager","message":"[new_instance_ip]:5701 [cluster-name] [5.2.1] Handling master response [master_ip]:5701 from [non_master_ip]:5701"
- 最关键的是:整个过程中从未看到新实例打印“Starting to connect to [master ip]”的日志,而且我检查了主节点的日志,完全没有这个新实例的连接记录,看起来新实例根本没有执行ConnectTask去尝试连接主节点。
已尝试的无效调整
我做了不少配置调整,但都没能改善这个问题:
- 降低
hazelcast.max.join.seconds参数值至30 - 将
hz:io线程池大小增加到64 - 将default线程池大小增加到64
- 增加
hazelcast.io.thread.count至32 - 增加
hazelcast.io.input.thread.count至32 - 增加
hazelcast.io.output.thread.count至32 - 显式禁用多播配置
- 关闭端口自动递增,手动指定端口
原本我以为这些调整能促使ConnectTask执行,启动对主节点的连接或者触发重试逻辑,但问题依旧存在。
有没有朋友碰到过类似的情况,或者能给点排查方向的建议?
备注:内容来源于stack exchange,提问作者YourAvgDev

