1. 为什么需要MySQL读写分离与分库分表我清晰地记得第一次遇到数据库瓶颈的场景。那是一个电商促销日我们的订单系统突然变得异常缓慢数据库服务器的CPU直接飙到了100%。查看慢查询日志发现大量请求堆积在几个核心表上。这就是典型的单库单表架构在高并发下的表现——无论你怎么优化SQL硬件性能终究有上限。MySQL读写分离和分库分表本质上都是为了解决数据库的扩展性问题。读写分离通过将读操作和写操作分离到不同的数据库实例有效分摊负载而分库分表则是将数据分散到多个物理节点突破单机存储和性能限制。注意这两种技术通常需要配合使用。读写分离解决的是读多写少场景下的性能问题而分库分表解决的是数据量和写并发的问题。2. MySQL读写分离实战方案2.1 主从复制架构设计MySQL原生支持主从复制(Master-Slave Replication)这是实现读写分离的基础。主库(Master)处理所有写操作从库(Slave)通过复制主库的binlog来同步数据承担读请求。配置主从复制的基本步骤在主库上启用binlog并设置server-id创建用于复制的专用账号获取主库当前的binlog位置在从库配置连接到主库的信息启动从库的复制线程-- 主库配置示例 [mysqld] server-id1 log-binmysql-bin binlog-formatROW -- 从库配置示例 [mysqld] server-id2 relay-logmysql-relay-bin read-only12.2 读写分离中间件选型单纯配置主从复制还不够我们需要一个中间件来路由读写请求。常见的方案有应用层实现在代码中区分读写操作直接连接不同的数据源。优点是简单直接缺点是耦合度高难以维护。代理中间件MySQL RouterMySQL官方提供的轻量级路由ProxySQL高性能MySQL代理支持查询重写、缓存等功能MyCat功能更全面的中间件支持分库分表我推荐使用ProxySQL作为读写分离的解决方案它的主要优势包括近乎零性能损耗C语言开发支持动态配置无需重启服务提供连接池和查询缓存功能完善的监控和管理接口2.3 读写分离的潜在问题与解决方案在实际使用中我们会遇到几个典型问题主从延迟问题 当写入主库后立即查询从库可能查不到刚写入的数据。解决方案包括对一致性要求高的查询强制走主库使用半同步复制semi-sync replication监控复制延迟延迟过高时告警事务处理 如果一个事务中同时包含读写操作需要确保都在主库执行。可以通过在事务开始时打标记或者使用Hint强制路由。负载均衡 多个从库之间的负载均衡策略需要考虑轮询round-robin基于权重weighted基于连接数或响应时间3. MyCat分库分表深度解析3.1 MyCat核心概念与架构MyCat是一个开源的分布式数据库中间件前身是阿里的Cobar。它的核心功能包括分库分表读写分离数据聚合SQL防火墙MyCat的架构分为三层前端接收应用层的JDBC请求解析SQL中间层根据分片规则路由SQL到后端数据库后端实际的MySQL实例存储数据3.2 分库分表策略设计合理的分片策略是分库分表成功的关键。常见的分片方式水平分片范围分片按ID范围或时间范围分片哈希分片对分片键取模一致性哈希减少数据迁移量垂直分片 按业务维度拆分如用户数据一个库订单数据一个库以电商系统为例订单表可以按用户ID哈希分片table nameorders primaryKeyid dataNodedn1,dn2,dn3 rulemod-long / function namemod-long classio.mycat.route.function.PartitionByMod property namecount3/property /function3.3 MyCat配置详解MyCat的核心配置文件是schema.xml和rule.xml。以下是一个典型配置!-- schema.xml -- schema nameecommerce checkSQLschemafalse sqlMaxLimit100 table nameusers primaryKeyuser_id dataNodedn1,dn2 rulesharding-by-intfile/ table nameorders primaryKeyorder_id dataNodedn1,dn2,dn3 rulemod-long/ /schema dataNode namedn1 dataHosthost1 databasedb1 / dataNode namedn2 dataHosthost2 databasedb2 / dataNode namedn3 dataHosthost3 databasedb3 / dataHost namehost1 maxCon1000 minCon10 balance1 writeType0 dbTypemysql dbDrivernative heartbeatselect user()/heartbeat writeHost hostmaster1 url192.168.0.1:3306 userroot password123456 readHost hostslave1 url192.168.0.2:3306 userroot password123456/ /writeHost /dataHost3.4 分库分表后的查询问题分库分表后跨分片的查询会变得复杂。MyCat提供了几种解决方案全局表小量的、需要频繁关联的表可以在所有节点冗余存储ER分片关联表按照相同规则分片使关联查询能在同一节点完成ShareJoinMyCat提供的跨分片Join实现手动拆分SQL将复杂查询拆分为多个简单查询在应用层聚合4. 生产环境实战经验4.1 部署架构建议对于生产环境我建议采用以下架构应用服务器 → MyCat集群 → (MySQL主从集群 × N)关键点MyCat本身无状态可以水平扩展每个分片对应一组主从复制的MySQL实例使用Keepalived或VIP实现MyCat的高可用监控所有组件的状态和性能指标4.2 数据迁移方案从单库迁移到分库分表架构需要谨慎处理双写方案新老系统同时运行应用层同时写入新旧两套库使用数据同步工具保证一致性逐步将读流量切到新库停机迁移停止服务导出全量数据按照分片规则导入到新库启动MyCat和新应用我推荐使用阿里云的DTS或开源的ShardingSphere-Scaling工具进行在线迁移。4.3 常见问题排查问题1MyCat响应慢检查后端MySQL性能分析MyCat的SQL解析和路由耗时查看是否有大事务或全表扫描问题2数据不一致检查主从复制状态验证分片规则是否正确排查是否有应用直连后端数据库问题3连接数暴涨调整MyCat的连接池配置检查应用是否有连接泄漏考虑增加MyCat节点5. 性能优化技巧经过多个项目的实践我总结了一些关键优化点分片键选择选择查询频繁的字段避免选择可能不均匀分布的字段考虑使用复合分片键索引设计每个分片表都需要建立合适的索引全局查询需要特殊考虑避免跨分片的排序和分组MyCat配置调优# 调整线程池大小 processor.executor.size16 # 增加堆内存 server.xml中配置: property namememoryPageSize64k/property property namespillsFileBufferSize1k/propertySQL编写规范避免使用SELECT *明确指定分片键条件减少跨分片事务合理使用MyCat的注解强制路由6. 监控与维护完善的监控是稳定运行的保障。建议监控以下指标MyCat层面连接数QPS/TPS请求耗时分布后端节点健康状态MySQL层面主从延迟慢查询锁等待资源使用率可以使用PrometheusGrafana搭建监控系统关键指标包括mycat_connection_countmycat_backend_response_timemysql_slave_lag_secondsmysql_global_status_questions定期维护工作检查数据分布是否均衡优化表结构和索引清理历史数据验证备份恢复流程在实际项目中我们曾遇到一个分片数据倾斜的问题。某个用户异常活跃导致其所在分片的数据量是其他分片的5倍多。最终通过调整分片算法增加了用户ID的哈希盐值解决了这个问题。这提醒我们分片策略不是一劳永逸的需要根据业务发展不断调整优化。