一、先把MySQL当成一个“记账本”

  • MySQL = 一个会记账的系统
  • 每一笔写操作(insert / update)都是一条账目
  • 它有两本帐:

1.1 redo log(草稿本)

  • 用来保证:突然断电也不丢帐
  • 只在本机使用

1.2 binlog(正式账本)

  • 用来主从复制
  • 数据恢复
  • 相当于给别人看的账本
    ps:所有复制,100%都是围绕binlog展开的

二、主从复制

主从复制 = 主库把自己的账本(binlog)复印一份,发给从库照着抄

2.1 角色分工

2.1.1 主库(Master)

  • 干活的人
  • 负责写的数据

配置文件my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin

2.1.2 从库(Slave)

  • 抄作业的人
  • 不干活,只照抄
[mysqld]
server-id=2

一个完整的写操作相当于:你执行一句SQL

INSERT INTO order VALUES (...)

实际是:

--1. 主库写数据
--2. 主库在 binlog 里记一笔账
--3. 从库把 binlog 拿走
--4. 从库照着执行一遍

三、异步/半同步复制的区别

区别不在从库执行快不快,而在主库等不到从库。

3.1 异步复制(默认的)

**白话版:**主库:帐我写完了,至于你抄没抄完,我不等了,我要接着干活
流程:

--   主库写完 binlog
-- → 立刻告诉客户端:成功
-- → 从库慢慢抄

好处: 快,性能高
坏处: 如果主库刚写完就挂掉了,从库可能还没抄到,这部分数据就丢失了

3.2半同步复制(安全一点)

主库:“至少要有一个人告诉我:账本我拿到了,你再给用户说成功”
流程:

主库写 binlog
→ 等一个从库说“我收到了” (返回ack)
→ 再返回成功

半同步数据不一定不丢失,只是保证至少有一份安全副本

四、GTID(Global Transaction Identifier)全局事务标识符

传统主从有个痛点:
主从是靠这个同步的:

binlog.000003 + position=154

一旦主库宕机换一个新主,位点就乱了,就相当于"你炒作业抄到第3页第154行,老师突然换了一本书",这时候就需要GTID来解决:
每一条事务都有一个唯一编号: UUID:事务编号
从库只关心是否执行过:执行过:跳过;没执行:补上
总结:

  • 主从:有延迟
  • 半同步:还是可能不一致
  • GTID:解决切换难,并不是解决一致性

五、MGR(MySQL Group Replication) / InnoDB Cluster

MGR = 写之前,大家先投票,同意了才写
流程:

我要写一条数据
→ 先发给其他节点看看
→ 大多数同意
→ 才真正提交

好处:

  • 不会脑裂(在网络分区或故障情况下,多个节点同时认为自己是主节点并对外写入,导致数据不一致甚至无法修复)
  • 所有节点数据是一致的
  • 自动选主
    坏处:
  • 性能较慢
  • 架构更复杂
    InnoDB Cluster = MGR + 自动化工具
    优化思想:
单机 MySQL
  ↓
主从复制(解决读多写少)
  ↓
半同步(少丢数据)
  ↓
GTID(切主简单)
  ↓
MGR(强一致)
  ↓
InnoDB Cluster(企业级 HA)

总结:

1.MySQL 主从复制的本质:用 binlog 把“写操作”从主库同步到从库。
带来的能力:

  • 读写分离
  • 数据备份(容灾)
  • 高可用(主挂可切换)
    2.类型对比:
类型 是否等待从库 是否丢数据 特点 场景
异步复制 不等待 可能丢失 性能最好 默认方案
半同步复制 至少等待一个 几乎不丢失数据 性能和安全平衡 生产首选
全同步(MGR) 多数等待 不丢失数据 强一致 金融核心

PS:能接受短暂不一致就不要用强一致

3.基于binlog位点的主从复制原理
1.复制链路

主库:写数据 → 写 binlog
↓
从库 IO 线程:拉 binlog → relay log
↓
从库 SQL 线程:重放 SQL

2.位点复制

  • 依赖file + position
  • 切主复杂
  • 容易出错
  • 生产环境基本不用

4.GTID复制
每一个事务一个全局唯一ID,格式:

UUID:transaction_id

优势:

  • 不关心binlog位点
  • 自动找缺失事务
  • 切主简单、安全
  • GTID把找数据同步位置的复杂度交给了MySQL

5.高可用路线

单机
↓
一主一从(异步)
↓
一主多从(GTID)
↓
一主多从 + 半同步
↓
自动切主(Orchestrator / ReplicaSet)
↓
InnoDB Cluster(MGR)

MySQL高可用不是一步到位,而是循序渐进,MySQL复制解决的是扩展性,半同步解决的是数据安全,自动切主解决的是可用性,MGR解决的是强一致。正常开发一般用:GTID 主从 + 半同步 + 自动切主,90%的情况都用不到MGR

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐