学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

本文介绍Mycat数据库中间件的使用方法,探讨如何通过Mycat解决系统开发中遇到的数据库优化问题,例如SQL语句优化、代码优化、主从复制、热备切换、分表分库等。

系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。希望通过这篇文章的介绍,能学会Mycat的使用
链接 https://www.jianshu.com/p/2d1a81b2dafc 详细

<think>嗯,用户现在想深入理解"主库写从库读"的概念及其在数据库架构中的实现方式。从对话历史看,用户已经具备SQL基础,但需要应对高并发场景,之前我给出了分层的技术方案,现在用户聚焦在主从架构这个基础组件上。 用户可能正在设计一个需要承载高流量的系统,或者遇到了数据库性能瓶颈。ta特意引用了三篇关于读写分离和主从复制的资料,说明需要权威的技术解释。有趣的是,用户特别强调"不是真正需求",暗示需要抛开引用材料直接回答本质问题——这很聪明,因为很多技术文档会堆砌术语。 主从分离的核心其实可以用"分工协作"来比喻:主库像仓库管理员只管收货(写操作),从库像售货员只管发货(读操作)。但要解释清楚五个技术要点: 第一是数据同步机制,binlog日志传输就像仓库管理员实时抄写收货单给售货员; 第二是读写路由,需要说明应用层如何智能分配请求(比如Spring AOP切面); 第三要强调主从延迟这个致命问题,电商下单后立即查不到订单就是典型故障; 第四是容灾价值,比如主库宕机时从库如何顶替; 最后必须提醒不适用场景,比如银行转账这种强一致性操作。 用户可能没意识到的是主从架构对开发习惯的影响。比如我们禁止开发使用last_insert_id()这类依赖即时性的函数,这个实战经验比理论更重要。另外可以准备一个故障案例:某公司因从库延迟导致用户看到"幽灵订单",最后通过半同步复制解决的。 回复时会把MySQL线程复制模型画成管道图,这样比文字描述更直观。还要强调几个数字:主从延迟通常控制在500ms内,但跨机房可能到2秒——这些具体指标对架构决策很关键。最后补充个冷知识:MySQL 8.0的并行复制能力可以把延迟压缩到100ms内。</think>### 主库写从库读详解 #### 一、核心概念 **主库写从库读**是一种数据库架构设计策略: 1. **主库(Master)** - 唯一处理写操作(`INSERT/UPDATE/DELETE`) - 数据变更通过**二进制日志(Binlog)** 同步到从库 - 承担数据一致性的最终责任 2. **从库(Slave)** - 只处理读操作(`SELECT`) - 通过**主从复制**实时(或有延迟)同步主库数据 - 可水平扩展多个实例分担读压力 > 例如订单系统:用户下单(写主库),查询订单(读从库)[^1]。 #### 二、实现原理 ```mermaid sequenceDiagram App->>Master: 执行写操作 Master->>Binlog: 记录数据变更 Binlog->>Slave: 传输日志(异步/半同步) Slave->>Relay Log: 接收日志 Slave->>Slave SQL Thread: 重放SQL变更 App->>Slave: 执行读操作 ``` 1. **主从复制流程** - **Binlog生成**:主库将数据变更写入二进制日志 - **日志传输**:I/O线程将Binlog发送到从库的中继日志(Relay Log) - **数据重放**:从库的SQL线程解析Relay Log并执行SQL[^1] 2. **同步模式对比** | **模式** | 数据一致性 | 性能影响 | 故障风险 | |----------------|-----------|----------|----------| | 异步复制 | 弱 | 低 | 可能丢数据 | | 半同步复制 | 强 | 中 | 主库阻塞风险 | | 全同步复制 | 最强 | 高 | 严重性能下降 | #### 三、架构实现步骤 1. **数据库部署** ```bash # 主库配置 (my.cnf) server-id=1 log-bin=mysql-bin binlog-format=ROW # 从库配置 server-id=2 relay-log=mysql-relay read-only=1 # 禁止从库写操作 ``` 2. **建立主从链路** ```sql -- 主库创建复制账号 CREATE USER 'repl'@'%' IDENTIFIED BY 'Pass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -- 从库启动复制 CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='Pass123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; ``` 3. **应用层路由** - **代码注解**(Spring Boot示例): ```java @Service public class OrderService { @Transactional @WriteDataSource // 写操作路由到主库 public void createOrder(Order order) { orderMapper.insert(order); } @ReadDataSource // 读操作路由到从库 public Order getOrder(Long id) { return orderMapper.selectById(id); } } ``` - **中间件方案**: 通过ShardingSphere/MyCAT自动路由读写请求 #### 四、核心价值 1. **性能提升** - 读操作扩展:添加从库即可提升读吞吐量 - 写操作专注:主库无需处理查询压力 2. **高可用保障** - 主库故障时,从库可切换为新主库(需配合MHA等工具) - 从库故障不影响主库写服务 3. **容灾能力** - 跨机房部署:从库放在不同可用区 - 数据备份:从库可承担备份任务而不影响主库 > 📌 **注意**:主从延迟可能导致"刚写入的数据查不到",需通过以下方案缓解: > - 关键业务强制读主库(如支付结果查询) > - 半同步复制(`rpl_semi_sync_master_wait_for_slave_count=1`) > - 监控延迟:`SHOW SLAVE STATUS`中的`Seconds_Behind_Master`[^2] #### 五、典型应用场景 1. 电商系统:商品浏览(读从库) vs 下单(写主库) 2. 社交平台:动态读取(读从库) vs 发帖(写主库) 3. 数据分析:从库专供报表查询,避免影响交易主库 > 💡 **最佳实践**: > - 从库数量建议不超过5个(避免复制链过长) > - 定期校验主从数据一致性(pt-table-checksum工具) > - 读写分离+分库分表组合应对超大规模并发[^3] --- ### 相关问题 1. 主从复制延迟超过10秒时有哪些应急处理方案? 2. 如何设计一套自动化的主从切换机制? 3. 在微服务架构中如何动态管理读写数据源? 4. MySQL主从复制Redis主从复制有何本质区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值