纵有疾风起
人生不言弃

MySQL实现复制的介绍

首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。     同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂! 

概述 

首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。具体如下图所示: 


MySQL实现复制的介绍插图

整个过程反映到从服务器上,对应三套日志信息,可在从服务器上用如下命令查看: 


代码如下:

mysql> SHOW SLAVE STATUS; 

Master_Log_File & Read_Master_Log_Pos:下一个传输的主日志信息。 

Relay_Master_Log_File & Exec_Master_Log_Pos:下一个执行的主日志信息。 

Relay_Log_File & Relay_Log_Pos:下一个执行的中继日志信息。 

理解这些日志信息的含义对于解决故障至关重要,后文会详细阐述。 

安装 

先在主服务器上创建复制账号: 


代码如下:

mysql> GRANT REPLICATION SLAVE ON *.* 

TO ‘<SLAVE_USER>’@'<SLAVE_HOST>’ 

IDENTIFIED BY ‘<SLAVE_PASSWORD>’; 

注:出于安全性和灵活性的考虑,不要把root等具有权限用户作为复制账号。然后设置主服务器配置文件(缺省:/etc/my.cnf):


代码如下:

[mysqld] 

server_id = 100 

log_bin = mysql-bin 

log_bin_index = mysql-bin.index 

sync_binlog = 1 

innodb_flush_log_at_trx_commit = 1 

innodb_support_xa = 1 

注:一定要保证主从服务器各自的server_id唯一,避免冲突。

注:如果没有指定的话,缺省会使用主机名作为名字,如此一来一旦主机名发生改变,就会出问题,所以推荐指定log_bin(从服务器的relay_log存在一样的问题)。

注:,,三个选项都是出于安全目的设置的,不是复制的必须选项。

接着设置从服务器配置文件(缺省:/etc/my.cnf):

代码如下:

[mysqld] 

server_id = 200 

log_bin = mysql-bin 

log_bin_index = mysql-bin.index 

relay_log = mysql-relay-bin 

relay_log_index = mysql-relay-bin.index 

read_only = 1 

skip_slave_start = 1 

log_slave_updates = 1 

注:如果用户有SUPER权限,则无效。

 

注:有了,除非使用命令,否则从服务器不会开始复制。

注:设置,让从服务器记录日志,有助于在必要时把从切换成主。

下面最重要的步骤是如何克隆一份主服务器的数据:

如果数据库使用的是MyISAM表类型的话,可按如下方式操作:

代码如下:

shell> mysqldump –all-databases –master-data=1 > data.sql 

注:选项缺省会打开,并写入语句。

 

如果数据库使用的是InnoDB表类型的话,则应该使用:

代码如下:

shell> mysqldump –all-databases –single-transaction –master-data=1 > data.sql 

有了数据文件,传输到从服务器上并导入: 


代码如下:

shell> mysql < data.sql 

如果数据量很大的话,mysqldump会非常慢,此时直接拷贝数据文件能节省不少时间: 

在拷贝之前要先锁定数据,然后再获得相关的日志信息(FILE & POSITION): 


代码如下:

mysql> FLUSH TABLES WITH READ LOCK; 

mysql> SHOW MASTER STATUS; 

接下来拷贝数据文件时,如果是MyISAM表类型的话,直接拷贝即可;如果是InnoDB表类型的话,一定要先停止MySQL服务再拷贝,否则拷贝文件可能无法使用。把拷贝的数据文件直接复制到从服务器的数据目录。 

最后还需要再指定一下日志信息: 


代码如下:

mysql> CHANGE MASTER TO 

MASTER_HOST='<MASTER_HOST>’, 

MASTER_USER='<SLAVE_USER>’, 

MASTER_PASSWORD='<SLAVE_PASSWORD>’, 

MASTER_LOG_FILE='<FILE>’, 

MASTER_LOG_POS=<POSITION>; 

注:不要在my.cnf配置文件里设置MASTER_USER和MASTER_PASSWORD,因为最终生效的是CHANGE MASTER TO生成的master.info文件里的信息。 

在主服务器上直接拷贝数据文件虽然很快,但需要锁表或者停止服务,这会影响线上服务。如果先前已经有了从服务器,那么可以用旧的从服务器做母本来克隆新的从服务器: 

先在旧的从服务器上查询日志信息: 

未经允许不得转载:起风网 » MySQL实现复制的介绍
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录