MySQL主从复制配置完整指南
概述
MySQL主从复制(Master-Slave Replication)是一种常见的数据库高可用性和负载均衡解决方案。通过配置主从复制,可以实现数据备份、读写分离和故障转移等需求。本文档详细介绍在openEuler系统上配置MySQL主从复制的完整流程。
核心原理
MySQL主从复制基于二进制日志(binlog)实现,主要流程如下:
- 主库:将所有数据变更记录到二进制日志
- 从库:通过I/O线程请求并获取主库的binlog,写入本地的中继日志
- 从库:通过SQL线程读取中继日志,重放数据变更
环境准备
服务器要求
- 主节点:172.18.2.11
- 从节点:172.18.2.12
- 操作系统:openEuler
- 软件版本:MySQL 8.0
1. 两个节点都安装MySQL Server
1.1 关闭SELinux
获取当前SELinux状态:
getenforceEnforcing为开启状态Permissive为关闭状态
临时关闭SELinux:
setenforce 0永久关闭SELinux:
vi /etc/sysconfig/selinux
# 将 SELINUX=enforcing 替换为 SELINUX=disabled重启系统后验证状态:
sestatus1.2 安装MySQL
yum install mysql-server -y2. 主节点配置
2.1 编辑MySQL配置文件
vi /etc/my.cnf添加以下配置:
[mysqld]
server-id=1
log-bin=binlog
# 可选:自定义数据目录
datadir=/data
socket=/data/mysql.sock
[client]
# 可选:自定义数据目录
socket=/data/mysql.sock说明:server-id是主从复制的唯一标识,主从节点必须不同。log-bin启用二进制日志,是复制功能的基础。
2.2 自定义数据目录初始化(可选)
如果配置了自定义数据目录/data,需执行以下步骤:
# 创建数据目录
mkdir /data
# 设置目录权限
sudo chown mysql:mysql /data
sudo chmod 700 /data
# 停止MySQL服务
systemctl stop mysqld
# 清理旧数据
rm -rf /data/*
# 初始化MySQL
mysqld --initialize --user=mysql初始化后系统会生成临时密码,记录下该密码。
2.3 MySQL初始化与安全设置
# 登录MySQL(使用临时密码)
mysql -uroot -p
# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'shxy@000';
FLUSH PRIVILEGES;
EXIT;2.4 创建复制账户
# 登录MySQL
mysql -uroot -p
# 创建从节点复制账户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
# 查看主库状态,记录File和Position值
SHOW MASTER STATUS;注意:记录
SHOW MASTER STATUS输出的File(如binlog.000004)和Position(如61054401)值,在从节点配置时需要使用。
2.5 验证复制账户
SELECT User, Host FROM mysql.user WHERE User='repl';2.6 备份和传输数据库
# 导出所有数据库(包含主库信息)
mysqldump -uroot -p --all-databases --master-data=2 > backup.sql
# 将备份文件传输到从节点
scp ./backup.sql root@172.18.2.12:/root参数说明:
--master-data=2:在备份文件中添加CHANGE MASTER语句,但注释掉(用于手动配置)- 对于大型数据库,建议在导出前锁定表或使用
--single-transaction选项确保数据一致性
2.7 配置防火墙
# 允许MySQL端口(3306)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload安全提醒:生产环境中建议限制访问来源IP,而非完全开放端口:
# 仅允许从节点IP访问
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='172.18.2.12' port protocol='tcp' port='3306' accept"3. 从节点配置
3.1 编辑MySQL配置文件
vi /etc/my.cnf添加以下配置:
[mysqld]
# 唯一ID,不能与主节点相同
server-id=2
# 中继日志配置
relay_log=/var/lib/mysql/relay-bin
# 设置为只读(避免误操作)
read_only=13.2 初始化MySQL服务
初始化过程参考主节点的初始化步骤,包括:
- 创建数据目录(如使用自定义目录)
- 初始化MySQL服务
- 修改root密码
3.3 导入主节点数据
# 导入主节点备份的数据
mysql -uroot -p < backup.sql注意:对于大型数据库(如4.4G),此过程可能需要较长时间(示例为20分钟)。
3.4 配置主从复制
导入数据后,登录MySQL配置主从复制:
# 重启MySQL服务
systemctl restart mysqld
# 登录MySQL
mysql -uroot -p执行以下SQL配置主从复制:
CHANGE MASTER TO
MASTER_HOST='172.18.2.11',
MASTER_USER='repl',
MASTER_PASSWORD='Shxy@000',
MASTER_LOG_FILE='binlog.000004', -- 使用之前SHOW MASTER STATUS看到的值
MASTER_LOG_POS=61054401, -- 使用之前SHOW MASTER STATUS看到的值
GET_MASTER_PUBLIC_KEY=1;
-- 启动复制线程
START SLAVE;
-- 检查复制状态
SHOW SLAVE STATUS\G4. 验证主从复制
4.1 功能验证
在主节点创建测试数据:
# 连接主节点
mysql -uroot -p
# 创建测试数据库和表
CREATE DATABASE test_repl;
CREATE TABLE test_repl.test (id INT);
INSERT INTO test_repl.test VALUES (1);
EXIT;在从节点检查数据是否已同步:
# 连接从节点
mysql -uroot -p
# 查看数据库
SHOW DATABASES;
# 使用测试数据库
USE test_repl;
# 查询测试表
SELECT * FROM test;4.2 读写分离验证
# 写操作(连接主节点)
mysql -h 172.18.2.11 -uroot -p
# 读操作(连接从节点)
mysql -h 172.18.2.12 -uroot -p5. 监控与维护
5.1 定期检查状态
# 在从节点上检查复制状态
mysql -uroot -p -e "SHOW SLAVE STATUS\G"重点关注以下指标:
Slave_IO_Running: Yes- I/O线程是否运行Slave_SQL_Running: Yes- SQL线程是否运行Seconds_Behind_Master: 0- 复制延迟(应为0或接近0)
5.2 故障排查
常见错误1:连接失败
错误信息:Last_IO_Error: error connecting to master 'repl@172.18.2.11:3306'
解决方案:
- 检查网络连通性
- 验证防火墙设置
- 确认复制账户权限
常见错误2:复制中断
错误信息:Last_SQL_Error: ... duplicate key entry ...
解决方案:
-- 跳过一个错误事务
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
-- 或者重新同步数据
STOP SLAVE;
RESET SLAVE;
-- 重新导入主节点数据并重新配置5.3 主从切换(故障转移)
当主节点故障时,可以将从节点提升为主节点:
-- 在从节点停止复制
STOP SLAVE;
-- 提升为主节点
RESET SLAVE ALL;
-- 取消只读模式
SET GLOBAL read_only = OFF;更新应用程序配置,将数据库连接指向新的主节点。
6. 高级配置
6.1 半同步复制
在主节点安装插件:
-- 安装半同步复制插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;在从节点安装插件:
-- 安装半同步复制插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;6.2 GTID模式复制
启用GTID(全局事务ID)简化复制管理:
# 主节点my.cnf
[mysqld]
server-id=1
log-bin=binlog
gtid-mode=ON
enforce-gtid-consistency=ON
# 从节点my.cnf
[mysqld]
server-id=2
relay_log=/var/lib/mysql/relay-bin
read_only=1
gtid-mode=ON
enforce-gtid-consistency=ON使用GTID配置主从复制:
-- 在从节点配置
CHANGE MASTER TO
MASTER_HOST='172.18.2.11',
MASTER_USER='repl',
MASTER_PASSWORD='Shxy@000',
MASTER_AUTO_POSITION=1;
START SLAVE;7. 性能优化
7.1 主节点优化
[mysqld]
# 增大binlog缓存
binlog_cache_size = 1M
# 增大binlog文件大小
max_binlog_size = 500M
# 启用binlog压缩
binlog compression = ON7.2 从节点优化
[mysqld]
# 增大中继日志缓存
relay_log_space_limit = 4G
# 多线程复制
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 48. 备份策略
8.1 主节点备份
# 使用mysqldump备份
mysqldump -uroot -p --single-transaction --all-databases > backup.sql
# 使用xtrabackup备份(热备份)
xtrabackup --backup --target-dir=/backup/full --user=root --password=shxy@0008.2 从节点备份
从节点可以承担备份任务,减轻主节点负载:
# 停止复制获取一致性备份
STOP SLAVE SQL_THREAD;
mysqldump -uroot -p --single-transaction --all-databases > backup.sql;
START SLAVE SQL_THREAD;9. 安全建议
- 网络安全:使用防火墙限制数据库端口访问
- 传输加密:配置SSL加密主从同步流量
- 访问控制:为不同应用创建专用数据库账户
- 审计日志:启用MySQL审计日志记录所有操作
总结
MySQL主从复制是构建高可用数据库架构的基础技术,通过合理配置和监控,可以有效实现数据备份、读写分离和故障转移。在生产环境中,建议结合半同步复制或GTID等高级特性,并建立完善的监控和备份机制,确保数据安全和系统稳定性。