mysql replication是mysql一个很重要的功能,主要用于主服务器和从服务器之间的数据复制操作。

mysql复制是指从一个mysql主服务器(master)将数据复制到另一台或者多台mysql从服务器(salves)的过程,

将主数据库的DDL和DML操作通过二进制日志传到从服务器上,

然后在从服务器上对这些日志重新执行,从而使得主从服务器的数据保持同步。

在mysql中,复制操作是异步进行的,slaves服务器不需要持续的保持连接接受master服务器的数据。

mysql支持一台主服务器同时向多台从服务器进行复制操作,从服务器同时可以作为其他从服务器的主服务器。

如果mysql主服务器的访问量比较大,可以通过复制数据,然后在从服务器上进行查询操作,从而降低主服务器访问压力,

同时从服务器作为主服务器的备份,可以避免主服务器因为故障数据丢失的问题。

复制操作大致可以分为3个步骤:

1、主服务器将数据的改变记录到二进制日志(binary log)中;

2、从服务器将主服务器的binary log复制到它的中继日志(relay log)中;

3、从服务器重做中继日志的事件,将数据的改变与主服务器保持同步。

看起来原理还是很简单的。

更详细的过程如下:

首先,主服务器会记录二进制日志,每个事务更新数据完成之前,主服务器将这些操作的信息记录在二进制日志里面(为什么是二进制的,不是文本文档),

在事件写入二进制日志完成后,主服务器通知存储引擎提交事务。

slave上的I/O进程连上master,并发出日志请求,master收到来自slave的I/O进程的请求后,

通过负责复制的I/O进程根据请求信息读取制定日志指定位置之后的日志信息,

返回给slave的I/O进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到master端的bin-log文件的名称以及bin-log的位置。

slave的I/O进程接受到信息后,将接受到的日志内容一次添加到slave端的relay-log文件的最末端,

并将读取到的master端的bin-log文件名和位置记录到master-info文件中(这个master-info文件是在master上还是在slave上呢?)

slave的sql'进程检测到relay-log中新增加的内容之后,马上解析relay-log的内容成为在master端真实执行时候的那些可执行内容,并在自身执行。


mysql复制环境,90%以上都是一个master带一个或者多个slave的架构模式,如果master和slave的压力不是太大的话,

异步复制的延时一般很少,尤其是slave端的复制方式改成两个进程(I/O和sql?)处理之后,更是减少了slave端的延时。

 

对数据实时性要求不高的应用,只要通过廉价的电脑服务器来扩展slave的数量,将读压力分散到多台slave上,

即可解决数据端的读压力瓶颈。