主从复制通过读写分离缓解读多写少压力,但需应用层路由、处理复制延迟、避免从库误写,并注意跨机房容灾限制。
当业务中 SELECT 请求远高于 INSERT/UPDATE/DELETE,比如电商商品页、内容平台详情页、报表后台查询,单库扛不住并发读请求。主从复制让写操作只走 master,读请求分发到一个或多个 slave,实际是把读吞吐横向扩展了。
注意:应用层必须显式区分读写路由,MySQL 本身不自动做这个决策。常见做法是用中间件(如 ShardingSphere、ProxySQL)或在 ORM 层(如 MyBatis 的 AbstractRoutingDataSource)做数据源切换。
MASTER_POS_WAIT() 确认位点已同步主从结构天然提供一份实时热备。当 master 故障时,可快速提升某个 slave 为新主库(需配合 GTID + semi-sync 避免数据丢失)。但注意:这不属于“自动故障转移”,MySQL 原生不提供集群管理能力,必须依赖外部工具(如 Orchestrator、MHA 或云厂商的 RDS 自动主从切换)。
典型误操作是直接在从库执行 STOP SLAVE; RESET SLAVE ALL; 后就当它是新主库——没清理 relay log 位点、没重置 GTID_EXECUTED,后续再挂回原主库可能引发事务重复或跳过。
gtid_mode=ON 和 enforce_gtid_consistency=ON
binlog(除非它还要当其
他实例的主库),否则会额外写日志并影响性能Seconds_Behind_Master,它在空闲或大事务时可能为 0 却实际卡住;更可靠的是比对 SHOW MASTER STATUS 和 SHOW SLAVE STATUS 中的 Exec_Master_Log_Pos 与 Read_Master_Log_Pos
跑复杂聚合查询(如 GROUP BY + 多表 JOIN + 全表扫描)会严重拖慢主库响应。把这类低优先级、允许分钟级延迟的任务定向到专用从库,是最小成本的资源隔离方案。
关键点在于避免影响线上服务:专用从库建议配置更低规格(CPU/内存),并设置 max_execution_time 限制长查询,同时开启 read_only=ON 防止误写。
mysqldump 导出后导入独立分析库,而不是长期占用一个从库实例ERROR 1290 (HY000): The MySQL server is running with the --read-only option
主库放在北京 IDC,从库部署在上海或深圳,用户请求按 DNS 或负载均衡就近接入本地从库,降低跨城网络延迟。这种架构下,复制链路变成跨公网或长距专线,network latency 成为最大瓶颈。
此时必须调优:增大 slave_net_timeout(默认 60 秒,长距易超时断连),启用 slave_compressed_protocol=ON 减少带宽占用,并强烈建议用 semi-sync replication 避免主库提交后长时间不知道从库是否收到。
async replication 做强一致容灾——网络抖动时主库可能已提交,但从库一条没收到CHANGE MASTER TO ... MASTER_SSL=1 必须开启,否则复制账号密码等敏感信息明文传输