Linux ·

MySQL复制的实现

1.MySQL复制概念

指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在复制服务器上将这些日志文件重新执行,从而使复制服务器和主服务器的数据保持同步。复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slaves)。主服务器将更新重新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器、从服务器在日志中读取的最后一次成功更新的位置。从服务器接受从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

2.复制的用途

  通过主从复制(master-slave)的方式来同步数据,再通过读写分离(mysql-proxy)来提升数据库的并发负载能力,或者用来作为主备机的设计,保证在主机停止响应之后在很短的时间内就可以将应用切换到备机上继续运行。

优势:

(1)数据库集群系统具有多个数据库节点,在单个节点出现故障的情况下,其他正常节点可以继续提供服务。

(2)如果主服务器上出现了问题可以切换到从服务器上

(3)通过复制可以在从服务器上执行查询操作,降低了主服务器的访问压力,实现数据分布和负载均衡

(4)可以在从服务器上进行备份,以避免备份期间影响主服务器的服务。

3.复制的实现(3种方法)

(1)DRBD是一种用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。

(2)Mysql cluster(又称mysql簇)。Mysql replicaion(复制)本身是一个比较简单的结构,即一台从服务器(slave)从一台主服务器(master)读取二进制日志然后再解析并应用到自身。

(3)一个简单复制环境只需要两台运行mysql的主机即可,甚至可以在一台物理服务器主机上启动两个mysqld实例。一个作为master而另一个作为slave来完成复制环境的搭配。但是在实际应用环境中,可以根据实际的业务需求利用mysql复制的功能自己搭建出其他多种更利于扩展的复制架构,如最常用的主从架构。

  主从架构指的是使用一台mysql服务器作为master,一台或多台mysql服务器作为slave,将master的数据复制到slave上。在实际应用场合,主从架构模式是mysql复制最常用的。一般在这种架构下,系统的写操作都是在master中进行,而读操作则分散到各个slave中进行,因此这种架构特别适合现在互联网高读写的问题。

Mysql数据库复制操作大概分为以下几个步骤:

(1)master启用二进制日志。启用二进制日志的操作在日志管理中有详细的介绍。

(2)slave上面的I/O进程连接上master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。

(3)master接受到来自slave的I/O进程请求后,通过负责复制的I/O进程根据请求信息读取指定日志指定位置之后的日志信息,返回给slave的I/O。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到master端的bin-log文件的名称以及bin-log的位置。

(4)SlaveI/O进程接收到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的最末端,并将读取到的master端的bin-log的文件名和位置记录到master-info文件中。

(5)Slavesql进程检测到relay-log中新增的内容后,会马上解析relay-log的内容,并在自身执行。

4.mysql复制的集中模式

  mysql5.1之后的版本中,在复制方面的改进就是引进了新的复制技术——基于行的复制。这种技术就是关注表中发生变化的记录,而非以前的照抄binlog模式。从mysql5.1.12开始,可以用以下3种模式来实现。

(1)基于sql语句的复制(statement-base replication,sbr)

(2)基于行的复制(rbr)

(3)混合模式复制(mbr)

相应的,binlog的格式也有3种:statement、row、mixed。Mbr模式中,sbr模式是默认的。在运行时可以动态地改变binlog的格式。设定主从复制模式的方法非常简单,只要在以前设定复制配置的基础上,再添加一个参数,如下:

binlog_format=”statement”
#binlog_format=”row”
#binlog_format=”mixed”

当然了,也可以在运行时动态修改binlog的格式

Mysql> set session binlog_format=”statement”

5.控制主服务器操作

Master:192.168.11.139

Slave:192.168.11.130

(1)主服务器:

mysql> show variables like 

参与评论