温馨提示×

centos mysql如何负载均衡

小樊
40
2025-12-05 12:48:13
栏目: 云计算

在 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 版本尽量一致;变更前备份与灰度,滚动升级减少停机时间。

0