MySQL主从复制读写分离笔记

一、核心架构

1. 整体思路

  • 主库(Master) :负责 写操作(INSERT/UPDATE/DELETE/DDL)
  • 从库(Slave) :负责 读操作(SELECT)
  • 主从复制:主库数据实时同步到从库
  • 读写分离:应用层或中间件把读写路由到不同库

2. 优点

  • 读请求压力分摊到多台从库
  • 主库专注写,性能更稳定
  • 从库可做备份、报表、查询,不影响主库
  • 故障时可快速切换主从,提高可用性

3. 缺点

  • 存在主从延迟,读到旧数据
  • 架构变复杂,运维成本增加
  • 需处理一致性、延迟、切换问题

二、主从复制原理(必背)

1. 流程

  1. 主库执行事务,写入 binlog
  2. 从库 IO 线程连接主库,拉取 binlog → 写入 relay log
  3. 从库 SQL 线程读取 relay log,重放 SQL → 实现数据一致

2. 三种复制模式

  1. 异步复制(默认)主库提交不等待从库,性能高,可能丢数据

  2. 半同步复制 (推荐生产)主库等待至少一个从库 ACK 再提交,数据更安全

  3. 增强半同步 等待从库落盘 relay log 再返回,更安全

3. 三种 binlog 格式

  • STATEMENT:SQL 语句,体积小,可能不一致
  • ROW:行数据,最安全,推荐
  • MIXED:混合,自动选择

三、主从复制配置(最简模板)

1. 主库 my.cnf 关键配置

ini

复制代码
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

# 半同步
plugin_load_add = rpl_semi_sync_master.so
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000

2. 从库 my.cnf 关键配置

ini

复制代码
server-id = 2
read_only = 1
super_read_only = 1
relay_log = relay-bin
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = ON

# 并行复制
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8

3. 建立主从

  1. 主库创建复制账号

sql

复制代码
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  1. 从库执行

sql

复制代码
CHANGE MASTER TO
  MASTER_HOST='xxx.xxx.xxx.xxx',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123',
  MASTER_AUTO_POSITION=1;

START SLAVE;
  1. 检查状态

sql

复制代码
SHOW SLAVE STATUS\G

看到 Slave_IO_Running: Yes Slave_SQL_Running: Yes 即为正常


四、读写分离实现方式

1. 应用层实现(硬编码)

  • 业务代码里:
    • 写走主库数据源
    • 读走从库数据源
  • 优点:简单、灵活
  • 缺点:耦合重、维护麻烦

2. 中间件实现(生产主流)

常用工具:

  • Sharding-JDBC(Java 生态最强)
  • MyCat
  • ProxySQL
  • MaxScale
  • Amoeba

通用逻辑

  • 写请求 → 主库
  • 读请求 → 从库
  • 支持权重、负载均衡
  • 支持强制走主库(如刚写完立即读)

五、读写分离核心问题

1. 主从延迟(最常见坑)

表现:刚插入 / 更新,读从库查不到

解决方案:

  • 关键业务 强制走主库
  • 使用半同步 + 并行复制
  • 监控延迟,自动剔除延迟过高从库
  • 业务设计允许短暂不一致

2. 数据一致性

  • 强一致:必须走主库
  • 最终一致:读写分离 + 接受短延迟
  • 金融 / 订单类:尽量主库读或使用 MGR

3. 从库故障

  • 中间件自动剔除不可用从库
  • 读流量切到其他从库 / 主库

4. 主库故障

  • 手动 / 自动切换主从
  • 中间件修改路由指向新主库

六、生产最佳实践

  1. 一主多从:1 主 + 2~3 从
  2. 读多写少场景效果最好
  3. 必须开启 GTID,方便切换
  4. 必须开启 半同步复制
  5. 从库设置 read_only 防止误写
  6. 读写分离中间件做健康检查、负载均衡
  7. 监控:复制状态、延迟、连接数、TPS/QPS
  8. 刚写完立刻要读的接口,强制路由主库

七、面试高频问答

  1. **读写分离解决什么问题?**分担读压力,提升数据库整体吞吐量。

  2. **主从延迟怎么解决?**强制主库读、并行复制、优化大事务、中间件剔除延迟节点。

  3. **半同步和异步区别?**异步不保证同步,半同步保证至少一个从库收到日志。

  4. **GTID 好处?**自动定位事务位置,主从切换更简单。

  5. **读写分离后怎么保证强一致?**关键读走主库,或使用 MGR 强一致集群。

相关推荐
dishugj9 分钟前
HANA 数据库备份与恢复
数据库·oracle
前进的李工16 分钟前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain
达梦产品与服务16 分钟前
稳扎稳打,持续迭代 | SQLark V3.10 更新,30+ 项优化与修复
mysql·oracle·达梦数据库·pg·sqlark百灵连接
難釋懷37 分钟前
Redis网络模型-IO多路复用模型-poll模式
网络·数据库·redis
dFObBIMmai38 分钟前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python
treesforest1 小时前
IP精准定位服务:从城市轮廓到街道坐标,技术如何重塑空间感知
网络·数据库·网络协议·tcp/ip·ip
大明者省1 小时前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu
Teable任意门互动2 小时前
AI原生开源多维表格有哪些?主流开源多维表格对比解析
数据库·开源·excel·钉钉·飞书·开源软件·ai-native
TDengine (老段)2 小时前
MNode 内部机制深度解析 — SDB、事务引擎与 DDL 处理全链路
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
这个DBA有点耶2 小时前
数据库上云 vs 自建:从成本到人力的三维对比与决策框架
数据库·经验分享·sql·创业创新·dba