应用背景
为了提高应用数据库的整体性能,通常情况下需要配置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的模式记录日志;