数据库如何实现主从同步

2020-02-14  本文已影响0人  摸摸脸上的胡渣

关键功臣

binlog
binlog不只是主从同步的功臣,更是MySQL变成流行框架的关键因素,几乎所有的高可用架构都是基于binlog实现的。

同步流程

slave 同步

binlog格式

有三种

  1. 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中记录一条数据。

  1. row
    内容:记录库名、表名、被操作数据的主键id,以及操作类型


    image.png

    优点:因为准确的记录主键id,所以不会出现binlog导致的主备库数据不一致。
    缺点:相比于statement格式,row格式的数据会占用大量的空间。

  2. mixed
    row+statement
    数据库会根据sql语句的内容和类型,进行判断,认为用statement格式存储数据不会引起不一致时,就采用statement格式。当认为会出现,就采用row格式。
上一篇下一篇

猜你喜欢

热点阅读