mysql主从复制需配置row格式、full binlog_row_image、从库read_only=1(非super_read_only),用--single-transaction导出,并借助orchestrator实现高可用与proxysql实现智能读写分离及延迟感知路由。

MySQL主从复制怎么配才不会同步失败
主从复制不是配完CHANGE MASTER TO就完事的,常见同步中断是因为主库binlog格式不匹配、从库SQL线程被阻塞、或主从时钟偏差太大。必须用ROW格式,且主库开启binlog_row_image=FULL,否则UPDATE/DELETE可能漏数据。
- 检查主库:运行
SHOW VARIABLES LIKE 'binlog_format',如果不是ROW,在my.cnf里加binlog_format = ROW并重启 - 从库务必关闭
read_only=1(但不要关super_read_only,避免误操作写入) - 同步前用
mysqldump --single-transaction --master-data=2导出,确保位点准确;别用--lock-all-tables,会卡主库 - 如果出现
Slave_SQL_Running: No,先查SHOW SLAVE STATUS\G里的Last_SQL_Error,90%是主库删了从库还依赖的外键约束,或从库有手动写入导致主键冲突
读写分离中间件选ProxySQL还是MaxScale
ProxySQL更轻量、配置灵活,适合中小流量和需要细粒度路由规则的场景;MaxScale对GTID支持更原生,但配置复杂、内存占用高,升级容易出兼容问题。生产环境优先试ProxySQL,除非你明确依赖MaxScale的语义解析能力(比如强制把含FOR UPDATE的SELECT发到主库)。
-
ProxySQL的mysql_replication_hostgroups表必须填对writer_hostgroup和reader_hostgroup,否则读请求全走主库 - 健康检查不能只靠
PING,得开monitor模块并配置mysql-monitor_username——这个账号要带REPLICATION CLIENT权限 - 从库延迟超过60秒时,
ProxySQL默认仍会转发读请求,需在mysql_servers表里设max_replication_lag字段,否则用户看到脏数据
主库宕机后怎么让从库自动升主
MySQL本身不提供自动故障转移,必须靠外部工具。MHA(Master High Availability)已停止维护,Orchestrator是目前最稳的选择,它能检测主库失联、选最优从库提升、重置其他从库指向新主,并更新ProxySQL的路由配置。
-
Orchestrator必须部署为集群模式(至少3节点),单点挂了照样能决策 - 所有从库的
relay_log_recovery=ON必须开启,否则切换后可能丢中继日志 - 切主后
GTID_PURGED可能不一致,Orchestrator会自动执行RESET MASTER再SET GTID_PURGED,但前提是主库崩溃前没手工执行过RESET MASTER - 应用层连接池(如HikariCP)要配
failover参数,否则DNS缓存或TCP连接会卡在旧IP上
为什么读写分离后还是查到旧数据
不是中间件没生效,而是业务代码绕过了路由逻辑——比如用了jdbc:mysql://host1,host2/这种多地址URL,MySQL Connector/J 8.0+默认走轮询,根本没走ProxySQL;或者事务里混用了读写操作,而ProxySQL的transaction_persistent没开。
- 确认应用连的是
ProxySQL端口(默认6033),不是直连MySQL端口(3306) - 在
mysql_query_rules里加规则:匹配^SELECT.*FOR UPDATE$的语句强制走writer_hostgroup - 如果用Spring,
@Transactional内所有查询都会被ProxySQL发到主库——但前提是没手动开新连接或用DataSourceUtils.getConnection()绕过事务管理器 - 从库延迟监控不能只看
Seconds_Behind_Master,它在主库重启或大事务后会归零但实际日志还没追上,得结合Exec_Master_Log_Pos和主库当前File_position比对
延迟感知和路由策略的耦合点最容易被忽略:ProxySQL不会主动查从库延迟,它只信自己定时执行的SELECT @@gtid_executed结果。如果你没在mysql_servers里设max_replication_lag,或者监控脚本权限不够,读请求照常打到“假在线”的滞后从库上。











