MySQL 主从,六分钟带你掌握!
大家好,我是楼仔!
MySQL 主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多。
比如我之前面试小米,就被问到过主从复制的原理,以及主从延迟的解决方案,你之前面试,有遇到过哪些 MySQL 主从的问题呢?
1. MySQL 主从
1.1 什么是 MySQL 主从 ?
所谓 MySQL 主从,就是建立两个完全一样的数据库,一个是主库,一个是从库,主库对外提供读写的操作,从库对外提供读的操作。
1.2 为什么使用 MySQL 主从 ?
对于数据库单机部署,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和
10000 的 QPS,当遇到一些活动时,查询流量骤然,就需要进行主从分离。
大部分系统的访问模型是读多写少,读写请求量的差距可能达到几个数量级,所以我们可以通过一主多从的方式,主库只负责写入和部分核心逻辑的查询,多个从库只负责查询,提升查询性能,降低主库压力。
当主库宕机时,从库可以切成主库,保证服务的高可用,然后主库也可以做数据的容灾备份,整体场景总结如下:
读写分离:从库提供查询,减少主库压力,提升性能;高可用:故障时可切换从库,保证服务高可用;数据备份:数据备份到从库,防止服务器宕机导致数据丢失。
2. 主从复制
2.1 主从复制原理
MySQL 的主从复制是依赖于 binlog,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。
主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步地完成。
详细流程如下:
主库写 binlog:主库的更新 SQL(update、insert、delete) 被写到 binlog;主库发送 binlog:主库创建一个 log dump 线程来发送 binlog 给从库;从库写 relay log:从库在连接到主节点时会创建一个 IO 线程,以请求主库更新的 binlog,并且把接收到的 binlog 信息写入一个叫做
relay log 的日志文件;
从库回放:从库还会创建一个 SQL 线程读取 relay log 中的内容,并且在从库中做回放,最终实现主从的一致性。2.2 如何保证主从一致
当主库和从库数据同步时,突然中断怎么办?因为主库与从库之间维持了一个长链接,主库内部有一个线程,专门服务于从库的这个长链接。
对于下面的情况,假如主库执行如下 SQL,其中 a 和 create_time 都是索引:
delete from t where a