暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql主从复制架构实战(二)之xtrabackup篇

踱岚视角 2024-09-20
7

一、导读

Mysql主从部署的方式有很多种,最常见的方法就是用mysqldump对主库进行逻辑导出到从库进行恢复。

1.1、mysqldump方式缺点

1.1.1、主库需要锁表

这就意味着这期间主库不能做修改的操作(在做导出的时候需要停止相关的接口和应用,对于一些小业务可能没影响,但如果是繁忙的业务,就是相当于停止服务,不能在线搭建主从架构;

1.1.2、备份恢复耗时长

但是当数据量超过20G的时候,整个过程就相当慢。曾经用这种方法导一个70G的数据库,在使用的是高端存储的情况下,导出花费了50分钟,导入更是需要花费更长时间。

1.2、Percona提供了xtrabackup开源备份工具

可以快速且无锁表地进行mysql的备份并且记录相应的log信息,特点如下:

•备份过程快速、可靠;

•备份过程不会打断正在执行的事务;

•能够基于压缩等功能节约磁盘空间和流量;

•自动实现备份检验;

•还原速度快。

1.3、xtrabackup使用场景

对已有生产库构建主从架构:主库不能停机;

主库数据量比较大:可以快速进行备份;

主库生产环境本地空间不太充足:可以边备份、边压缩、边传输、边解压,这样可以不占用主库本地磁盘空间,直接通过管道将备份文件传输到从库环境中。

1.4、xtrabackup使用限制

XtraBackup社区版本主要支持MyISAM、InnoDB、CSV、MRG_MYISAM四种存储引擎的表。其他存储引擎的表不会被备份,如果数据库中存在非支持的存储引擎表,XtraBackup会打印警告信息。

MySQL版本:XtraBackup 8.0及以后版本主要支持MySQL 8.0及以上版本。这是因为MySQL 8.0在数据字典、redo log等方面与之前的版本不兼容。    

XtraBackup版本:不同版本的XtraBackup可能支持不同的MySQL版本和特性。例如,XtraBackup 8.0.26新增了对MyRocks存储引擎的支持,但不支持TokuDB引擎。

1.5、大体流程

二、环境规划

2.1、操作系统

Linux ubuntu2204 5.15.0-119-generic #129-Ubuntu SMP  Fri Aug 2 19:25:20 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

注:主从库尽量保持一致。

2.2、数据库版本

mysql  Ver  8.0.39-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))

注:主从库尽量保持一致。

2.3、存储规划

项目

项目值

备注

数据库配置文件目录

/etc/mysql

按实际调整

数据库数据存储目录

/var/lib/mysql

按实际调整

数据库日志文件目录

/var/log/mysql

按实际调整

数据库启动脚本目录

/etc/systemd/system

/etc/init.d

注:主从库尽量保持一致。

2.4、IP地址

服务器

主机名

IP地址

端口号

备注

主库

Master

192.168.56.18

3306

按实际调整

从库

Slave

192.168.56.19

3306

按实际调整

2.5、主从复制数据库初始化方式

本次采用xtraBackup对主库进行物理备份,然后在从库上进行还原的方式进行主从复制初始化工作。

当然也可以通过mysqldump进行主库逻辑导出,然后在从库上进行还原的方式进行主从复制初始化工作。

也可以通过clone技术在线搭建主从复制环境。

在后续的文章中会逐一介绍。

2.6、主从复制机制

本次采用基于row的模式对主库进行同步复制到备库。

当然也可以通过statement、mixed、GTID等复制方式进行主从同步,在后续的文章中会逐一介绍。

2.7、主从复制模式

本次采用默认的复制模式,异步复制,主服务器提交事务后立即返回,而不等待从服务器确认。

当然也可以设置为半同步复制,完全同步复制模式,在后续的文章中会逐一介绍。

2.8、主从库侧部署xtrabackup软件

2.8.1、下载

链接地址:https://www.percona.com/downloads/XtraBackup/

本次下载percona-xtrabackup-8.0.35-31版本。

2.8.2、安装

dpkg -i percona-xtrabackup-80_8.0.35-31-1.jammy_amd64.deb

本次使用封装好的deb包(不同平台不一样)安装,当然也可以使用二进制代码编译安装。

注:主从库服务器都需要提前安装好。

2.9、数据库参数

参数名

主库

从库

备注

basedir




datadir




character-set-server

utf8mb4

utf8mb4


lower-case-table-names

1

1


default_authentication_plugin

mysql_native_password

mysql_native_password


server-id

1

2


log-bin

mysql-bin

mysql-bin


binlog-ignore

sys,mysql,

information_schema,performance_schema

sys,mysql,

information_schema,performance_schema

可逗号分隔,也可写多条

binlog-do-db

mydb

mydb

多数据库写多条

replication-do-table




replication-ignore-table

格式:库名.表名

格式:库名.表名

多表写多条

binlog_format

row

row


relay-log

mysql-relay

mysql-relay


log-error

/var/log/mysql/error.log

/var/log/mysql/error.log


port

3306

3306


expire_logs_days

14

14


slow_query_log

1

1


slow_query_log_file

/var/log/mysql/mysql-slow.log

/var/log/mysql/mysql-slow.log


long_query_time

2

2


max_binlog_size

100M

100M


read-only

0

1


三、配置步骤

3.1、主库侧按照上表进行数据库参数设置

3.2、从库侧按照上表进行数据库参数设置

3.3、主库侧创建同步专属账号并授权

CREATE USER 'slave'@'%' IDENTIFIED WITH  mysql_native_password BY 'mysql123456';

 

GRANT REPLICATION SLAVE,replication client  ON *.* TO 'slave'@'%';

 

flush privileges;

 

3.4、从库侧数据库关闭

从库:systemctl stop mysql

3.5、对主库进行备份

xtrabackup --backup --compress --compress-threads=8  --target-dir=/home/duolan/test/ --user=root --password='123456'  --host=192.168.56.18 --port=3306

 

--compress 表示采用压缩方式

--target-dir 表示备份文件存放目录,注意操作系统用户要有读写权限

 

以下是产生的备份文件:

3.6、将备份文件打包并拷贝至从库

3.6.1、备份文件打包

tar cvzfp test.tar.gz test

 

3.6.2、将打包文件拷贝至从库服务器

scp test.tar.gz root@192.168.56.19:/root/test

 

3.7、在从库上进行备份文件解压缩

tar xvzp test.tar.gz

 

以上步骤3.5——>3.7是常见的操作步骤,需要占用主库服务器本地磁盘空间,可以在主库服务器上使用以下命令行一次性完成上述任务,且不占用主库服务器本地空间:

xtrabackup --user=root --password=123456  --stream=xbstream --backup --parallel=10 |lz4|ssh root@192.168.56.19 'cat  |lz4 -d|xbstream --parallel=10 -x -C root/test'

 

通过流式备份,结合管道,直接将备份文件流传输到从库主机,真正做到边备份、边传输、解压,一次性完成上述操作,非常高效。

执行完毕之后,可以直接在从库主机/root/test目录下看到以下文件:

3.8、在从库侧执行备份文件prepare预处理

xtrabackup --prepare --target-dir=/root/test

 

在进行数据库备份后,备份文件可能处于不一致的状态,因为备份过程中数据库可能正在进行写操作。--prepare命令的作用是将备份文件恢复到一个一致的状态,以便可以用于数据库的恢复。

 

具体来说,它会执行以下操作:

应用事务日志:将备份过程中未完成的事务进行回滚或提交,以确保数据库的一致性。

恢复数据文件:修复可能在备份过程中损坏的数据文件,使其可以被数据库服务器正确读取。

在使用增量备份时,需要将多个增量备份与一个基础备份进行合并。首先,对基础备份进行--prepare操作,然后依次对每个增量备份进行--prepare操作,并将它们合并到基础备份中,最终得到一个完整的、一致的备份集,可以用于数据库的恢复。

 

--target-dir 就是从库存放备份文件目录

3.9、在从库侧执行恢复操作

3.9.1、文件copy-back

xtrabackup  --defaults-file=/etc/my.cnf --copy-back --parallel=10 --target-dir=/root/test

 

 

如果这里的target-dir直接是从库数据库文件目录,则无需执行本步骤

3.9.2、文件权限配置

chown -R  mysql:mysql var/lib/mysql

 

 

如果前面执行文件传输、解压都是用mysql用户的话,则无需执行本步骤。

3.10、从库启动数据库实例

3.10.1、创建/var/run/mysqld目录

mkdir -p  /var/run/mysqld

 

chown -R  mysql:mysql var/run/mysqld

3.10.2、启动从库实例

mysqld_safe --default-file=/etc/my.cnf&

 

注:很多人有个误区,认为搭建从库,需要提前创建个空白实例。对于逻辑备份确实如此,但对于物理备份,则无此必要,直接使用 mysqld_safe 启动还原后的备份文件即可。

3.11、获取binlog和position信息

more  xtrabackup_binlog_info

 

恢复所需的binlog和position信息在备份时会存放target-dir下的xtrabackup_binlog_info

文件中。

3.12、在从库执行同步配置

change master to master_host='192.168.56.18',master_user='slave',master_password='mysql123456',master_log_file='mysql-bin.000017',master_log_pos=157;

 

master_host为主服务器的ip;

master_user为连接主服务器的用户名;

master_password为连接主服务器的密码;

master_log_file为要同步的日志文件file,即对应上面主服务器查看时的File字段;

master_log_pos为要同步日志文件的位置,即对应上面主服务器查看时的Position字段;

3.13、在从库侧开启同步slave进程

start slave;

3.14、在从库侧查看slave状态

start slave;

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

都为Yes则代表配置成功。

四、数据同步测试

4.1、在主库侧mydb创建一个test表

use mydb;

create table test(id int);

4.2、在从库侧查看同步情况

use mydb;

show tables;

4.3、在主库侧给表mydb.test插入记录

use mydb;

insert into test(id) values(1);

insert into test(id) values(2);

insert into test(id) values(3);

insert into test(id) values(4);

select count(1) from test;

commit;

4.4、在从库侧确认mydb.test记录同步情况

use mydb;

select count(1) from test;

4.5、再次查看主从库同步情况

4.5.1、主库侧

show master status\G;


4.5.2、从库侧


show slave status\G;


文章转载自踱岚视角,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论