主从复制
MySQL数据库支持同步复制,单向、异步复制,在复制的过程中一个服务器充当主服务器,而一个或多个服务器充当从服务器。
单向复制有利于健壮性、速度和系统管理:
l 健壮性:主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份,实现更加健壮的故障切换。
l 速度快:通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。
l 系统管理:可以使用一个从服务器执行备份,而不会干扰主服务器。【当你进行复制时,所有对表的更新必须在主服务器上进行】
数据复制的原理
MySQL的复制基于主服务器在二进制日志BinLog中跟踪所有对数据库的更改 (更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的更新,以便从服务器可以执行相同的更新。
认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。
将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。当我们执行表的无锁热备份时,则不再需要全局读锁定。
从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现,其中1个在主服务器上,另两个在从服务器上。
l 当发出STARTSLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。随后,会读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志RelayLog。
l 主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的BinlogDump线程。
l 第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
这样读取和执行语句被分成两个独立的任务,是一个典型的生产者消费者模式。I/O线程作为生产者,只负责获取更新,解决主从同步的问题。SQL线程作为消费者,只负责执行更新。而他们之间的RelayLog作为一个缓冲池子。
即使消费者执行更新很慢,也不影响生产者获取更新的速度,以便主服务器的更新能安全拷贝保存到本地从服务器的RelayLog中,供从服务器下次启动时执行。这样也便于主服务器上的二进制日志的清空,因为不再需要等候从服务器来索取其内容。
半同步复制
MySQL5.5除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。因此,MySQL一共提供了3个复制方式:同步,异步和 半同步。
MySQL默认采用的是异步复制模式,这种模式效率最高,但是一致性却很难保证。
在异步复制模式下,Master将事件写入binlog,但并不知道Slave是否或何时已经接收和处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上,这样就会造成数据丢失;而如果是多个Slave,只有部分接收到,就会出现一致性的问题。
因此,我们往往会牺牲部分的性能来换取数据的准确性:完整性 + 一致性。
所以半同步复制派上用场。
Comparison
u 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。 缺点:完成一个事务可能会有很大的延迟。
u 异步复制:当Slave准备好才会向Master请求binlog。Master不用等Slave,就不用阻塞。 缺点:不能保证一切事件都能够被所有的Slave所接收。
u 半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。
半同步复制是同步和异步的一个折中,损失一点性能来维持数据完整性和一致性。
Step by step for半同步复制
【半同步复制】在Master和Slave都要开启,才会起作用;否则,它依然为异步复制。
1. 当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
2. 一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
3. 当一个事务的事件已写入其relay-log且已刷新到磁盘上(未执行),Slave才会告知已收到。
4. 如果等待超时,也就是Master没被告知收到,此时Master会转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
参考博文: