mysql的主从复制原理

    在mysql主从复制架构中,有一台服务器作为MASTER服务器,该服务器负责所有的读请求和写请求。另外一台或多台作为slave服务器。当master上的某个应用程序发起写请求时,该请求会被内核响应并在内核中执行,然后在将其数据写入到磁盘中去。并且将此次的操作以事件的形式记录到二进制文件中去。此时master上的Binlog  dump thread等待slave上的I/O thread连接请求。一旦slave I/O thread连接上了master的Binlog dump thread,则Binlog dump thread会将本地二进制文件中更新的事件复制给slave。当slave上的I/O thread接受从master复制过来的二进制文件中的事件时,会将其事件写入到slave上的中继日志文件中。然后slave会调用本地的SQL thread重新应用(或回放)中继日志中的事件,然后在将其数据写入到slave上的磁盘中。这就是mysql的主从复制功能。

由于slave上更新的数据不能复制给master,因此,对于slave而言,不能执行写操作。


mysql的三中复制模式:

1)异步模式(mysql默认复制模式)、半同步和同步复制模式。(这里用到的是异步复制模式)


mysql主从复制具有以下功能:

1、实现mysql数据库的高可用性

2、可以辅助实现数据备份

3、可以异地容灾

4、实现服务器分摊负载,即通过mysql的读写分离来实现分摊负载。(这里只是简单的主从复制)


主从复制实现如下图所示:

wKioL1Usu2rDqCW4AAFc_qmsMKU151.jpg

上图原理说明:

1.Binlog dump thread:接受slave  I/O thread的连接请求,并将master上的二进制文件中更新的事件复制给slave I/O thread。

2.slave I/O thread:接受Binlog dump thread复制过来的时间,并将其写入到slave上的中继日志文件中。

3.slave SQL thread:读取中继日志文件中的事件重新应用(或回放),并将其数据写入到磁盘中去。


mysql的主从复制需要注意的事项:

一个master可以用于多个slave,而一个slave只能属于某一个master,在主从架构中,如果只有一个slave,那么在slave上重新回放中继日志文件中的事件会引起数据库的改变,因此,这个过程也会以事件的形式写入到二进制日志文件中去。由于二进制日志是用来做及时点还原的,且master保存着一份完整的数据,因此在slave上不需要开启二进制日志功能,但是master上必须要开启。如果有多个slave的情况下,在这多个slave中,有一个slave即当做master的slave又可以当做其他slave的master,那么此时这个slave上必须开启二进制日志功能。即此时这个slave即充当slave又充当master。


下面开始配置:

1.实验环境:

我用的是2台Centos 6.5x86_64

IP地址分别为:

master.fpj.com   192.168.3.85

slave.fpj.com    192.168.3.86

mysql的安装我这里就不说了,可以用编译安装,也可以yum直接安装,我这边用yum直接安装,版本是mysql-5.1.73(里面修改的datadir目录这里就不写出来了)。


2.配置主mysql服务

1)启用二进制日志

2)定义serverID

3)创建具有复制权限的帐号

wKioL1Uso5_ByULWAABITNqb9q0310.jpg


wKiom1UspULgdgpOAAByKV4qhxY765.jpg

3.配置从mysql服务

1.关闭二进制日志,启动中继日志

2.定义server-id

3.使用有复制权限的帐号连接Master服务器

4.启动I/O线程和sql线程

wKioL1UsrmKQ1O1dAAAvlMDr5XU991.jpg


wKioL1UsrqrwUXn4AACTvygP5O8390.jpg

这里我直接start slave;直接启动I/O,SQL线程,也可以一个个启动;

wKioL1UsruGCuLwCAAA3pjqq5kQ408.jpg

下面就来查看下从服务器的状态:

wKioL1Usr5rQ7CHAAALYzC5AWG0411.jpg

4.我就来测试下master服务上新建一个fpjtest数据库:

wKiom1Usr5jCO_2TAADDHZZuxiE962.jpg


最后去从服务器上看看 fpjtest有没有同步过来:


wKiom1Usr_eDK33zAACelW5WfuY438.jpg


看上图已经同步过来了,说明mysql主从复制已经实现。