MySQL 主从复制:数据库的"克隆军团"
MySQL 主从复制:数据库的"克隆军团" ?♂️
如果说数据库世界也有科幻电影,那么 MySQL 的主从复制绝对堪比《星球大战》中的克隆人军队,一个原版,无数复制品,却保持着惊人的同步...
什么是主从复制??
MySQL 主从复制是一种数据库技术,允许将一台 MySQL 数据库服务器(主库)的数据精确地复制到一台或多台其他 MySQL 服务器(从库)上。简单来说:就是让一台主数据库服务器自动克隆自己的所有数据变化到其他服务器上,形成数据的"克隆军团"。
主从复制的"科幻原理" ?
场景:秘密克隆实验室
首席科学家(主库):"我对这个基因做了修改,所有克隆体也要一模一样!"
助手:"那我们怎么保证每个克隆体都准确复制您的改动?"
首席科学家:"很简单,我会把每一步操作记录在日志里,然后你按照日志一模一样地在克隆体上重复操作!"
三个关键步骤:
记录变化(Binlog) - 主库记录所有数据变更到二进制日志
传输日志(I/O 线程) - 从库请求并接收主库的变更日志
重放变化(SQL 线程) - 从库重放日志中的操作,实现数据同步
主从复制的三种玩法 ?
1. 异步复制 - "放心去做,我迟点跟进"
主库:"我已经完成了交易记录,客户可以走了!"
从库:"好的,我收到日志后会尽快更新!"
客户:"太好了,交易成功!"
[片刻后...]
从库:"我也更新完成了!"
特点:
- 主库不关心从库是否跟上
- 性能最高,延迟不定
- 主库宕机风险最大
2. 半同步复制 - "给我个确认再说"
主库:"我刚完成了交易记录,但我需要至少一个从库确认收到日志才算完成!"
从库A:"收到日志了!"
主库:"太好了,现在客户可以走了!"
客户:"交易成功!"
[此时,从库A还没应用日志,但已保证不会丢失]
特点:
- 主库等待至少一个从库接收日志
- 平衡了性能和数据安全
- 只保证日志传输,不保证应用
3️. 组复制(MGR) - "民主投票决定一切"
场景:克隆人议会
主库:"我有数据要变更,大家投票!"
从库A:"同意!"
从库B:"同意!"
从库C:"同意!"
主库:"多数同意,变更通过并同步执行!"
特点:
- 基于多数派共识协议
- 自动故障转移
- 最安全但性能较低
主从复制的超能力 ?
1. 读写分离 - "分身有术"
应用:"我需要处理大量数据!"
DBA:"别担心,写操作去找主库,读操作去找众多从库!"
主库:"我专注处理更新操作!"
从库军团:"我们负责分担查询压力!"
效果:写入集中到主库,读查询分散到多个从库,大大提高系统整体吞吐量
2. 数据备份 - "保险箱"
运维:"主库上的数据太重要了,如果服务器着火怎么办?"
DBA:"别担心,我们可以从'克隆体'上备份,不影响原版工作!"
主库:"让我专心工作!"
从库:"我来承担备份任务!"
效果:可以在从库上执行备份,不影响主库性能
3. 高可用 - "永生不死"
灾难来临...
主库:"我...感觉...不行了..." [宕机]
监控系统:"主库挂了!立刻从克隆军团中选出新领袖!"
从库A:"经检测,我数据最新,我来接管!"
应用:"我完全没感觉到服务中断!"
效果:当主库故障时,可以立即提升从库为新主库,保证服务可用性
主从架构花样玩法 ?️
1. 一主多从 - "一个原版,多个复制品"
主库(Master)
/ \
/ \
从库1 从库2
/
从库3
适用场景:读多写少的应用,可以无限扩展读取能力
2. 主主复制 - "双胞胎互为备份"
主库A <-----> 主库B
| |
从库A1 从库B1
适用场景:需要在多地写入,但数据量不大的情况
3. 级联复制 - "传话游戏"
主库 -> 中间从库 -> 从库A
-> 从库B
适用场景:减轻主库复制压力,适合从库数量庞大的情况
主从复制面临的挑战 ?
1. 延迟问题 - "跟不上节奏"
场景:繁忙的数据中心
主库:"我已经处理了10000个事务!"
从库:"等等我...我才同步到5000个..." [喘气]
应用:"咦?为什么我刚写入的数据在从库上看不到?"
解决方案:
- 优化从库服务器配置
- 使用并行复制
- 适当减轻主库写入压力
2. 数据不一致 - "复制出错"
场景:数据实验室
科学家:"为什么这个克隆体和原版不一样?"
助手:"可能是复制过程中出现了突变..."
科学家:"赶紧修复!"
解决方案:
- 使用基于 GTID 的复制
- 定期进行一致性检查
- 出现不一致时重建从库
3. 复制中断 - "断片了"
场景:突发事件
从库:"主库?主库?你能听到我吗?"
主库:"..." [无响应]
从库:"我该继续等还是自行决定下一步?"
解决方案:
- 使用半同步复制
- 实施主从监控
- 配置自动故障转移
配置主从复制的简易指南 ?️
主库配置
# my.cnf 主库配置
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
从库配置
# my.cnf 从库配置
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read_only = ON
启动复制
-- 在从库上执行
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='复制用户',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;
主从复制的冷知识 ❄️
MySQL 5.7 以后支持多源复制 - 一个从库可以同时从多个主库复制数据
复制过滤器可以只复制特定的数据库或表 - 你可以只克隆你想要的"基因"
基于 GTID 的复制让从库重连更智能 - 不用再记住"我看到哪一页了"
主从复制也可以是异构的 - 不同版本的 MySQL 之间也可以复制,甚至可以复制到 MariaDB
"在数据库的世界里,主从复制就像是最成功的克隆技术,不仅创造了相同的个体,还能保持它们的思想同步。"
—— 匿名数据库架构师
下次面试官问你 MySQL 主从复制,放轻松!记住:那不过是一群有着完美同步能力的数据库克隆人而已!?♂️