参考文章:Mysql主从同步的原理
参考文章:Mysql数据库主从心得整理
一. 基本概念
主从同步就是当master(主)库的数据发生变化的时候,实时的将变化会同步到slave(从)库。
主从同步的优点:
- 水平扩展数据库的负载能力
- 增加容错率,提供高可用
- 数据备份
二. 基本原理
我们对数据库的所有操作都是在master上进行操作,当master上进行操作时,slave会快速的接收到这些操作信息,然后将这些操作作用在slave上,从而实现同步。
2.1 同步机制
- 在master机器上,所有的同步事件都会被写到一个特殊的日志文件(binary-log)中;
- 在slave机器上,slave从master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作;
2.2 binary-log的三种模式
- 基于SQL语句的复制(statement-based replication, SBR),会将对数据库操作的sql语句写入到binlog中;
- 基于行的复制(row-based replication, RBR),将每一条数据的变化写入到binlog中;
- 混合模式复制(mixed-based replication, MBR),Mysql决定什么时候用什么模式,默认为SBR模式;
SBR优点:
- binlog文件较小;
- binlog中包含了所有数据库修改信息,不仅可以用来复制,还可以用来还原;
- 主从版本可以不一样,从服务器版本可以比主服务器版本高;
SBR缺点:
- 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候;
- 调用具有不确定因素的 UDF 时复制也可能出疑问;
- INSERT … SELECT 会产生比 RBR 更多的行级锁;
RBR优点:
- 任何情况都可以被复制,最安全可靠;
- 从服务器上的表如果有主键的话,复制就会快很多;
- 执行 INSERT,UPDATE,DELETE 语句时锁更少;
- 从服务器上采用多线程来执行复制成为可能;
RBR缺点:
- binlog 大了很多;
- 复杂的回滚时 binlog 中会包含大量的数据;
- UDF 产生的大 BLOB 值会导致复制变慢;
- 不能从 binlog 中看到都复制了写什么语句(加密过的);
2.3 同步过程
Master : 当slave连接到master的时候,master机器会为slave开启binlog dump线程。
-
当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。
Slave :当主从同步开启的时候,slave上会创建2个线程.
- I/O 线程 :该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log(中继日志);
- SQL线程:该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。