0

0

mysql在分布式架构中使用主从复制的应用场景

P粉602998670

P粉602998670

发布时间:2026-01-10 03:53:30

|

543人浏览过

|

来源于php中文网

原创

主从复制通过读写分离缓解读多写少压力,但需应用层路由、处理复制延迟、避免从库误写,并注意跨机房容灾限制。

mysql在分布式架构中使用主从复制的应用场景

主从复制解决读多写少的流量压力

当业务中 SELECT 请求远高于 INSERT/UPDATE/DELETE,比如电商商品页、内容平台详情页、报表后台查询,单库扛不住并发读请求。主从复制让写操作只走 master,读请求分发到一个或多个 slave,实际是把读吞吐横向扩展了。

注意:应用层必须显式区分读写路由,MySQL 本身不自动做这个决策。常见做法是用中间件(如 ShardingSphereProxySQL)或在 ORM 层(如 MyBatisAbstractRoutingDataSource)做数据源切换。

  • 不能把所有读都扔给从库——比如刚插入一条订单,紧接着查这条记录,若查从库可能因复制延迟还没同步,导致“查不到”
  • 强一致性读必须打到主库,或等待 MASTER_POS_WAIT() 确认位点已同步
  • 从库数量不是越多越好,每个从库都会增加主库的二进制日志解析和网络开销

从库承担备份与高可用切换任务

主从结构天然提供一份实时热备。当 master 故障时,可快速提升某个 slave 为新主库(需配合 GTID + semi-sync 避免数据丢失)。但注意:这不属于“自动故障转移”,MySQL 原生不提供集群管理能力,必须依赖外部工具(如 OrchestratorMHA 或云厂商的 RDS 自动主从切换)。

典型误操作是直接在从库执行 STOP SLAVE; RESET SLAVE ALL; 后就当它是新主库——没清理 relay log 位点、没重置 GTID_EXECUTED,后续再挂回原主库可能引发事务重复或跳过。

  • 生产环境务必开启 gtid_mode=ONenforce_gtid_consistency=ON
  • 从库应关闭 binlog(除非它还要当其他实例的主库),否则会额外写日志并影响性能
  • 监控项不能只看 Seconds_Behind_Master,它在空闲或大事务时可能为 0 却实际卡住;更可靠的是比对 SHOW MASTER STATUSSHOW SLAVE STATUS 中的 Exec_Master_Log_PosRead_Master_Log_Pos

从库用于离线分析与报表生成

跑复杂聚合查询(如 GROUP BY + 多表 JOIN + 全表扫描)会严重拖慢主库响应。把这类低优先级、允许分钟级延迟的任务定向到专用从库,是最小成本的资源隔离方案。

羊驼CMS 企业版3.8
羊驼CMS 企业版3.8

羊驼 v3.8 企业版(仿阿里巴巴单企业界面)方便中小企业建站使用,包含产品、新闻、网上询价等模块。羊驼! 是一个开源的轻量级树状 CMS 系统。 它基于 php + mysql 并以 b2core MVC 为底层架构。 可以方便快速的配置出个人、企业网站。在B2Core 优雅的MVC架构之上你可以轻松定制任意应用型网站。 羊驼 v3.8 企业版更新:修复了后台错误,和前台图片地址问题。 企业版主

下载

关键点在于避免影响线上服务:专用从库建议配置更低规格(CPU/内存),并设置 max_execution_time 限制长查询,同时开启 read_only=ON 防止误写。

  • 不要在报表从库上建索引优化——主库 DDL 不会同步到从库,且索引会影响复制性能
  • 如果报表 SQL 需要访问大量历史归档数据,考虑用 mysqldump 导出后导入独立分析库,而不是长期占用一个从库实例
  • 某些 BI 工具(如 Tableau)默认启用连接池并复用连接,若未配置只读模式,仍可能把写语句发到从库导致报错 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 必须开启,否则复制账号密码等敏感信息明文传输
主从复制不是银弹。它缓解读压力、提供基础冗余,但解决不了分片、分布式事务、全局一致性这些分布式核心问题。最容易被忽略的是:复制延迟在任何规模下都存在,而业务代码里那些“先写后读”的隐含假设,往往比数据库配置更容易引发线上故障。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1094

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

413

2024.04.29

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 785人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号