首页 > 数据库 > MySQL > 基于Linux的级联复制MySQL8.4搭建文档
对于需要构建高可用、可扩展数据库架构的朋友来说,级联复制是一个非常重要的技术。它不仅能实现数据的冗余备份,还能有效分摊主库的读取压力。本文将基于MySQL 8.4.28版本,在Linux系统上演示如何搭建一套标准的级联复制环境。
在开始之前,我们先明确一下实验环境和架构目标。
我们准备了三台服务器,角色和配置如下:
|
主机角色 |
IP地址 |
操作系统 |
MySQL版本 |
|
主库 Master |
192.168.186.11 |
RHEL 6.4 |
MySQL 8.4.28 |
|
从库 Slave1 |
192.168.186.12 |
RHEL 6.4 |
MySQL 8.4.28 |
|
从库 Slave2 |
192.168.186.13 |
RHEL 6.4 |
MySQL 8.4.28 |
架构说明 :这是一个典型的级联复制(也称链式复制)架构。Master将数据复制到Slave1,Slave1再将数据复制到Slave2。Slave1既是Master的从库,也是Slave2的主库。
两种搭建场景 :
全新搭建 :所有服务器都是全新的,没有数据。这种情况下可以跳过数据备份与恢复步骤。
主库有数据 :主库已存在业务数据,需要将这些数据同步到从库。本文档将基于这种更常见的场景进行演示。
正确的参数配置是复制稳定的基础。请在三台服务器上分别修改 /etc/my.cnf 文件。
1. 主库 (Master) 必须配置的参数
[mysqld] server-id = 1 # 服务器唯一ID,每台必须不同 log_bin # 开启二进制日志 binlog_format = ROW # 使用行模式复制 gtid_mode = on # 开启GTID enforce_gtid_consistency = on log_replica_updates = on # 从库也记录二进制日志(级联关键)
2. 从库1 (Slave1) 建议配置
Slave1在级联中承上启下,**必须开启binlog和 log_replica_updates **。
[mysqld] user = mysql port = 3306 basedir = /mysql/app datadir = /mysql/product/data log_error = /mysql/product/data/myerror.log server_id = 2 # 必须唯一 log_bin = mysql-bin binlog_format = ROW log_replica_updates = 1 # 关键:将接收到的更新写入自己的binlog gtid_mode = on enforce_gtid_consistency = on # ... 其他优化参数(如连接数、缓存大小等)可根据实际硬件调整,此处略,详见原文档
3. 从库2 (Slave2) 建议配置
Slave2是链条的末端,开启binlog有利于未来架构扩展。
[mysqld] user = mysql port = 3306 basedir = /mysql/app datadir = /mysql/product/data log_error = /mysql/product/data/myerror.log server_id = 3 # 必须唯一 log_bin = mysql-bin # 建议开启 binlog_format = ROW gtid_mode = on enforce_gtid_consistency = on # ... 其他参数同Slave1,注意server_id不同
因为主库已有数据,我们需要先将其全量备份出来,用于初始化两个从库。这里提供两种主流方法。
方法一:使用XtraBackup进行物理热备份
xtrabackup --defaults-file=/etc/my.cnf -uroot -p你的密码 -S /tmp/mysql.sock --slave-info --backup --target-dir=/xtar
此命令会在 /xtar 目录生成一个一致性备份, --slave-info 选项会生成用于复制的定位信息。
方法二:使用mysqldump进行逻辑备份
mysqldump -uroot -p你的密码 -S /tmp/mysql.sock --single-transaction -A -R -E --triggers --master-data=2 --flush-logs > full.sql
--master-data=2 会在备份文件中以注释形式记录当前的binlog位置,对后续搭建复制至关重要。
将上一步的备份文件,分别恢复到Slave1和Slave2服务器上。
对应XtraBackup备份的恢复方法:
# 1.
准备备份(应用日志)
xtrabackup --prepare --target-dir=/xtar
# 2.
复制数据文件到
MySQL
数据目录
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/xtar
# 3.
修改数据目录属主并启动
MySQL
chown -R mysql:mysql /mysql/product/data service mysqld start
对应mysqldump备份的恢复方法:
# 1.
启动
MySQL
服务(空数据)
service mysqld start
# 2.
导入数据
mysql -uroot -p你的密码 < full.sql
在主库执行,创建一个专门用于数据复制的用户,并授权给从库IP。
CREATE USER 'backup'@'192.168.186.12' IDENTIFIED BY 'mcbackup'; GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.186.12'; FLUSH PRIVILEGES;
注意 :这里只授权给了Slave1 (192.168.186.12),因为Slave2将从Slave1拉取数据。
在Slave1服务器上登录MySQL,执行以下命令建立与主库的复制关系。
方法一:你需要将gtid_purged 改为 xtrabackup_binlog_info 文件中的信息,并执行:
set global gtid_purged='63d891e7-b011-11e8-99a2-000c2942b47d:1-11'; change replication source to source_host = '192.168.186.11',source_port = 3306, source_user = 'backup', source_password = 'mcbackup', source_auto_position = 1,get_source_public_key = 1;
方法二 :
change replication source to source_host = '192.168.186.11',source_port = 3306 , source_user = 'backup', source_password = 'mcbackup', source_auto_position = 1 ,get_source_public_key = 1;
在Slave2服务器上操作,让它从Slave1同步数据。
在Slave1上查询当前的执行GTID集合 :
SHOW MASTER STATUS\G
记录下输出结果中的 `Executed_Gtid_Set` 值(例如: `82c0bedd-8a40-11ec-8477-000c29047594:1-380` )。
2. 在Slave2上设置GTID并配置复制源 :
-- 设置已执行的GTID,避免重复执行SET GLOBAL gtid_purged='<填入上一步查询到的GTID集合>'; -- 配置从Slave1复制 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.186.12', SOURCE_PORT=3306, SOURCE_USER='backup', -- 使用同一复制账户,需确保Slave1上有此用户权限 SOURCE_PASSWORD='mcbackup', SOURCE_AUTO_POSITION=1, GET_SOURCE_PUBLIC_KEY=1;
分别在Slave1和Slave2上启动复制线程,并检查状态。
启动复制 :
START REPLICA;
检查复制状态 :
SHOW REPLICA STATUS\G
在输出结果中,最关键的是以下两个字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
只有当这两个状态都为 **“Yes”** 时,才表示复制链路已正常建立并运行。
一个基于GTID的MySQL级联复制架构就已经搭建完成了。我们来回顾一下关键点:
规划是前提 :确保三台服务器的 server-id 唯一,并提前规划好IP、目录等。
参数是基础 :主库和级联中间节点(Slave1)的 log_replica_updates=ON 是级联生效的关键。
GTID是利器 :使用GTID和 SOURCE_AUTO_POSITION=1 可以极大简化复制位置的维护,提升可靠性。
验证不可少 :搭建完成后,务必使用 SHOW REPLICA STATUS 命令仔细检查IO和SQL线程状态,并在主库写入测试数据,观察是否同步到两个从库。
常见问题提醒 :
• 防火墙 :确保三台服务器之间3306端口的TCP通信是通畅的。
• 权限问题 :确保复制用户 backup 在Master和Slave1上都有正确的连接和复制权限。
• 数据一致性 :如果搭建过程中主库仍有写入,可能需要配合短暂的锁表或业务低峰期进行操作。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29956245/viewspace-3117205/ ,如需转载,请注明出处,否则将追究法律责任。