proxysql 是实现「零停机备份容灾」的关键调度层,通过读写分离、主从角色隔离与备份窗口透明切换协同完成,而非单独承担备份任务;它将读流量与备份请求隔离至专用从库,避免干扰主库。

ProxySQL 本身不直接参与备份,但它是实现「零停机备份容灾」的关键调度层——它让备份操作(如 mysqldump、xtrabackup)能安全落在从库上,同时业务流量不受影响。真正的零停机,靠的是「读写分离 + 主从角色隔离 + 备份窗口透明切换」三者协同,不是 ProxySQL 单独完成的。
为什么不能直接在主库上做备份?
主库承担全部写入和强一致性读,执行 mysqldump --single-transaction 会持续持有 metadata lock(尤其对大表),可能阻塞 DDL;而 xtrabackup 的物理拷贝虽不锁表,但仍会显著增加 I/O 和 CPU 压力,导致主库响应延迟上升、甚至触发连接超时。Seafile 这类应用对延迟敏感,1–2 秒卡顿就是不可接受的。
ProxySQL 的作用是:把所有常规读请求稳稳压在从库上,为主库“腾出资源余量”,同时为备份任务“预留专用从库节点”——这才是零停机的前提。
如何配置 ProxySQL 让备份从库不被业务流量干扰?
关键不是加权重或改规则,而是用 Hostgroup 隔离 + 查询规则锁定 + 健康检查兜底:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 给备份专用从库单独分配一个 Hostgroup(比如
hostgroup_id = 3),不参与任何默认读负载均衡规则 - 在
mysql_query_rules表中,添加一条高优先级规则,强制将特定用户(如backup_user)的所有查询路由到该 Hostgroup:INSERT INTO mysql_query_rules (rule_id,active,username,destination_hostgroup,apply) VALUES (100,1,'backup_user',3,1);
- 确保该从库的
read_only=ON且未启用super_read_only(否则mysqldump可能因权限不足失败) - 在
mysql_servers中,为该节点设置max_replication_lag = 3600(允许更大延迟),避免健康检查误判下线
异地容灾备份链路中 ProxySQL 怎么配合 binlog 同步?
ProxySQL 不解析或转发 binlog,但它必须与 binlog 同步链路解耦——否则跨地域延迟会拖垮代理性能。实操要点:
- 主库开启
log_bin和gtid_mode=ON,从库开启relay_log_recovery=ON,这是异地复制稳定的基础 - binlog 推送脚本(如用
mysqlbinlog --raw+rsync或对象存储 SDK)应直连主库私网地址,绕过 ProxySQL —— ProxySQL 是 SQL 层代理,不处理 raw binlog 流 - ProxySQL 的监控模块(
monitor模块)只检查 MySQL 实例的SELECT 1和复制延迟(Seconds_Behind_Master),它无法感知 binlog 是否已推送到远端对象存储,这部分需独立校验 - 若使用 GTID 切换容灾库,必须提前在 ProxySQL 中更新
mysql_servers表,把新主库加入 Hostgroup 1,并调低旧主库权重或标记status='OFFLINE_SOFT',再触发LOAD MYSQL SERVERS TO RUNTIME
最容易被忽略的点:备份期间 ProxySQL 的连接池行为
很多人以为只要把备份连到从库就万事大吉,却忽略了 ProxySQL 默认的连接复用机制会把备份长连接混进业务连接池,导致后续业务请求被卡住。必须显式控制:
- 备份客户端连接 ProxySQL 时,务必加参数
--connect-timeout=10 --wait_timeout=300,并在脚本开头执行SET SESSION wait_timeout = 300 - 在 ProxySQL 的
mysql_users表中,为backup_user设置max_connections = 1和default_hostgroup = 3,防止它意外打到主库 -
mysql_servers中该备份从库的max_connections建议设为 2(1 个留给备份,1 个冗余),避免耗尽后其他监控探测失败
真正零停机的难点不在备份命令本身,而在整个链路里每个组件的“职责边界”是否清晰——ProxySQL 管 SQL 路由,binlog 管日志传输,从库管数据副本,运维脚本管切换时机。任何一个环节越界,都会让“零停机”变成“伪命题”。










