Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql线上主从集群

MySqll线上主从集群设置详细方案

作者:不见长安在

本文详细介绍了如何在生产环境中搭建MySQL主从复制架构,包括环境准备、配置步骤、验证及运维注意事项,,此外,还特别介绍了如何在不停服的情况下搭建主从复制,确保业务连续性,感兴趣的朋友跟随小编一起看看吧

以下是线上搭建 MySQL 主从复制(Master-Slave)的详细方案,适用于生产环境,涵盖环境准备、配置步骤、验证及运维注意事项:

一、环境准备

1. 服务器规划

角色IP地址操作系统MySQL版本备注
Master192.168.1.10CentOS 78.0.36主库,业务写入节点
Slave192.168.1.11CentOS 78.0.36从库,只读,用于备份/查询

2. 前置条件

# Master 开放 3306 端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

二、Master 主库配置

1. 修改 MySQL 配置文件(my.cnf或mysqld.cnf)

配置文件路径通常为 /etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf,添加以下参数:

[mysqld]
# 开启 binlog,指定日志文件前缀
log_bin = /var/lib/mysql/mysql-bin
# 服务器唯一 ID(1-255,主从不能重复)
server-id = 10
# binlog 格式(推荐 row 模式,记录数据行变更,兼容性好)
binlog_format = ROW
# 不需要同步的数据库(可选,多个用逗号分隔)
binlog-ignore-db = information_schema
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
# 自动清理 7 天前的 binlog(避免磁盘占满)
expire_logs_days = 7
# 同步时忽略主从的服务器 ID 冲突(可选)
log-slave-updates = 0

2. 重启 MySQL 服务

systemctl restart mysqld
# 确认状态
systemctl status mysqld

3. 主库创建用于复制的账号

登录 Master MySQL,创建一个仅用于从库复制的账号(限制 IP 为 Slave 地址,增强安全性):

-- 登录主库
mysql -u root -p
-- 创建复制账号(用户名:repl,密码:Repl@123456,允许从 192.168.1.11 连接)
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'Repl@123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
-- 刷新权限
FLUSH PRIVILEGES;

4. 锁定主库并获取 binlog 信息

为避免配置期间主库数据变更,先锁定主库(仅禁止写入,允许读取):

-- 锁定主库
FLUSH TABLES WITH READ LOCK;
-- 查看当前 binlog 文件名和位置(记录 File 和 Position,后续从库配置需要)
SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              | information_schema,mysql,performance_schema,sys |                   |
+------------------+----------+--------------+------------------+-------------------+

记录 File(如 mysql-bin.000001)和 Position(如 154)。

三、Slave 从库配置

1. 备份主库数据并恢复到从库

主库锁定后,通过 mysqldump 备份数据(确保从库初始数据与主库一致):

# 在 Master 服务器执行,备份所有库(排除忽略的系统库)
mysqldump -u root -p --all-databases --ignore-db=information_schema --ignore-db=mysql --ignore-db=performance_schema --ignore-db=sys > master_data.sql

将备份文件传到 Slave 服务器:

scp master_data.sql root@192.168.1.11:/tmp/

在 Slave 服务器恢复数据:

# 登录 Slave MySQL,先创建与主库一致的数据库(如果有自定义库)
mysql -u root -p
CREATE DATABASE IF NOT EXISTS your_db;
exit
# 恢复数据
mysql -u root -p < /tmp/master_data.sql

恢复完成后,解锁主库(在 Master MySQL 中执行):

UNLOCK TABLES;

2. 修改 Slave 配置文件(my.cnf)

[mysqld]
# 从库唯一 ID(与主库不同)
server-id = 11
# 从库日志(可选,用于级联复制,即从库作为其他库的主库时需要)
relay_log = /var/lib/mysql/mysql-relay-bin
# 从库只读(禁止写入,增强数据一致性)
read_only = 1
# 忽略同步的数据库(与主库保持一致)
replicate-ignore-db = information_schema
replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = sys

3. 重启 Slave MySQL 服务

systemctl restart mysqld
systemctl status mysqld

4. 配置从库连接主库

登录 Slave MySQL,配置主从复制参数(使用主库的 binlog 信息和复制账号):

-- 登录从库
mysql -u root -p
-- 停止从库复制进程(如果之前配置过)
STOP SLAVE;
-- 配置主库信息
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.10',  -- 主库 IP
  MASTER_USER = 'repl',          -- 复制账号用户名
  MASTER_PASSWORD = 'Repl@123456',  -- 复制账号密码
  MASTER_LOG_FILE = 'mysql-bin.000001',  -- 主库 binlog 文件名(从 SHOW MASTER STATUS 获取)
  MASTER_LOG_POS = 154;          -- 主库 binlog 位置(从 SHOW MASTER STATUS 获取)
-- 启动从库复制进程
START SLAVE;

四、验证主从复制

1. 查看从库状态

在 Slave MySQL 中执行:

SHOW SLAVE STATUS\G

重点关注以下两个参数,均为 Yes 表示复制正常:

2. 数据同步测试

在 Master 中创建测试表并插入数据:

CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO test_table VALUES (1, 'test');

在 Slave 中查询,确认数据已同步:

USE test_db;
SELECT * FROM test_table;
-- 若输出 (1, 'test'),则复制成功

五、运维注意事项

-- 在 Slave 执行
STOP SLAVE;
RESET SLAVE ALL;  -- 清除主从配置
-- 从库设置为可写(如需)
SET GLOBAL read_only = 0;

通过以上步骤,可搭建一套稳定的 MySQL 主从复制架构,实现数据备份和读写分离基础。生产环境中建议结合监控工具(如 Percona Monitoring and Management)实时跟踪复制状态。

在生产环境中,为了避免业务中断,通常需要在不停服的情况下搭建 MySQL 主从复制。核心思路是:通过在线备份主库数据(不锁表或仅短暂锁表),确保从库初始化数据与主库一致,同时记录主库的 binlog 位置,最终实现主从同步。以下是详细步骤:

mysql不停服主从复制

一、环境准备(同前,补充不停服关键点)

角色IP地址操作系统MySQL版本备注
Master192.168.1.10CentOS 78.0.36主库,业务正常运行
Slave192.168.1.11CentOS 78.0.36从库,全新安装或待同步

关键前提:

二、Master 主库配置(不停服核心步骤)

1. 确认主库 binlog 已开启

登录主库,检查 binlog 状态:

mysql -u root -p
SHOW VARIABLES LIKE 'log_bin';  -- 若 Value 为 ON,说明已开启
SHOW VARIABLES LIKE 'server_id';  -- 确保 server_id 已设置(非 0)

若未开启 binlog,需修改 my.cnf 并重启主库(会短暂停服,建议避开业务高峰):

[mysqld]
log_bin = /var/lib/mysql/mysql-bin
server-id = 10  # 主库唯一 ID
binlog_format = ROW  # 推荐 row 模式

重启后再次确认 binlog 已开启。

2. 创建复制账号(不停服)

在主库创建用于从库复制的账号(限制从库 IP,避免安全风险):

-- 登录主库
mysql -u root -p
-- 创建账号(用户名 repl,允许从 192.168.1.11 连接)
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'Repl@123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
-- 刷新权限
FLUSH PRIVILEGES;

3. 在线备份主库数据(核心:不锁表或短暂锁表)

为避免锁表影响业务,推荐使用 Percona XtraBackup(支持热备份,不锁表),或 mysqldump--single-transaction 参数(适用于 InnoDB 引擎,非阻塞备份)。

方案 1:使用 Percona XtraBackup(推荐,适合大库)

XtraBackup 是开源工具,支持 InnoDB 热备份,备份过程不锁表,适合生产环境。

安装 XtraBackup(主库执行):

# 安装依赖
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only tools release
yum install -y percona-xtrabackup-80  # 对应 MySQL 8.0

全量备份主库(不锁表,后台执行):

# 创建备份目录
mkdir -p /data/backup/mysql_full
chown -R mysql:mysql /data/backup
# 执行备份(记录 binlog 位置,后续从库需要)
xtrabackup --user=root --password=你的主库密码 --backup --target-dir=/data/backup/mysql_full/

备份完成后,查看备份目录下的 xtrabackup_binlog_info 文件,记录 binlog 文件名Position(例如:mysql-bin.000003 156),这是主从同步的起点。

方案 2:使用 mysqldump(适合小库,简单易用)

mysqldump--single-transaction 参数可实现 InnoDB 引擎的非阻塞备份(MyISAM 仍会锁表,需注意)。

备份主库数据并记录 binlog 位置

# 先获取当前 binlog 位置(备份开始时的状态)
mysql -u root -p -e "SHOW MASTER STATUS\G" > /tmp/master_status.txt
# 备份所有库(--single-transaction 确保 InnoDB 一致性,不锁表)
mysqldump -u root -p --all-databases --single-transaction --flush-logs --master-data=2 > /data/backup/master_data.sql

三、Slave 从库配置(基于主库备份恢复)

1. 初始化从库(确保与主库版本一致)

从库需安装与主库相同版本的 MySQL,且初始状态为空(若已有数据,需先清理):

# 停止从库 MySQL
systemctl stop mysqld
# 清理默认数据目录(注意:会删除所有数据,谨慎操作)
rm -rf /var/lib/mysql/*

2. 恢复主库备份到从库

若使用 XtraBackup 备份:

将备份文件传到从库

scp -r /data/backup/mysql_full root@192.168.1.11:/data/backup/

在从库恢复备份

# 准备备份(确保数据一致性)
xtrabackup --prepare --target-dir=/data/backup/mysql_full/
# 恢复到从库数据目录
xtrabackup --copy-back --target-dir=/data/backup/mysql_full/
# 修改权限(MySQL 需有权限访问)
chown -R mysql:mysql /var/lib/mysql/

若使用 mysqldump 备份:

将备份文件传到从库

scp /data/backup/master_data.sql root@192.168.1.11:/tmp/

在从库恢复数据

# 启动从库 MySQL(确保数据目录为空)
systemctl start mysqld
# 恢复备份(若备份文件大,可加 & 后台执行)
mysql -u root -p < /tmp/master_data.sql

3. 配置从库 my.cnf

[mysqld]
server-id = 11  # 从库唯一 ID,与主库不同
relay_log = /var/lib/mysql/mysql-relay-bin  # 中继日志
read_only = 1  # 从库只读(root 可写,若需严格只读,可设置 super_read_only=1)
replicate-ignore-db = information_schema  # 忽略系统库(可选)
replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = sys

重启从库 MySQL:

systemctl restart mysqld

4. 配置从库连接主库(关键:使用备份时的 binlog 位置)

登录从库 MySQL,设置主从同步参数:

mysql -u root -p
-- 停止可能存在的复制进程
STOP SLAVE;
-- 配置主库信息(替换为实际值)
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.10',  -- 主库 IP
  MASTER_USER = 'repl',          -- 复制账号
  MASTER_PASSWORD = 'Repl@123456',  -- 复制密码
  MASTER_LOG_FILE = 'mysql-bin.000003',  -- 备份时记录的 binlog 文件名
  MASTER_LOG_POS = 156;          -- 备份时记录的 Position
-- 启动从库复制
START SLAVE;

四、验证主从同步(不停服验证)

1. 检查从库状态

在从库执行:

SHOW SLAVE STATUS\G

重点关注:

2. 业务数据验证

在主库执行写入操作(模拟业务):

-- 主库创建测试数据
CREATE DATABASE IF NOT EXISTS test_sync;
USE test_sync;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (1, '不停服同步测试');

在从库查询,确认数据已同步:

USE test_sync;
SELECT * FROM t1;  -- 若返回 (1, '不停服同步测试'),则成功

五、关键注意事项(不停服场景)

通过以上步骤,可在不中断主库业务的情况下完成 MySQL 主从复制搭建,适用于生产环境的平滑扩容或灾备需求。核心是利用热备份工具确保数据一致性,并精准记录 binlog 位置作为同步起点。

到此这篇关于mysql线上主从集群设置的文章就介绍到这了,更多相关mysql线上主从集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文