2、 MySQL 主从复制与读写分离

01 主从复制基础

为什么需要主从复制

  • 缓解单台数据库的读压力,为高可用和故障切换提供基础。
  • 主从复制本身不等于自动故障切换,也不能替代备份。

基本概念

  • 主库(Source/Master):处理写入并产生 binlog。
  • 从库(Replica/Slave):获取并应用主库的变更。
  • 常见架构:一主一从、一主多从,也可级联复制。

binlog 二进制日志

  • 记录数据库变更事件,主要用于复制与时间点恢复。
  • 常见格式:STATEMENT(SQL)、ROW(行变更)、MIXED(混合)。
  • SELECT 等普通查询通常不作为数据变更写入 binlog。

02 主从复制工作原理

核心日志

  • binlog:主库的二进制日志。
  • relay log:从库接收并暂存的中继日志。

核心线程

  • 主库 binlog dump 线程:向从库发送日志事件。
  • 从库 I/O 线程:接收事件并写入 relay log。
  • 从库 SQL/applier 线程:读取 relay log 并应用变更。

复制流程

  • 主库提交事务并记录 binlog。
  • 从库 I/O 线程连接主库并接收 binlog 事件。
  • 从库将事件写入 relay log。
  • 从库应用线程执行事件,更新从库数据。

复制特点

  • MySQL 常见复制默认是异步的。
  • 复制存在延迟,主库已提交的数据不一定立刻能从从库读到。
  • 现代版本可支持并行应用,不要笼统认为从库只能串行回放。

03 复制模式与延迟

复制模式

  • 异步复制:主库不等待从库确认,性能较好,但故障时可能丢失尚未复制的数据。
  • 半同步复制:主库等待至少一个从库确认收到日志后再返回,确认不等于从库已执行完成。
  • 增强半同步:可在提交阶段等待确认,具体行为取决于版本与配置。

主从延迟原因

  • 主库写入量大、从库应用能力不足。
  • 网络延迟、磁盘 I/O 或硬件性能差异。
  • 大事务、锁等待、从库查询负载高。

延迟排查与优化

  • 查看复制线程状态、延迟指标和错误信息。
  • 检查网络、磁盘、CPU、慢查询与大事务。
  • 适当提升从库资源、优化 SQL、考虑并行复制。

04 主从复制配置(MySQL 5.7 常见流程)

主库准备

  • 配置唯一 server_id。
  • 开启 log_bin(二进制日志),并重启或按版本要求使配置生效。
  • 创建复制账号,仅授予 REPLICATION SLAVE 等必要权限。
  • 记录 SHOW MASTER STATUS 的日志文件名与位置(传统 file/position 方式)。

从库准备

  • 配置与其他节点不重复的 server_id。
  • 确保已有一致的初始数据。
  • 配置主库地址、复制账号及 binlog 文件/位置,或使用相应版本的 GTID 配置。

启动与验证

  • 传统命令:START SLAVE;新版本常用 START REPLICA。
  • 检查:SHOW SLAVE STATUS\G;新版本可用 SHOW REPLICA STATUS\G。
  • 重点关注 I/O 与 SQL 线程状态、Last_IO_Error、Last_SQL_Error、延迟指标。

关键注意事项

  • 初始化数据必须与复制起点匹配,否则容易报错或数据不一致。
  • server_id 在复制拓扑中应唯一。
  • 生产环境不要直接照搬示例密码,应限制复制账号来源并妥善保管凭据。

05 常见故障与排查

I/O 线程无法连接

  • 检查主从网络、端口、防火墙与 DNS/地址。
  • 检查复制账号、密码、来源主机限制和复制权限。
  • 核对主库 binlog 是否开启、日志文件与复制位点是否有效。

SQL 应用线程报错

  • 查看 Last_SQL_Error,确认具体失败事件。
  • 检查主从数据是否存在差异、表结构是否一致。
  • 不要随意跳过复制错误,先判断是否会造成数据不一致。

重新建立复制

  • 先确认数据基线与复制位点/GTID 一致。
  • 修复配置或重新初始化数据后,再重新启动复制。
  • 修改复制源配置的具体命令随 MySQL 版本而异。

06 读写分离基础

基本原理

  • 写请求通常路由到主库,读请求可分发到一个或多个从库。
  • 底层依赖主从复制,读写分离负责请求路由。

优点与限制

  • 优点:分摊读压力、提高读取扩展能力。
  • 限制:复制延迟会导致读到旧数据,写压力仍主要由主库承担。
  • 刚写后必须读到最新值的场景,可考虑读主库或设计一致性策略。

实现方式

  • 应用层:业务代码分别连接主库和从库,简单直接但与代码耦合。
  • 代理/中间件层:统一接入并路由 SQL,需要考虑中间件高可用与维护。

读写路由注意点

  • 不能仅凭 SQL 是 SELECT 就断定一定可以走从库(事务、锁定读等场景需谨慎)。
  • 从库也可能承担读请求之外的复制与维护负载。
  • 读写分离不自动解决数据一致性、主库故障切换和备份问题。

07 MyCat 与中间件基础

中间件的作用

  • 位于应用与 MySQL 之间,负责连接管理、SQL 路由及读负载分配。
  • 常见方案/产品需按当前维护状态与业务环境选型。

MyCat 常见配置概念

  • server.xml:用户、权限与逻辑库等接入配置。
  • schema.xml:逻辑库、数据节点、后端主机组及读写节点关系。
  • rule.xml:分库分表相关规则(基础读写分离通常不必深入)。

常见术语

  • schema:逻辑库。
  • dataNode:数据节点。
  • dataHost:后端数据库主机组。
  • writeHost / readHost:写节点 / 读节点。

理解

  • 中间件按配置路由读写请求,底层仍需要 MySQL 复制。
  • 中间件本身也要考虑高可用、连接数、监控和故障处理。

08 复习

高频问题

主从复制为什么需要 binlog 和 relay log?
  • binlog:主库上的二进制日志,记录所有数据变更事件,是主从复制的数据源。
  • relay log:从库本地的中继日志,用来暂存从主库拉过来的 binlog 事件,避免 SQL 线程回放慢时阻塞网络传输。
  • 简单说:binlog 负责"记录变更",relay log 负责"缓冲日志"。
I/O 线程与 SQL 线程分别做什么?
  • 从库 I/O 线程:连接主库,拉取 binlog 事件,写入本地 relay log。
  • 从库 SQL 线程:读取 relay log,回放其中的事件,把变更应用到从库数据。
  • 主库侧还有一个 Binlog Dump 线程,负责把 binlog 推送给从库。
主从复制的完整流程是什么?
  • 主库执行写操作,把变更写入 binlog。
  • 从库 I/O 线程连接主库,主库 Dump 线程按位点或 GTID 推送 binlog。
  • 从库 I/O 线程把收到的事件写入 relay log。
  • 从库 SQL 线程读取 relay log 并重放,最终与主库数据一致。
  • 从库持续上报已消费位点,主库继续推送新事件。
异步复制与半同步复制有什么区别?
对比项 异步复制 半同步复制
返回时机 主库写完 binlog 即返回 至少一个从库收到 binlog 后才返回
性能 最好 略有增加
数据安全 主库宕机可能丢数据 丢数据风险更低
适用场景 非核心读扩展 对一致性要求较高的写业务
主从延迟有哪些原因,如何排查?

常见原因

  • 从库 SQL 线程单线程回放,跟不上主库并发写入。
  • 大事务、批量 DDL/DML 阻塞回放。
  • 从库读压力大,CPU、IO 被查询占用。
  • 网络延迟或带宽不足。
  • 主库写入量突增,binlog 产生过快。
  • 未开启并行复制。

排查方法

  • 从库执行 SHOW SLAVE STATUS\G,查看 Seconds_Behind_Master。
  • 检查 Slave_IO_Running、Slave_SQL_Running 是否正常。
  • 查看从库 CPU、IO、慢查询、锁等待。
  • 检查是否有大事务、relay log 堆积、磁盘空间不足。
  • 必要时开启并行复制、拆分大事务、把强一致性读切回主库。
主从复制失败时,先检查哪些状态与日志?
  • SHOW SLAVE STATUS\G。
主从复制、读写分离、高可用和备份有什么区别?
  • 主从复制:数据同步机制,保证从库和主库数据一致。
  • 读写分离:流量路由策略,写走主库、读走从库。
  • 高可用:主库故障时能快速切换,保证服务持续可用,通常还需要 MHA、MGR、Orchestrator 等组件。
  • 备份:历史数据快照,用于误删恢复、归档和灾备,不能替代实时复制。
  • 主从复制是数据同步基础,读写分离是读扩展手段,高可用解决故障切换,备份解决数据恢复,四者互补但不能互相替代。

实操检查清单

  • 确认主从 server_id 不重复、binlog 已开启。
  • 确认复制账号和网络连通性。
  • 确认初始数据与复制起点匹配。
  • 检查复制状态、错误字段和延迟指标。
  • 通过写入主库、查询从库验证同步。
相关推荐
收纳过往2 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
咖啡八杯2 小时前
Redis 工具封装:RedisCache 对 Operations 体系的二次封装
java·数据库·redis·缓存·框架·springboot·若依
PaperData2 小时前
2000-2025年地级市科技支行设立数据
数据库·科技
实泽有之,无泽虚之2 小时前
ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务问题原因及解决办法
数据库·oracle
牧瀬クリスだ2 小时前
Redis Hash实战:高效存储对象与购物车
java·数据库·redis·算法·哈希算法
A小码哥2 小时前
【外】水星3号实测 1068 token 每秒靠谱吗
数据库
秋饼3 小时前
MySQL 分库分表完全指南:ShardingSphere-JDBC 实战、分片键选型、场景边界、20 个生产坑与 30 道面试点
java·mysql·面试·shardingsphere·分库分表·后端架构
qq_452396233 小时前
第六篇:《SQL 优化的艺术:从慢查询到毫秒级响应》
数据库·sql
ShineWinsu3 小时前
对于Qt:QWidget通用属性的解析—上
数据库·qt·microsoft·面试·gui·属性·qwidget