数据库如何实现主从同步
2020-02-14 本文已影响0人
摸摸脸上的胡渣
关键功臣
binlog
binlog不只是主从同步的功臣,更是MySQL变成流行框架的关键因素,几乎所有的高可用架构都是基于binlog实现的。
同步流程
slave 同步binlog格式
有三种
-
statement
内容:直接记录要执行的sql语句
image.png
优点:节省空间-相对row来说
缺点:当主从数据库的表结构-索引不一致时,可能会引起数据的误操作。
举例:假设有这样一个库
mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `t_modified`(`t_modified`)
) ENGINE=InnoDB;
insert into t values(1,1,'2018-11-13');
insert into t values(2,2,'2018-11-12');
insert into t values(4,4,'2018-11-10');
insert into t values(5,5,'2018-11-09');
按照a字段索引进行排序时,数据为
1,1,'2018-11-13'
2,2,'2018-11-12'
4,4,'2018-11-10'
5,5,'2018-11-09'
按照t_modefied字段索引进行排序时,数据为
5,5,'2018-11-09'
4,4,'2018-11-10'
2,2,'2018-11-12'
1,1,'2018-11-13'
可以看出来,按照不同索引进行排序,limit1对应的数据并不是一行。如果主库备库的索引结构不一致,或者是在主库更改索引结构完成、从库还没更改索引结构完成的间隙,执行了statement格式的binlog,那么就会出现主从数据不一致的问题。
数据库会认为这样的操作是有风险的,所以会在warning中记录一条数据。
-
row
内容:记录库名、表名、被操作数据的主键id,以及操作类型
image.png
优点:因为准确的记录主键id,所以不会出现binlog导致的主备库数据不一致。
缺点:相比于statement格式,row格式的数据会占用大量的空间。 - mixed
row+statement
数据库会根据sql语句的内容和类型,进行判断,认为用statement格式存储数据不会引起不一致时,就采用statement格式。当认为会出现,就采用row格式。