Infinispan Kubernetes POD故障处理及客户端自动切换咨询
解决方案:K8s环境下Infinispan客户端故障自动切换问题
一、Infinispan原生拓扑感知机制
Infinispan Java客户端本身支持集群拓扑自动感知,默认逻辑会自动发现集群内所有节点,并在当前连接节点不可用时切换至存活节点。你的问题大概率是客户端未正确开启该功能,或K8s服务配置未匹配到位。
- 确保客户端配置指向K8s Infinispan服务名,同时开启拓扑更新:
ConfigurationBuilder builder = new ConfigurationBuilder(); // 指向K8s服务名而非固定Pod IP builder.addServer().host("infinispan-service").port(11222) .security().authentication().username("admin").password("your-password"); // 开启哈希分布感知,获取完整集群拓扑 builder.clientIntelligence(ClientIntelligence.HASH_DISTRIBUTION_AWARE); // 连接池配置:借连接时检测可用性 builder.connectionPool().maxActive(20).maxWait(1000).testOnBorrow(true);ClientIntelligence.HASH_DISTRIBUTION_AWARE是核心配置,它会让客户端主动拉取集群完整拓扑,而非仅绑定初始连接节点。
二、K8s层面的探针配置
需要通过就绪/存活探针确保K8s服务只将流量导向健康的Infinispan节点:
就绪探针:仅当节点完全加入集群后,才被纳入服务端点列表
readinessProbe: httpGet: path: /rest/v2/health/status port: 11222 initialDelaySeconds: 30 periodSeconds: 10存活探针:及时剔除故障节点,避免服务将流量发往已崩溃的Pod
livenessProbe: httpGet: path: /rest/v2/health/live port: 11222 initialDelaySeconds: 60 periodSeconds: 20
三、客户端连接池与重试策略优化
除拓扑感知外,需配置连接池和重试逻辑保障故障恢复:
- 开启连接池的
testOnBorrow和testWhileIdle,确保每次获取的连接都是可用状态; - 配置缓存操作的重试策略,针对连接异常、拓扑更新失败自动重试:
builder.remoteCache("your-cache-name") .retry().mode(RetryMode.RETRY).maxRetries(3);
四、双Pod重启场景的应对
双Pod重启时客户端会丢失所有初始连接,需通过以下配置保障重连:
- 客户端
serverList必须绑定K8s服务名,而非固定Pod IP,确保Pod重启后服务能自动更新端点列表,客户端重连时获取新节点地址; - 配置合理的连接超时和重试间隔,避免集群重启期间持续报错,等待集群恢复后自动重建连接。
五、常见排查点
- 查看客户端日志,确认是否有
TopologyUpdatedEvent相关输出,验证客户端是否收到集群拓扑更新; - 进入Infinispan Pod执行
bin/cli.sh,用cluster status命令确认集群是否正常组建; - 执行
kubectl get endpoints <infinispan-service>,检查故障Pod是否被及时从服务端点中剔除。
内容的提问来源于stack exchange,提问作者Mauri
相关产品推荐
相关产品推荐

