目录
前言: 面试中,经常被问到MySQL中主从同步的原理是什么?什么是主从延迟?如何解决主从同步延迟问题?
主从同步优势
随着业务量的增长,高并发,数据库服务器宕机等问题频繁出现,单台MySQL服务器将会成为系统瓶颈。
为了解决此问题,通常会使用集群主从同步模式(Master-Slave)来同步数据,通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力。
总结主从同步模式优势:
- 读写分离,缓解数据库压力(主数据库用来做数据写入,从数据库用来做数据读取);
- 一主多从,系统可拓展性和高可用性;
- 数据备份容灾,异地双活,保证主库异常随时切换,提高系统容错能力;
binlog
MySQL主从之间数据同步主要通过 binlog 日志实现。
binlog含义与作用
主要用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中,可以简单理解为记录的就是sql语句;
在实际应用中, binlog 的主要使用场景有两个:
- 用于主从复制,在主从结构中,binlog 作为操作记录从 master 被发送到 slave,slave 服务器从 master 接收到的日志保存到 relay log 中;
- 用于数据备份,在数据库备份文件生成后,binlog 保存了数据库备份后的详细信息,以便下一次备份能从备份点开始;
日志格式
binlog 日志有三种格式,分别为 Statement 、 Row 和 Mixed;
在 MySQL 5.7.7 之前,默认的格式是 Statement , MySQL 5.7.7 之后,默认值是 Row;
Statement格式 -- 基于SQL语句的复制,每一条会修改数据的sql都会记录在binlog中
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能;
缺点:由于记录的只是执行语句,但由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数(比如 uuid() 函数)之类的语句无法被记录复制;
Row格式 -- 基于行的复制,记录单元为每一行的改动,基本是可以全部记下来
优点:会记录每次操作的源数据与修改后的目标数据,绝对精准的还原,从而保证了数据的安全与可靠,并且复制和数据恢复过程可以是并发进行的;
缺点:可能会导致大量行的改动(比如alter table),这种模式的文件保存的信息太多,日志量太大;