Kubernetes实现外部MariaDB PXC集群负载均衡与故障转移方案咨询
结论
你当前提供的静态Service与Endpoints配置无法实现自动故障转移。
原因说明
- Kubernetes 不会对用户手动创建的静态Endpoints资源自动进行后端健康检测,只要你不手动修改Endpoints的地址列表,就算其中某个MariaDB节点宕机,kube-proxy依然会将请求转发到这个不可用IP上,导致部分请求失败。
- 你配置的是无头Service(
clusterIP: None),对该Service的DNS查询会直接返回所有3个后端IP,由客户端自行选择IP建立连接,这种场景下节点宕机后客户端依然会拿到不可用IP,同样会出现连接异常。
可实现自动故障转移的方案
方案1:动态更新Endpoints
你可以部署一个简单的自定义巡检任务,定期探测三个MariaDB节点的端口连通性和数据库可用性:
- 某节点探测失败时,自动从Endpoints的地址列表中移除该IP
- 节点恢复正常后自动将IP加回地址列表
保证Endpoints中始终只保留可用节点,即可实现K8s侧的自动故障转移。
方案2:依赖数据库客户端驱动的故障转移能力
不需要改动K8s侧配置,直接在应用的数据库连接串中填写所有三个节点的地址,利用MariaDB官方驱动自带的故障转移逻辑,自动跳过不可用节点,这种方案实现更简单,无需额外维护K8s侧资源,以JDBC连接串为例:jdbc:mariadb://172.16.10.100,172.16.10.101,172.16.10.102:3306/数据库名?autoReconnect=true&failOverReadOnly=false
方案3:使用EndpointSlice资源(K8s 1.21及以上版本适用)
改用EndpointSlice替代静态Endpoints,为每个端点配置就绪探测规则,Kubernetes会自动更新端点的可用状态,只有标记为就绪的端点才会接收流量。
内容的提问来源于stack exchange,提问作者TW2021
相关产品推荐
相关产品推荐

