导读 | MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。 |
Mysql 复制(Replication)
- 负载平衡(load balancing)
- 备份
- 高可用性(high availability)和容错
主要有三步(如下图):
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变它自己的数据。
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。 首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。 Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会休眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。所以slave上数据一般要慢于master上数据。即master与slave之间的数据在一定时间内会不同步。
Mysql 复制(Replication)类型
注,由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。
如果写操作较少,而读操作很多时,可以采取这种架构。你可以将读操作分布到其它的slave,从而减小master的压力。
但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。
这种架构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。
不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎)
用一个slave作为备用master,只进行复制
用一个远程的slave,用于灾难恢复
发送复制事件到其它slave,当设置log_slave_updates时,你可以让slave扮演其它slave的master。
此时,slave把SQL线程执行的事件写进自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它
MySQL级联复制(A->B->C)log_slave_updates
新上的两台服务器B和C,要替换掉之前旧的服务器A,同时,B和C是新的主从关系。因此,配置成级联复制,来迁移数据,也方便切换。
master A ——> slave B ——> slave C
有这么情况发生了,服务器B可以正常复制服务器A的数据,服务器B和C主从状态Slave_IO_Running和Slave_SQL_Running都是yes的,但是服务器C却无法复制新的数据。
1. 检查服务器B有没有开启二进制日志log_bin
2. log_slave_updates是否启用
log_slave_updates是将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中。
上面的问题是由于没有启用log_slave_updates = 1导致的。
因此,对于mysql级联复制,上游的从服务器不仅仅要开启log_bin还要开启log_slave_updates,否则将导致下游的从服务器无法更新复制。
注,Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。
主的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。
这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:
在第一个服务器上执行:
mysql> UPDATE tbl SET col=col + 1;
在第二个服务器上执行:
mysql> UPDATE tbl SET col=col * 2;
那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。
实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),
这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,
你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。
但是,可以通过其它一些方式来模拟这种多主服务器的复制。
注,这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。
注,这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。
总结:一般常用的两种复制类型一种是主从模式,另一种是一主多从模式。在这我们主要讲解主从模式复制。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/112803.html