需求场景:因机器原因Mysql服务需要迁移到其他机器,这个Mysql服务所在机器为A; 此Mysql 版本5.1.73 ; 多个业务在使用这个Mysql 服务,要求迁移的时候尽可能不影响服务。目前这个Mysql是一个单点服务,并无从库。
解决方案:mysql router + xtrabackup
基本思想:如下图所示
使用xtrabackup 软件对Mysql A 进行一次全量备份,然后在机器B上进行恢复并设置成Mysql A 的从库,同时配置Mysql C、Mysql D 为 Mysql B 的从库;
使用 Mysql Router 的 Read-Writer 模式 ,将MySQL A 服务配置在 Mysql B 服务的前面, 修改Mysql Client 使其从MySQL Router 服务读写Mysql
关闭Mysql A服务,让Mysql B 提供服务。
下面介绍具体的操作步骤,此文的Mysql 服务都部署在 Centos 6.3(x64) 系统上,Mysql A 版本为:5.1.73 ,Mysql B、C、D 版本为 5.6.X
操作步骤:
1.对Mysql A进行全量备份并恢复到Mysql B:
安装xtrabackup(机器A、B上)
wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpmyum install -y percona-release-0.1-3.noarch.rpm#percona 的官方源很慢,很大概率会出现下载失败,多试几次就好,下载是自动支持断点重试的yum install -y percona-xtrabackup-20.x86_64
设置 的mysql 账号replication(机器A),之所以在备份前设置是因为Mysql版本5.1 和5.6 的版本在同步 user不兼容(如果你不需要对mysql 的系统库进行同步,此步可以在后面进行)
#使用有权限的mysql账号(如 root)创建replication 账号grant replication slave on *.* to slave@'%' identified by "123";
全量备份(机器A)
innobackupex /home/mysql/backups/ --user=root --password=123
恢复备份(机器A)
innobackupex --apply-log --use-memory=40G /home/mysql/backups/2019-11-15_20-04-14/
拷贝文件(机器B)
#使用rsync 从机器B将通过xtrabackup恢复好的备份文件同步到机器B上#rsync 相关使用方法可以自己baidu或者google,注意这里两个目录的 “/”#这里的hostA为机器A的hostname或者iprsync -avz --progress hostA:/home/mysql/backups/2019-11-15_20-04-14 ~mysqld/backup/#根据你自己的mysql 配置文件路径进行调整innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back ~mysqld/backup/2019-11-15_20-04-14/
改变文件属主(机器B)
#根据自己的mysql data 的配置进行调整chown -R mysqld:mysqld ~mysqld/var/lib/mysql
mysql 关键配置项(机器B)
#server-id 要比机器A的小,比机器C、D上大server-id = 10#开启二进制日志,目录根据自己的机器进行调整log-bin=/home/disk2/mysqld_bin_log/mysql-bin#开启通过replication也产生二进制日志的选项,以便机器C、D上的Mysql可以从机器B上同步数据log_slave_updates=1
启动Mysql服务(机器B)
#你的mysql要是通过yum 安装的可以通过service 方式其他,否则直使用命令行的方式启动service mysqld start
查看master 相关信息(机器B),在后面设置Mysql B 的从库需要用到,这个时候不要有任何对 Mysql B的写操作
#登录mysql 后执行show master status ;
# 输出如下示例,需要记下对应的 log file 和log pos ,开启replication后会变化# mysql-bin.000001 120
查看机器A上Mysql bin 日志位置
#在备份目录的xtrabackup_binlog_info 文件中,
cat ~/mysqld/backup/2019-11-15_20-04-14/xtrabackup_binlog_info
#下面是我这边的输出示例,需要根据自己的文件输出进行配置下面的步骤
# mysql-bin.001150 611640010
设置mysql replication (机器B)
#登录mysql 后执行,需要有对应权限,这个时候机器B上的mysql 用户和机器Amysql用户一致#相关参数需要根据自己的配置进行调整,这里仅仅是示例change master to master_host="hostA", master_port=3306, master_user='replication', master_password='123', master_log_file='mysql-bin.001150', master_log_pos=611640010;#启动 replicationstart slave ;#查看replication 的状态show slave status \G
若slave status 输出下面两个字段都Yes,说明已经开始进行Mysql的内容同步了,若是有错误需要根据错误提示进行排查。
Slave_IO_Running: YesSlave_SQL_Running: Yes
2. 在机器C、D上配置Mysql B 的从库:
将之前机器A的备份文件分别拷贝到机器C、D,并分别启动mysql 服务 (不再命令,参看上面)
设置replication(机器C、D), 这里的master_log_file 和 master_log_pos 是从Mysql B 启动的时候通过 show master status \G 命令获取的
#登录mysql 后执行,需要有对应权限,这个时候机器B上的mysql 用户和机器Amysql用户一致#相关参数需要根据自己的配置进行调整,这里仅仅是示例changemastertomaster_host="hostB", master_port=3306, master_user='replication', master_password='123', master_log_file='mysql-bin.000001', master_log_pos=120;#启动 replicationstartslave;#查看replication 的状态showslavestatus\G
部署 mysql router:
从mysql 官网(https://dev.mysql.com/downloads/router/)下载 mysql router
下面给出mysql router 关键配置项,并启动mysql router
[routing:unit1]bind_address =0.0.0.0:8563connect_timeout =2# 一定是这个模式mode =read-writemax_connections =2000max_connect_errors =10000client_connect_timeout =2# 需要根据自己的配置进行调整destinations =hostA:portA,hostB:portB
修改所有业务访问mysql A 入口 到 mysql router 入口,并验证可用性
切换Mysql A 到 Mysql B上
确认MySQL B 和 Mysql A 同步无延迟
msyql>show slave status \G#查看 Seconds_Behind_Master 字段,值为0表示同步无延迟
直接关闭Mysql A服务
service mysqld stop
关闭Mysql B 上的replication
msyql>stop slave ;
网友评论