Mysql - 主从复制
主从复制过程
- 主库把数据更改记录到二进制日志(Binary Log)中;
- 从库将主库上的二进制日志复制到自己的中继日中志(Relay Log);
-
从库读取中继日志中的事件,将其从放到从库数据之上。
image.png
主从复制模式
异步复制模式 (mysql async-mode) -默认模式
Mysql增删改查操作全部记录在binLog中,当salve节点连接master节点时,会主动从master节点处获取最新的binLog,并把binLog中的sql进行重新执行。
缺点:会造成主从复制延迟
![](https://img.haomeiwen.com/i12310730/e1018321155f017b.png)
半同步模式 (mysql semi-sync)
master需要接受到其中一台salve的确认信息,才会commit然后返回给用户;否则要等直到超时时间然后切换成异步模式再提交。可以使得主从复制延迟缩小,提高数据安全性,但是影响性能,响应时间变长。可以确保了事务提交后,binlog至少传输到一个slave,但不保证slave将此事务更新到db。
![](https://img.haomeiwen.com/i12310730/403a9e27b3655278.png)
全同步模式
全同步模式是指master和salve节点全部执行了commit并确认才会向客户端返回成功。
Mysql - 主从复制方式
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication,SBR),基于行的复制(row-based replication,RBR),混合模式复制(mixed-based replication,MBR)。分别对应了binlog的三种格式:
STATEMENT,ROW,MIXED。
-
STATEMENT方式(SBR)
每一条会修改数据的SQL语句都会记录到binlog中。
优点:并不需要记录每一条sql语句和每一行的数据变化,减少了binlog的日志量,节约IO,提高性能。
缺点:在某些情况下会导致主从数据不一致(如sleep,last_insert_id,now函数会出现问题)。 -
ROW方式 (RBR)
不记录每条SQL语句的上下文信息,仅需要记录哪条数据被修改,修改成什么样。不会出现函数调用问题,
缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。 -
MIXED方式 (MBR)
以上两种模式的混合,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,Mysql会根据执行的SQL语句选择日志保存方式。