Mysql Replication - 主从同步

关键词:mysql,主从同步,master,slave
作者:BIce 创建时间:2011-08-30 13:56:45

 

在寻求数据库安全以及数据库稳定性的时候,拥有一个Replication(副本)是非常重要的,在Mysql中我们可以使用设置主、从服务器的方式来达到这个效果。使用Replication的优点有很多,如:

1.实现数据库的负载均衡。比如可以由从服务器完成读任务,而主服务器进行写的任务,来达到减轻主服务器压力、提高读取效率的作用

2.备份功能。作为主库Replication的从库是一个非常好的备份,如果设置了延时同步的话,比如一个小时的同步延时,这样出现严重问题的时候,我们就可以有一个小时的时间发现它,并且使用从服务器未被污染的数据进行恢复。

3.实现高可用性和故障转移的功能。如在主数据库以外驻机的情况下,可以通过将从库提升为主库来达到迅速恢复,减少实际系统的驻机时间的效果。

Mysql主从同步的原理(Master – Slave)

而设置Replication的过程中,最重要需要解决的问题就是主从同步问题,也就是保持从库与主库的数据的一致性的问题。在Mysql中,支持两种主从同步Replication方法:

1.    基于语句的复制:数据库记录在主库上的操作语句,然后将语句在从库上重新执行(当然,不能单纯SQL命令,还有一些附带信息,如当前的时间戳等等需要被记录)。优点是记录文件体积小,缺点是主库上的查询操作也会被从库重新执行。

2.    基于数据行复制:Mysql5.1之后才支持的方式,通过记录实际的数据改动,记录被修改的行和修改的内容,在从库上对这些行进行修改。优点是复制数据高效,不必执行不必要的命令操作,缺点是记录文件会变得比较大,给传输带来压力。

这两种方式都是通过记录主服务器的二进制日志(上述提到的记录文件,Binary Log),并将主服务器上的二进制文件拷贝到从服务器上,由从服务器进行回放(Replay)来完成复制过程,他们都是异步的。

由上所知:二进制日志里存放着命令、或者是数据行的同步数据,而主从同步的核心在于二进制文件的操作,而想要进行主从同步的主服务器一定要开启二进制日志才可以

 

Replication 的大体工作流程如下:

1.       主服务器把数据更改记录到二进制日志(Binary Log)中。

2.       从服务器把主服务器的二进制日志拷贝到自己的Relay Log.

3.       从服务器重放Relay Log 中的事件,将更改应用的自己的数据集中。

 

实际工作的示意图如下:

 

由上图可知,从服务器在进行Binary Log的读取时会开启一个I/O Slave 线程来进行读取,而自身的Replay则由一个SQL线程来执行,图上没有标明的时,在主服务器上也会启动一个线程,是有从服务器打开的连接在主服务器上启动的线程。

配置Mysql Replication

         创建Mysql Replication的过程大概有这几步:

1.       在主、从服务器上配置用于Replication的账号

2.       配置主、从服务器

3.       指导从服务器进行与主服务器的连接与复制

下面一一介绍这几步的具体过程。

 

1.配置Replication账号

由于从服务器要启动一个I/O进程来对主服务器的Binary Log进行读取,所以我们需要在主服务器上建立一个Replication账号,供从服务器的I/O进程使用,以此来登录主服务器,并读取Binary Log

创建Replication账号的命令:

GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.*  TO repl@’192.168.0.%’ IDENTIFIED BY ‘p4ssword’

此命令在主从服务器上都创建了一个名为repl的用户,它被限定成一个在局域网内的用户,其中REPLICAION SLAVEREPLICATION CLIENT是两个权限。其中:

REPLICATION CLIENT是进行Replication所需要的基本权限,而

REPLICATION SLAVE是对Replication进行监视和管理所需要的权限,此权限可以不grant

2.配置主、从服务器

所有的服务器不论主从必须分配一个唯一的Server ID,用来分辨每个服务器

 

Master Server 配置(my.cnf中修改)

log_bin =mysql-bin   #指定Binary Log的名称

server_id=1         #指定Server id

sync_binlog=1       #Mysql在每次提交事务的时候把Binary Log同步到磁盘上

 

检查:

可用SHOW MASTER STATUS命令来进行查看,内容应该为.

其中指出了Binary Log的实际名字

Position比较重要,是当前Binary Log的所处位置。

 

Slave Server配置

log-bin =mysql-bin

server_id =2

relay_log =mysql-relay-login

log_slave_updates=1

read_only=1

其中

log-binrelay-log指定了本机Binary LogRelay Log的文件名

log_slave_updates指出从服务器把Replication的事件也记录在本机的Binary Log中,这样可以实现多级的Master Slave结构(从服务器也可以做其他服务器的主服务器)

read_only指明没有特殊权限的线程不可以修改数据,用于一般Slave只作为读取的情况下用

3.启动Replication

         (在启动Slave之前,要清楚,必须在Slave数据库中先导入相关的表结构,否则不管支持行式或命令式的Binary Log都会报错。)

         指出从服务器如何连接到主服务器并找到其Binary Log.主要使用的命令为CHANGE MASTER TO命令,此命令在SLAVE的客户端执行。

         命令一般为:

CHANGE MASTER TO MASTER_HOST=’server1’, MASTER_PORT=’1234’ MASTER_USER=’repl’,MASTER_PASSWORD=’p4ssword’,MASTER_LOG_FILE=’mysql-bin.000003’,MASTER_LOG_POS=0;

MASTER_HOST指出MASTER的主机名

MASTER_PORT指出MASTER服务的端口。

MASTER_USER 给定之前我们用GRANT命令添加的用户名

MASTER_PASSWORD给定密码

MASTER_LOG_FILE给出主机上的Binary Log实际文件名(注意后面的数字号,MASTER 执行SHOW MASTER STATUS命令所得)

MASTER_LOG_POS给出开始执行的行数在MASTER Binary Log中的位置,也应该由SHOW MASTER STATUS命令而得。0表示开头。

 

检查:

使用SHOW SLAVE STATUS命令检查slave 状态

要注意Slave_IO_Running,Slave_SQL_Running, Slave_IO_State等状态,它们给出了从服务器进程的运行情况,如果运行了Slave Start之后,这三个状态还是如上图,则说明可能你的配置出错了。

 

执行Start Slave命令,启动从服务器,查看状态应该如下:

检查Slave相关状态,发现状态正常,线程正常,则说明连接成功。

(PS:如果start之后发现Slave_IO_Running还未No则需要检查是否是账户问题,或者在master上执行flush logs强制其使用新的日志,重新设置,看是否有问题)

另外也可以使用SHOW PROCESSLIST命令,来查看服务器的线程情况。至此,配置完成,从服务器可以使用LOAD DATA FROM MASTER 语句来获取主服务器上的数据了(会锁主服务器的表,进行传输,且只能用于MyISAM)

至此,简单的Mysql Replication就完成了,进阶请看《高性能Mysql》,书很经典,翻译很烂。

另附Binary Log的可能格式:每行依次为 偏移量,发生时间、服务器Id、结束偏移等等,时间戳,命令/数据?

 

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)