### 重点内容

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支持半同步复制