如何配置应用连接MySQL NDB集群以同时实现负载均衡与高可用
如何配置MySQL NDB集群实现高可用+负载均衡的应用连接?
当然可以同时实现这两项功能!MySQL Connector/J(JDBC驱动)已经原生支持把高可用故障转移和负载均衡结合起来,完美适配NDB集群的特性,不用额外折腾复杂的中间件。
核心配置思路
你之前了解的两种单独配置方案,其实可以通过loadbalance协议+故障转移相关参数的组合来融合——NDB集群的SQL节点本身是无状态的(所有节点都连接到同一个存储集群),所以负载均衡可以把请求均匀分发到可用的SQL节点,同时故障转移机制会自动跳过不可用的节点,一次性满足高可用和负载均衡需求。
具体连接URL格式
直接用loadbalance://作为协议前缀,同时列出所有NDB集群的SQL节点地址,再加上关键的故障转移和负载均衡参数即可:
jdbc:mysql:loadbalance://[sql-node1]:[port],[sql-node2]:[port],...,[sql-nodeN]:[port]/[database]?[参数列表]
完整示例及参数说明
这里给一个实际可用的配置示例,你可以根据自己的集群调整:
jdbc:mysql:loadbalance://sql-node-01:3306,sql-node-02:3306,sql-node-03:3306/my_app_db?loadBalanceConnectionGroup=ndb-cluster-pool&loadBalanceValidateConnectionOnSwapServer=true&failoverReadOnly=false&autoReconnect=true
关键参数的作用:
loadbalance://:开启负载均衡模式,驱动会把新的连接请求按配置策略(默认轮询)分发到列表中的SQL节点- 多节点地址:列出所有正常运行的NDB SQL节点,一旦某个节点宕机,驱动会自动将后续请求切换到其他可用节点,实现高可用故障转移
loadBalanceValidateConnectionOnSwapServer=true:切换到新节点前自动验证连接有效性,避免分发到已经故障的节点failoverReadOnly=false:因为NDB集群的所有SQL节点默认都支持读写操作,设为false确保故障转移后依然可以执行写操作(如果你的集群做了读写分离,可以根据实际调整)autoReconnect=true:连接断开时自动尝试重连,进一步提升可用性
额外注意事项
- 确保所有SQL节点都正确注册到NDB存储集群,状态正常(可以用
SHOW ENGINE NDB STATUS命令检查) - 建议使用Connector/J 5.1.37及以上版本(或最新的8.x版本),这些版本对NDB集群的负载均衡和故障转移支持更稳定
- 如果搭配了连接池(比如HikariCP、Druid),记得在连接池配置中配合这些参数,比如设置合理的连接超时、验证超时时间,让连接池能及时剔除无效连接
内容的提问来源于stack exchange,提问作者Samitha Chathuranga




