mysql8开启主从模式 mysql主从模式缺点_mysql insert 不需要日志


应用背景

为了提高应用数据库的整体性能,通常情况下需要配置Mysql数据的读写分离,也就是一主多从的模式;数据库的写只发生在master角色的节点上,读发生在slave节点上,从而提高了数据库的读的吞吐量。

Mysql数据库是通过那些方式实现主从复制的呢?

Mysql数据库通过日志的方式实现主从复制,也就是常说的binlog,通常具有两种方式:

基于语句(Statement-based replication)和基于行(Row-based replication)(以下简称SBR,RBR);

问题:SBR(基于语句)有什么优点,又有什么缺点呢?

实现方式:当leader收到客户端的请求,也就是执行语句,然后将每一个insert,update,delete语句发送给slave节点;

优点:

  • 因为直接发送执行语句,所以会产生比较少的日志数量;并且当机器因为故障停机需要备份时,可以很快的完成数据的恢复;

缺点:

  • sql语句含有不确定的函数时,比如Now()或者Rand(),会使每一个slave节点产生不同的值,造成主从不一致;
  • sql表定义中auto_incrementde列或者依赖已存在的数据的语句,比如update ...where ..condition...,需要每个slave角色节点与master节点的执行顺序抑制,否则也会造成主从不一致的现象。

问题:RBR(基于行)有什么优点,又有什么缺点呢?

实现方式:

插入:对于插入,日志中会包含表定义所有列的值。

删除:删除会包含足够的信息标识需要删除的行,通常情况下是表中的主键;如果表中没有主键,日志会记录需要删除行的旧值;

更新:更新操作会包含信息标识需要删除的行,并包含更新列的新值;

优点:

  • 因为日志中记录的是表数据修改的逻辑日志,对于主从复制模式没有数据不一致的现象出现;
  • 相比SBR模式的复制模式,对于insert,udpate 和update语句会减少锁住行的数量,相应地提高数据库的并发。

缺点:

  • RBR模式相比SBR模式会产生更多的日志文件;对于数据修改语句(DML)比如update、delete会把每一行的数据修改都会产生一条日志;
  • 在日志中,不能看到用户执行的sql语句,只能看到每一行数据列的变化;
  • 对于BLOB等类型大的数据类型,会产生较大的主从复制延迟。

总结

Mysql数据库目前支持SBR,RBR和MIXED三种方式,通过数据库的配置文件(my.cnf)可以通过修改binlog的的复制模式,新版本的Mysql会根据执行的语句,动态选择日志复制方式;比如DDL语句会以SBR的方式复制,而DML语句一般选用RBR的方式进行日志记录;而像GRANT,REVOKE等语句已定会采用SBR的模式记录日志;