MySQL数据库主从同步安装与配置总结
《MySQL数据库主从同步安装与配置总结》
一、引言
MySQL作为开源关系型数据库的代表,广泛应用于互联网、金融、物联网等领域。主从同步(Replication)是其核心高可用特性之一,通过将主库(Master)的数据变更实时同步到从库(Slave),可实现读写分离、数据备份、故障转移等场景。本文将系统总结MySQL主从同步的安装与配置流程,涵盖环境准备、配置调整、同步验证及常见问题处理,为DBA和开发者提供可落地的实践指南。
二、主从同步原理与架构
1. 工作原理
MySQL主从同步基于二进制日志(Binary Log)实现。主库将所有数据变更操作(DDL/DML)记录到binlog,从库通过I/O线程读取主库的binlog并保存到中继日志(Relay Log),再由SQL线程重放这些日志,最终实现数据同步。
2. 同步模式
(1)异步复制(默认):主库执行事务后立即返回,不等待从库确认,可能丢失少量数据。
(2)半同步复制:主库至少等待一个从库接收并写入Relay Log后才返回,提高数据安全性。
(3)组复制(Group Replication):基于Paxos协议的多主同步方案,适用于高可用集群。
3. 拓扑结构
(1)一主一从:基础架构,适用于小型应用。
(2)一主多从:支持读写分离,从库可分担读压力。
(3)级联复制:主→从1→从2,减少主库负载。
(4)多主复制:多个主库互相同步,需配合GTID使用。
三、环境准备
1. 服务器规划
建议主从库使用相同MySQL版本(如8.0.x),避免兼容性问题。硬件配置需考虑业务负载,从库的CPU和IO性能应不低于主库的50%。
2. 网络要求
主从库间需开通3306端口(默认),建议延迟低于50ms。可通过ping和telnet测试连通性:
ping slave_ip
telnet master_ip 3306
3. 安装MySQL
以CentOS 7为例,使用YUM安装MySQL 8.0:
# 添加MySQL YUM仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
rpm -ivh mysql80-community-release-el7-6.noarch.rpm
# 安装MySQL服务器
yum install mysql-community-server
# 启动服务
systemctl start mysqld
systemctl enable mysqld
4. 初始化配置
修改/etc/my.cnf文件,主库和从库需分别配置以下参数:
主库配置(my.cnf):
[mysqld]
server-id = 1 # 唯一ID,主从不能重复
log-bin = mysql-bin # 启用binlog
binlog-format = ROW # 推荐使用ROW格式
binlog-do-db = testdb # 可选:指定同步的数据库
expire-logs-days = 7 # binlog保留天数
sync-binlog = 1 # 每次事务提交都刷盘
从库配置(my.cnf):
[mysqld]
server-id = 2 # 与主库不同
relay-log = mysql-relay-bin # 启用中继日志
log-slave-updates = ON # 从库记录变更到自身binlog(级联复制需要)
read-only = ON # 从库只读(可选)
replicate-do-db = testdb # 可选:指定同步的数据库
配置完成后重启服务:
systemctl restart mysqld
四、主从同步配置步骤
1. 主库创建复制账号
登录主库MySQL,执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
2. 获取主库二进制日志位置
执行以下命令获取当前binlog文件名和位置:
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | testdb | | |
+------------------+----------+--------------+------------------+-------------------+
记录File和Position值,后续配置从库时需要使用。
3. 配置从库连接主库
登录从库MySQL,执行:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='StrongPassword123!',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;
# 如果使用GTID(推荐MySQL 5.6+)
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='StrongPassword123!',
MASTER_AUTO_POSITION=1;
4. 启动复制进程
START SLAVE;
5. 验证同步状态
SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master_ip
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...(其他字段省略)
关键字段说明:
(1)Slave_IO_Running: Yes —— I/O线程正常运行
(2)Slave_SQL_Running: Yes —— SQL线程正常运行
(3)Seconds_Behind_Master: 0 —— 从库延迟(秒)
五、高级配置与优化
1. 半同步复制配置
(1)主库安装半同步插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 10000; # 10秒超时
(2)从库安装半同步插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
(3)重启从库I/O线程:
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
2. GTID全局事务标识
GTID可简化故障切换和主从切换操作。主库配置:
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
从库使用MASTER_AUTO_POSITION=1替代传统的log_file/log_pos。
3. 过滤同步数据
(1)主库过滤(不推荐):
binlog-do-db = db1 # 只同步db1
binlog-ignore-db = mysql # 忽略mysql库
(2)从库过滤(推荐):
replicate-do-db = db1
replicate-ignore-db = mysql
4. 并行复制优化
MySQL 5.7+支持基于库、事务组或WRITESET的并行复制:
[mysqld]
slave_parallel_workers = 4 # 启用4个SQL线程
slave_parallel_type = LOGICAL_CLOCK # 基于事务组并行
六、常见问题与解决方案
1. 同步中断处理
(1)错误1032(Key not found)
原因:从库执行主库的DELETE/UPDATE时找不到对应记录。
解决方案:
# 跳过指定数量的事务
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
(2)错误1062(Duplicate entry)
原因:从库存在主库已删除的重复数据。
解决方案:手动删除冲突数据后重启SQL线程。
2. 主从数据不一致检测
使用pt-table-checksum工具检测差异:
pt-table-checksum --replicate=test.checksums --host=master_ip -u root -p
pt-table-sync --sync-to-master h=slave_ip,u=root,p= --replicate=test.checksums --print
3. 延迟优化
(1)监控延迟:
SHOW SLAVE STATUS\G | grep Seconds_Behind_Master
(2)优化措施:
• 增加从库slave_parallel_workers
• 使用ROW格式binlog
• 避免在主库执行大事务
• 升级硬件(SSD、多核CPU)
七、维护与监控
1. 日常检查项
(1)同步状态:
SHOW SLAVE STATUS\G
(2)主库binlog增长:
SHOW BINARY LOGS;
(3)从库Relay Log积压:
SHOW PROCESSLIST; # 查看SQL线程状态
2. 自动化监控脚本示例
#!/bin/bash
# 检查从库状态
SLAVE_STATUS=$(mysql -uroot -p'password' -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running:|Slave_SQL_Running:|Seconds_Behind_Master:")
IO_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_IO_Running:" | awk '{print $2}')
SQL_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_SQL_Running:" | awk '{print $2}')
DELAY=$(echo "$SLAVE_STATUS" | grep "Seconds_Behind_Master:" | awk '{print $2}')
if [ "$IO_RUNNING" != "Yes" ] || [ "$SQL_RUNNING" != "Yes" ]; then
echo "ERROR: Replication is not running!" | mail -s "MySQL Replication Alert" admin@example.com
fi
if [ "$DELAY" -gt 300 ]; then
echo "WARNING: Replication delay is $DELAY seconds" | mail -s "MySQL Replication Delay" admin@example.com
fi
八、总结
MySQL主从同步是构建高可用数据库架构的基础。通过合理配置binlog、GTID、半同步复制和并行复制等特性,可显著提升数据安全性和系统性能。实际部署中需注意:
1. 保持主从库MySQL版本一致
2. 定期监控同步状态和延迟
3. 制定数据一致性校验机制
4. 准备故障切换预案
随着MySQL 8.0的普及,基于GTID的自动化主从切换和组复制技术将成为主流。DBA应持续关注官方文档和社区最佳实践,不断优化同步架构。
关键词:MySQL主从同步、二进制日志、GTID、半同步复制、并行复制、数据一致性、故障处理
简介:本文详细阐述了MySQL数据库主从同步的原理、架构设计、安装配置步骤及高级优化技术。内容涵盖环境准备、主从库配置、同步验证、常见问题处理和监控维护,结合实际案例提供可落地的解决方案,适合DBA和开发者参考。