为保证数据库的高可用性,可以采用冗余的方式,但是数据冗余带来的问题是数据一致性问题。主从模式就是该方式的一种集群实现架构,其主要优势就是简单灵活,能满足多种需求。是一种比较主流的用法,同时其劣势也很明显:写操作高可用需自行处理。
MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库中的所有数据库,或者特定的数据库,或者特定的表。
主从复制模式离不开Binlog(参见MySQL架构原理之存储引擎InnoDB_Redo Log和BinLog - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)) 。
由上图示可知主从复制整体分为以下三个步骤:
1)主库将数据库的变更操作记录到Binlog日志文件中;
2)从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中;
3)从库读取中继日志信息在从库中进行Replay,更新从库数据信息。
在上述三个过程中,涉及了Master的BinlogDump Thread和Slave的I/O Thread、SQL Thread,它们的作用如下:
1)Master服务器对数据库更改操作记录在Binlog中,BinlogDump Thread接到写入请求后,读取Binlog信息推送给Slave的I/O Thread。
2)Slave的I/O Thread将读取到的Binlog信息写入到本地Relay Log中。
3)Slave的SQL Thread检测到Relay Log的变更请求,解析relay log中内容在从库上执行。
如下是异步复制时序图:
上述过程都是异步操作,俗称异步复制;既然是异步就必然存在数据延迟现象,如果宕机那必然导致数据丢失。
存在问题就得解决,怎么解决呢?使用:1)半同步复制---解决数据丢失的问题;2)并行复制----解决从库复制延迟的问题。
半同步复制:
为了提升数据安全,MySQL让Master在某一个时间点等待Slave节点的 ACK(Acknowledgecharacter)消息,接收到ACK消息后才进行事务提交,这也是半同步复制的基础。介绍半同步复制之前先快速过一下 MySQL 事务写入碰到主从复制时的完整过程,主库事务写入分为 4个步骤:
1)InnoDB Redo File Write (Prepare Write)
2)Binlog File Flush & Sync to Binlog File
3)InnoDB Redo File Commit(Commit Write)
4)Send Binlog to Slave
当Master不需要关注Slave是否接受到Binlog Event时,即为传统的主从复制。
当Master需要在第三步等待Slave返回ACK时,即为 after-commit,半同步复制。
当Master需要在第二步等待 Slave 返回 ACK 时,即为 after-sync,增强半同步。
下图是 MySQL 官方对于半同步复制的时序图,主库等待从库写入 relay log 并返回 ACK 后才进行Engine Commit。
其流程总结如下:
1)Master服务器对数据库更改操作记录在Binlog中,BinlogDump Thread接到写入请求后,读取Binlog信息推送给Slave的I/O Thread。
2)Slave的I/O Thread将读取到的Binlog信息写入到本地Relay Log中。
3):
3-1)当Master需要在Binlog File Flush & Sync to Binlog File时等待 Slave 返回 ACK 时,即为 after-sync,增强半同步。
3-2)当Master需要在InnoDB Redo File Commit(Commit Write)时等待 Slave 返回 ACK 时,即为 after-commit,半同步复制。
即SlaveACK的时机直接影响Master Commit。
4)Slave的SQL Thread检测到Relay Log的变更请求,解析relay log中内容在从库上执行。
同步复制:
MySQL的主从复制延迟一直是受开发者最为关注的问题之一,MySQL追加并行复制功能,目的就是为了改善复制延迟问题,并行复制称为enhanced multi-threaded slave(简称MTS)。在从库中有两个线程IO Thread和SQL Thread,都是单线程模式工作,因此有了延迟问题,我们可以采用多线程机制来加强,减少从库复制延迟。(IO Thread多线程意义不大,主要指的是SQL Thread多线程)。
并行复制的实现都是基于上述SQL Thread多线程思想,不断优化,减少复制延迟。
以上可以理解为MySQL主从模式实现理论,后续将进行三种复制方式的实践。