ITPub博客

首页 > 数据库 > MySQL > 基于Linux的级联复制MySQL8.4搭建文档

基于Linux的级联复制MySQL8.4搭建文档

原创 MySQL 作者:梦夕林1992 时间:2026-05-06 18:37:49 0 删除 编辑

对于需要构建高可用、可扩展数据库架构的朋友来说,级联复制是一个非常重要的技术。它不仅能实现数据的冗余备份,还能有效分摊主库的读取压力。本文将基于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的主库。

两种搭建场景 :

全新搭建 :所有服务器都是全新的,没有数据。这种情况下可以跳过数据备份与恢复步骤。

主库有数据 :主库已存在业务数据,需要将这些数据同步到从库。本文档将基于这种更常见的场景进行演示。

第二部分:具体实施步骤

步骤一:初始化MySQL 参数配置

正确的参数配置是复制稳定的基础。请在三台服务器上分别修改 /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 到 Master 的复制链路

在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 的复制链路

在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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-10-13

  • 博文量
    90
  • 访问量
    85388