从执行方法上看,有两种方式,一种是基于语句的复制,一种是基于行的复制。
顾名思义,语句复制的优点是,当更新十万条数据的sql,复制的时候仅需复制一个update的行。
行复制优点则在于可以完全正确的复制每一行。而不是先复制错误数据,再更新update。弊端就是当新的一个update进入时,行复制需要将所有更改的行全部写入binlog,这个日志事件就会很大。
如果在设置主从同步的时候没有制定复制方式,将默认以基于行的复制策略进行。但也不是一成不变的,当MYSQL发现语句无法被正确的执行,则会切换基于行的复制模式。所以是可以动态切换的。
行复制的优点:
- 几乎没有行复制处理不了的场景。
- 减少锁的使用。因为并不要求强串行化。
- 不需要语句复制那样创建执行计划并且执行查询,因此占有更少的CPU
- 能更快解决数据不一致的问题
行复制缺点: - 语句不在日志里做记录,所以不会知道执行了哪些SQL。(可能后续版本已经修复)
- 某些情况下基于行的复制找不到复制的行时,会导致复制的停止。
语句复制的优点: - 主从模式不同时,逻辑复制可以更好的工作。
- 执行的是SQL,容易定位问题
缺点: - 很多情况会导致无法复制。
从复制方式看,有如下几种方式: - 传统的主从
- 一主多从
- 主动模式的主-主复制
也就是两台服务器互相复制。缺点也很多,会导致的问题也很多。比如一台数据+1,一台数据X2.结果会导致一台内容为+1 X2 = 4 ,一台 X2 +1 = 3 。这种情况并不会报错。 - 主动-被动的 主-主模式
主要解决主主模式的问题 - 各自拥有从库的 主-主复制
优点是增加冗余,增加保障。 - 环形复制 A-->B-->C-->A
缺点很明显,挂了一个全都挂。 - 主-分发主库- N从库