浅谈 MySQL binlog 主从同步

一、binlog 的基础知识

1,binlog 的概念

Server 层的日志系统(归档日志),binlog 中跟踪对其数据库的所有更改操作。是逻辑日志,以追加日志的形式记录。

2,binLog 的三种格式

1)statement

记录 SQL 语句的原文。风险点:如果主/从用到的索引不同,操作语句带 limit 时,处理的可能是不同行的记录数据。

2)row

仅记录某条记录的数据修改细节,不关系上下文。缺点:占用空间,同时写 binlog 很耗费 I/O 资源,影响执行速度。

3)mixed

一般语句使用 statement 格式保存,如果使用了一些函数,statement 格式无法完成主从复制的操作,采用 row 格式。MySQL 自己会判断这条 SQL 语句是否可能引起主备不一致,如果有可能就用 row 格式,否则就用 statement 格式。

二、主从同步的基础流程

  • 1、主库接收到更新命令,执行更新操作,生成 binlog
  • 2、从库在主从之间建立长连接
  • 3、主库 dump_thread 从本地读取 binlog 传送刚给从库
  • 4、从库从主库获取到 binlog 后存储到本地,成为 relay log(中继日志)
  • 5、sql_thread 线程读取 relay log 解析、执行命令更新数据

每个主/从连接都有三个线程,具有多个从库的主库会为每个连接创建一个 dump thread,每个从库都有自己的 I/O thread 和 sql thread。从库使用两个线程将读取主库 binlog 日志和执行更新操作分离开,通过 relay log 机制,使 binlog 的读取和执行互不影响。如果从库某段时间没有运行,重启后从库可以快速读取主库的 binlog 日志;如果从库在 sql thread 执行完 binlog 日志前停止,在重启后也可以在本地的 relay log 中读取到命令继续执行。

  • dump thread:在从库与主库创建连接后,主库创建 dump thread 日志将 binlog 发送到从库,如果该线程追上了主控,它将进入休眠状态知道主库发送信号通知其有新的事件产生时才会被唤醒

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。