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的读写分离来实现分摊负载。(这里只是简单的主从复制)
主从复制实现如下图所示:
上图原理说明:
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)创建具有复制权限的帐号
3.配置从mysql服务
1.关闭二进制日志,启动中继日志
2.定义server-id
3.使用有复制权限的帐号连接Master服务器
4.启动I/O线程和sql线程
这里我直接start slave;直接启动I/O,SQL线程,也可以一个个启动;
下面就来查看下从服务器的状态:
4.我就来测试下master服务上新建一个fpjtest数据库:
最后去从服务器上看看 fpjtest有没有同步过来:
看上图已经同步过来了,说明mysql主从复制已经实现。