### 重点内容
1. 简单描述下主从复制实现过程
2. 主从复制有几个原理,各种优缺点是什么?
3. 有几种主从复制模式
### 参考
[基于 Docker 的 MySQL 主从复制搭建](https://www.jianshu.com/p/ab20e835a73f)
### 主从复制的基本逻辑
基于bin-log日志,主服务器记录日志到二进制日志Binary log里面,从服务器启动一个I/O thread进程读取主服务器二进制日志,写入到从服务器Realy log里面。然后从服务器开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。
### 主从复制的原理
* 基于 SQL 语句的复制(statement-based replication, SBR);
* 基于行的复制(row-based replication, RBR);
* 混合模式复制(mixed-based replication, MBR);
* 基于 SQL 语句的方式最古老的方式,也是目前默认的复制方式,后来的两种是MySQL 5 以后才出现的复制方式。
### 优缺点
#### RBR(基于行)
优点:
* 任何情况都可以被复制,跟其他数据库复制技术相同,有主键复制快
缺点:
* binlog 大;
* UPDATE时每条数据变化都会写到 binlog 中,导致频繁发生 binlog 的并发写问题;
* 无法从 binlog 中看到都复制了写什么语句。
#### SBR(基于sql)
优点:
* 历史悠久,技术成熟;
* binlog 文件较小;
* binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况;
* binlog 可以用于实时的还原,而不仅仅用于复制;
* 主从版本可以不一样,从服务器版本可以比主服务器版本高。
缺点:
* 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候;
* 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁;
* 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响;
* 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错;
* 执行复杂语句如果出错的话,会消耗更多资源。
### 主从复制的几种模式
1. 一主多从
2. 主主复制
3. 主动—被动模式的Master-Master(Master-Master in Active-Passive Mode)
4. 带从服务器的Master-Master结构(Master-Master with Slaves)
5. MySQL-5.5支持半同步复制