【MySQL 高可用 / 复制 / 集群零基础版】
·
一、先把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
更多推荐




所有评论(0)