A-A+

使用XtraBackup只需6步即可创建Slave

2014年01月23日 DB, Tool 暂无评论

数据就是金矿,快速、稳定、安全地搭建一个备份/恢复体系,对数据系统有重大意义。然而,这项工作并不如想象中的那么轻松,原因是多方面的,比如:需要一些基础设施、人力物力财力等,甚至这件工作本身可能会很枯燥乏味。XtraBackup就是为了解决这个问题而专门设计的。你可以只用6个步骤,实时备份,轻松搭建好主从复制环境。

XtraBackup是一个备份工具,它实现了对MySQL(5.1 5.5 5.6)/MariaDB/Percona DB/进行热备的功能。并且它是一个免费的开源工具,遵守GPLv2 Licence。

预备条件

注意:此处的XtraBackup版本号是V2.1,非此版本可能在操作过程中存在差异,请参考相关文档
使用XtraBackup创建slave实在是一个很简单、很直接的过程。后面会讲,你只要照着做就能轻松搞定。这里先列一个简短的清单,以免在操作过程中产生波折会让你感到有些意外。

TheMaster

    MySQL master节点。假设它已经被正确配置、安装且正常运行。它是我们需要复制的对象,即数据备份来自这台机器。我们假设:

  1. MySQL服务器进程能通过TCP/IP端口和其他服务器进行通信
  2. SSH服务被正确安装且配置
  3. 有相应的服务器帐号以及相关目录的读写权限
  4. 有相应的MySQL帐号和对应操作权限完成相应的操作
  5. MySQL的binlog被打开且server_id变量设置为1(当然,这不是必须是1,言下之意就是让你为操作中的每一台机器都设置不同的id号)

TheSlave

    1. 另一个安装有MySQL且正常运行的服务器。它的要求和

TheMaster

    一样,server_id=2除外。
    出于方便的考虑,XtraBackup应该在两台机器都被正确安装。

Step1: 在TheMaster上创建备份

[bash]
# 以下对应的参数请自行修改,注意:--defaults-file参数必须放在第一个,最后一个参数必须是备份存放的本地文件路径。
TheMaster$ ./innobackupex --defaults-file=/etc/my.cnf.20000 --user=harry --password=harry --socket=/data1/mysqldata/mysql.sock /data/dbbak/xtrabackup[/bash]
如果一切正常,你应该可以看到如下的提示信息:
[bash]./innobackupex: complete OK![/bash]
这将会在TheMaster机器上复制datadir目录下的数据文件(这在配置文件中/etc/my.cnf.20000中指定)到/data/dbbak/xtrabackup/yyyy-mm-dd_HH-MM-SS目录(所有MyISAM,InnoDB表和索引数据都在此)。
为了获得一致性数据镜像,接着这么操作:
[bash]TheMaster$ ./innobackupex --defaults-file=/etc/my.cnf.20000 --user=harry --password=harry --socket=/data1/mysqldata/mysql.sock --apply-log /data/dbbak/xtrabackup/yyyy-mm-dd_HH-MM-SS[/bash]
你需要指定一致性镜像的存放目录,此处是/data/dbbak/xtrabackup/yyyy-mm-dd_HH-MM-SS。如果一切正常,你将会看到同样的OK提示信息。现在,事物日志已经应用到数据文件中了,数据文件已经可以拿来被MySQL服务器使用。
注意:--defaults-file选项不是必须的,但是当你的配置文件不在默认位置时,请显示指定。另外,本人在实际操作过程中会遇到can't connect to server的错误,原因是mysql客户端程序找不到它默认的socket。请在你的终端运行如下命令:
[bash]mysql --print-defaults
[/bash]
显示的就是默认参数,要么传--defaults-file参数给到mysql;要么按照默认参数添加socket的软链接。总而言之,不要慌,有事问谷歌。

Step2: 把备份拷贝到TheSlave

[bash]
TheMaster$ scp -rp /data/dbbak/xtrabackup/yyyy-mm-dd_HH-MM-SS TheSlave:/some/path
[/bash]
ok,现在我们跑到TheSlave机器上,请确保MySQL服务已经被关闭,接着执行以下操作:
[bash]TheSlave$ mv /path/to/mysql/datadir /path/to/mysql/datadir_bak

# 注意:如果ibdata和ib_logfile在TheSlave的配置文件中是分开存储的,则按照TheSlave的配置要求,存放到对应目录。
TheSlave$ mv /path/to/mysql/yyyy-mm-dd_HH-MM-SS /path/to/mysql/datadir
TheSlave$ chown mysql:mysql /path/to/mysql/datadir
[/bash]

Step3: 配置Master MySQL服务器

先确保TheSlave有访问TheMaster的权限:
[bash]
TheMaster|mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'$slaveip' IDENTIFIED BY '$slavepass';
[/bash]
确认一下,TheSlave是否能正常连接TheMaster
[bash]
TheSlave$ mysql --host=TheMaster --user=repl --password=$slavepass
mysql> SHOW GRANTS;
[/bash]

Step4: 配置Slave的MySQL服务

[bash]TheSlave $ scp user@TheMaster:/etc/mysql/my.cnf /etc/mysql/my.cnf[/bash]
然后将TheSlave上的/etc/mysql/my.cnf文件中server_id选项修改为2:
[bash]server_id=2[/bash]
重启TheSlave的mysqld

Step5: 开启复制

打开xtrabackup_binlog_info文件,可以看到类似的信息:
[bash]TheSlave$ cat /path/to/mysql/datadir/xtrabackup_binlog_info
TheMaster-bin.000001 481
[/bash]
执行CHANGE MASTER语句,使用step3中创建的用户名和密码:
[bash]TheSlave|mysql> CHANGE MASTER TO
MASTER_HOST='$masterip',
MASTER_USER='repl',
MASTER_PASSWORD='$slavepass',
MASTER_LOG_FILE='TheMaster-bin.000001',
MASTER_LOG_POS=481;
TheSlave|mysql> START SLAVE;
[/bash]

Step6: 检验

[bash]TheSlave|mysql> SHOW SLAVE STATUSG
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 13
...
[/bash]


为Master增加更多的Slave

至此,我们已经完成了为TheMaster创建一个TheSlave。如果你希望从一个已经存在的slave,复制一个新的slave,我们暂且称呼它为TheNewSlave,我们现在TheSlave上做一个备份:
[bash]TheSlave$ ./innobackupex ... --slave-info /path/to/backupdir[/bash]
使用--slave-info将会创建另一个文件,叫做xtrabackup_slave_info,接着做导入的准备工作prepare:
[bash]TheSlave$ ./innobackupex --apply-log /path/to/backupdir/yyyy_mm_dd-HH-MM-SS[/bash]
在覆盖TheNewSlave的数据文件前,请确保它的MySQL服务是关闭的。然后,远程拷贝:
[bash]scp -rp TheSlave:/path/to/backupdir/yyyy_mm_dd-HH-MM-SS TheNewSlave:/path/to/mysql/datadir[/bash]
再回到TheMaster,为TheNewSlave的访问创建账户和权限:
[bash]TheMaster|mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'$newslaveip' IDENTIFIED BY '$slavepass';[/bash]
TheSlave拷贝my.cnf配置文件到TheNewSlave
[bash]TheNewSlave$ scp user@TheSlave:/etc/mysql/my.cnf /etc/mysql/my.cnf[/bash]
修改server_id为3,并且激活skip-slave-start选项:
[bash]skip-slave-start
server_id=3[/bash]
接着,启动TheNewSlave上的MySQL服务。从xtrabackup_slave_info文件获得master_log_file和master_log_pos,并为TheNewSlave指定master:
[bash]TheNewSlave|mysql> CHANGE MASTER TO
MASTER_HOST='$masterip',
MASTER_USER='repl',
MASTER_PASSWORD='$slavepass',
MASTER_LOG_FILE='TheMaster-bin.000001',
MASTER_LOG_POS=481;[/bash]
启动这个新slave:
[bash]TheNewSlave|mysql> START SLAVE;[/bash]
然后,IO和SQL线程就启动了。同样,在TheNewSlave的mysql会话中,使用SHOW SLAVE STATUS命令查看SLAVE状态,它正在复制TheMaster

原创文章,转载请注明: 转载自腾讯游戏DBA团队

本文链接地址: 使用XtraBackup只需6步即可创建Slave

文章的脚注信息由WordPress的wp-posturl插件自动生成

Copyright © 腾讯游戏DBA团队 保留所有权利.  

用户登录

分享到: