使用 xtrabakup 搭建基于 GTID 的 mysql replication

xtrabackup 是一个开源的高性能 MySQL 热备份工具,使用 xtrabackup 可以在备份的时候不用停止 MySQL 服务。

通过使用 xtrabackup 可以简单快速的搭建 MySQL 集群。

准备工作

在使用 xtrabackup 搭建 MySQL 集群之前需要做好下面的准备:

  • Master: 一个已经启动了的 MySQL 8.0 服务,下文称之为 Master,这个 mysql 服务就是需要被拓展成 replicattion 的服务,Master 所在的系统需要满足下面的条件
    • MySQL 服务可以通过标准的 TCP IP/Port 进行通信
    • SSH 服务已经安装完成,并且已经启动了
    • 一个能够进行操作的系统账户
    • 一个拥有数据备份权限的 MySQL 账户
    • MySQL 服务启用了 binlog 并且 server-id 设置为 2
  • Slave:一个安装了 MySQL 服务的系统,Slave 的数据除了 server-id 以外将会与 Master 保持一致,slave 的 server-id 将会是 2
  • xtrabackup:备份数据所需要的工具

注意:Master 与 Slave 的 MySQL 服务最好保持一致,否则可能会产生预期之外的结果

第一步:备份 Master 数据

xtrabackup 不支持备份远端的数据库,因为需要对数据目录进行操作。但是可以借助 ssh 以及 xbstream 将数据备份到 Slave 上。

在 Slave 上创建数据目录

1
2
Slave$ cd
Slave$ mkdir /path/to/datadir

开始备份

1
Slave$ ssh masterUser@masterHost "xtrabackup --backup --user=yourDBuser --password=MaGiCdB1 --target-dir=./ --stream=xbstream" | xbstream -x -C /path/to/datadir

在完成备份之后,你会看到下面的提示

1
xtrabackup: completed OK!

上面的命令会将 Master 的数据拷贝到 Slave 的 /path/to/datadir 目录下。包括 MyISAM,Innodb数据表以及对应的索引。

第二步: 创建备份账户

在 Master 的 MySQL shell 中执行

1
2
Master|mysql> GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'$slaveip'
IDENTIFIED BY '$slavepass';

第三步:处理备份数据

备份数据没有经过处理是无法直接使用的,所以需要处理一下

1
Slave$ xtrabackup --prepare /path/to/datadir

命令完成后,数据就已经准备就绪了

第四步:配置启动 replication

修改 Slave 的 mysql 配置文件,将 server-id 设置为 2

查看 GTID 的信息

1
2
Slave$ cat /path/to/datadir/xtrabackup_binlog_info
mysql-bin.000002 1232 c7997888a-b6df-11e2-a604-080027635ef5:1-15

MySQL 8.0.22 之前的版本使用下面的命令

1
2
3
4
5
6
7
8
9
 # 在 MySQL shell 中
Slave|mysql> RESET MASTER;
Slave|mysql> SET GLOBAL gtid_purged='<gtid_string_found_in_xtrabackup_binlog_info>'; # c7997888a-b6df-11e2-a604-080027635ef5:1-15
Slave|mysql> CHANGE MASTER TO
MASTER_HOST="$masterip",
MASTER_USER="repl",
MASTER_PASSWORD="$slavepass",
MASTER_AUTO_POSITION = 1;
Slave|mysql> START SLAVE;

MySQL 8.0.22 以及之后的版本使用:

1
2
3
4
5
6
7
8
Slave|mysql> RESET MASTER;
Slave|mysql> SET GLOBAL gtid_purged='<gtid_string_found_in_xtrabackup_binlog_info>';
Slave|mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST="$masterip",
SOURCE_USER="repl",
SOURCE_PASSWORD="$slavepass",
SOURCE_AUTO_POSITION = 1;
Slave|mysql> START REPLICA;

第五步:检查 Slave 状态

1
2
3
4
5
6
7
Slave|mysql> show slave status\G
[..]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[...]
Retrieved_Gtid_Set: c7997888a-b6df-11e2-a604-080027635ef5:1-15
Executed_Gtid_Set: c7997888a-b6df-11e2-a604-080027635ef5:1-15

使用 xtrabakup 搭建基于 GTID 的 mysql replication
https://blog.zhangliangliang.cc/post/setting-up-mysql-replication.html
作者
Bobby Zhang
发布于
2022年8月9日
许可协议