在 CentOS 上实现 MySQL 负载均衡的实用方案
一、方案总览与选型
- 读写分离 + 读多写少:用 MySQL 主从复制 提供数据同步,前端用 HAProxy/ProxySQL/MaxScale/MySQL Router 做读负载均衡,写请求固定到主库。主从复制要点:主库开启 log-bin 与唯一 server-id,创建复制账号,从库设置 server-id/relay-log 并执行 CHANGE MASTER/START SLAVE,通过 SHOW SLAVE STATUS 检查同步状态。该模型简单、成熟,适合大多数业务。
- 多主或强一致:用 PXC(Percona XtraDB Cluster)/Galera 实现多节点可写与数据强一致,再在前端用 HAProxy 做四层转发或配合 Keepalived 做 VIP 漂移,读/写均可分摊到多个节点。适合高并发与高可用要求更高的场景。
- 四层直连负载均衡:用 LVS(DR)+ Keepalived 对 3306 做 TCP 转发,实现高性能读负载均衡与调度器高可用;写请求通常仍需指向主库或通过应用层路由控制。适合大流量、低开销场景。
二、方案一 主从复制 + HAProxy(读写分离,快速落地)
- 数据链路与角色
- 角色:Master(写)+ Slave1/Slave2(读)
- 复制:主库启用 log-bin、唯一 server-id;从库设置 server-id/relay-log;创建复制用户 repl;从库执行 CHANGE MASTER/START SLAVE;用 SHOW SLAVE STATUS 确认 Slave_IO_Running/Slave_SQL_Running=Yes。
- HAProxy 配置要点(/etc/haproxy/haproxy.cfg)
- 全局与默认
- global: log 127.0.0.1 local0; daemon; maxconn 4096
- defaults: mode tcp; timeout connect 5s; timeout client 50s; timeout server 50s
- 读写分离示例
- frontend mysql_write bind *:3306 default_backend mysql_master
- frontend mysql_read bind *:3307 default_backend mysql_slaves
- backend mysql_master mode tcp balance leastconn server master 192.168.1.10:3306 check
- backend mysql_slaves mode tcp balance roundrobin server slave1 192.168.1.11:3306 check server slave2 192.168.1.12:3306 check
- 健康检查(推荐 mysql-check)
- 在 MySQL 创建监控账号:CREATE USER ‘haproxy_check’@‘%’ IDENTIFIED BY ‘StrongPass!’;(可按需限制来源网段)
- backend 中使用 option mysql-check user haproxy_check
- 管理页面(可选)
- listen stats bind *:8888 stats enable stats uri /stats stats auth admin:admin
- 启动与验证
- systemctl start haproxy && systemctl enable haproxy
- 连接测试:写库连 VIP:3306,读库连 VIP:3307;观察 HAProxy stats 页面与后端健康状态。
三、方案二 高可用增强 Keepalived + HAProxy(避免单点)
- 思路:两台或多台 HAProxy 节点通过 Keepalived 共享 VIP,实现故障自动漂移;应用仅连 VIP。
- Keepalived 关键配置(/etc/keepalived/keepalived.conf 片段)
- global_defs: router_id mysql_lb
- vrrp_instance VI_MYSQL {
- state MASTER/BACKUP;interface eth0;virtual_router_id 51;priority 100/90
- advert_int 1;authentication { auth_type PASS; auth_pass YourPass; }
- virtual_ipaddress { 192.168.1.200/24 }
- track_script { chk_haproxy }
- }
- vrrp_script chk_haproxy { script “/etc/keepalived/chk_haproxy.sh”; interval 2; weight 5 }
- 健康检查脚本示例(/etc/keepalived/chk_haproxy.sh)
- #!/bin/bash
- if ! pidof haproxy >/dev/null; then systemctl restart haproxy || exit 1; fi
- exit 0
- chmod +x /etc/keepalived/chk_haproxy.sh
- 内核参数(/etc/sysctl.conf,便于 VIP 绑定与非本地绑定)
- net.ipv4.ip_nonlocal_bind=1
- net.ipv4.ip_forward=1
- sysctl -p
- 说明:也可为 Keepalived 单独配置 VIP 做数据库主备(不通过 HAProxy),但读负载仍需额外分发器。
四、方案三 多主一致集群 PXC/Galera + HAProxy(强一致、多写)
- 适用:需要多节点同时写入、强一致与自动节点恢复的场景。
- 部署要点
- 三节点(示例):PXC01 192.168.1.105、PXC02 192.168.1.106、PXC03 192.168.1.107
- 关键 my.cnf(各节点)
- wsrep_provider=/usr/lib64/libgalera_smm.so
- wsrep_cluster_address=gcomm://192.168.1.105,192.168.1.106,192.168.1.107
- binlog_format=ROW;default_storage_engine=InnoDB;innodb_autoinc_lock_mode=2
- wsrep_node_address=本机IP;wsrep_cluster_name=my_cluster
- wsrep_sst_method=xtrabackup-v2;wsrep_sst_auth=“sstuser:s3cret”
- 启动顺序:首节点以空 gcomm:// 启动,其余节点随后加入;用 mysql 客户端检查 wsrep_cluster_size=3。
- 前端负载
- HAProxy 四层转发(mode tcp,balance roundrobin)到三节点 3306;或结合 Keepalived 做 VIP 漂移。
五、关键注意事项与最佳实践
- 事务与一致性
- 读写分离时,写后读可能短期内不一致;对强一致场景使用 READ COMMITTED/REPEATABLE READ 隔离级别、应用层重试或 Galera/PXC 多主一致方案。
- 健康检查与故障隔离
- 避免将 read_only 从库误加入写池;为 HAProxy 配置 mysql-check 或脚本探活,失败自动摘除。
- 连接管理
- 合理设置 maxconn、连接超时;应用使用连接池并启用自动重连;避免长事务占用连接。
- 监控与告警
- 监控复制延迟(Seconds_Behind_Master)、节点存活、连接数、慢查询;HAProxy/PXC/Keepalived 日志集中化。
- 安全
- 仅开放必要端口(如 3306/3307/8888);为复制与监控账号设置最小权限与来源网段限制;启用 TLS 加密传输(生产建议)。
- 版本与升级
- 主从/集群节点 MySQL/MariaDB 版本尽量一致;变更前备份与灰度,滚动升级减少停机时间。