本文档风哥主要介绍MySQL的主从复制配置与优化,包括主从复制的原理、配置步骤、故障处理等内容。风哥教程参考MySQL官方文档Replication、MySQL Server
Administration等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 MySQL主从复制的概念
主从复制是MySQL提供的一种数据复制机制,允许将主服务器(Master)的数据复制到一个或多个从服务器(Slave)。主从复制可以用于数据备份、负载均衡、高可用等场景。学习交流加群风哥微信: itpux-com
1.2 MySQL主从复制的原理
- 主服务器:将数据变更记录到二进制日志(Binary Log)
- 从服务器:读取主服务器的二进制日志,将变更应用到自己的数据库
- 复制过程:从服务器通过IO线程读取主服务器的二进制日志,写入中继日志(Relay Log),然后通过SQL线程将中继日志中的变更应用到数据库
1.3 MySQL主从复制的类型
MySQL支持多种复制类型,每种类型都有其特点和适用场景:学习交流加群风哥QQ113257174
风哥提示:选择合适的复制类型需要考虑数据一致性要求、性能需求等因素。
- 基于语句的复制(SBR):复制SQL语句,日志量小,易于理解,但可能存在复制不一致的情况
- 基于行的复制(RBR):复制行数据,更准确,适用于复杂语句和存储过程,但日志量较大
- 混合复制(MBR):根据语句选择复制方式,结合SBR和RBR的优点
Part02-生产环境规划与建议
2.1 MySQL主从复制架构规划
在生产环境中,主从复制架构的规划需要考虑以下因素:更多学习教程公众号风哥教程itpux_com
2.1.1 架构类型
- 一主一从:最简单的架构,适用于小型应用
- 一主多从:一个主服务器,多个从服务器,适用于读密集型应用
- 级联复制:从服务器作为其他从服务器的主服务器,适用于远距离复制
- 双主复制:两个主服务器互相复制,适用于需要双向写入的场景
2.2 MySQL主从复制性能规划
性能规划需要考虑以下因素:from mysql视频:www.itpux.com
- 网络带宽:确保主从服务器之间的网络带宽足够
- 硬件配置:从服务器的硬件配置应不低于主服务器
- 复制延迟:监控和优化复制延迟
- 存储性能:确保从服务器的存储性能足够
Part03-生产环境项目实施方案
3.1 MySQL主从复制配置
3.1.1 主服务器配置
vi /etc/my.cnf
[mysqld]
# 服务器ID(必须唯一)
server-id = 1
# 启用二进制日志
log_bin = /var/log/mysql/mysql-bin.log
# 二进制日志格式(推荐使用ROW)
binlog_format = ROW
# 保留二进制日志的天数
expire_logs_days = 7
# 同步复制(确保二进制日志写入磁盘)
sync_binlog = 1
# 重启MySQL服务
systemctl restart mysqld
# 验证二进制日志是否启用
mysql -u root -p -e “SHOW VARIABLES LIKE ‘log_bin’;”
Enter password: Fgedu123!
+—————+——-+
| Variable_name | Value |
+—————+——-+
| log_bin | ON |
+—————+——-+
3.1.2 从服务器配置
vi /etc/my.cnf
[mysqld]
# 服务器ID(必须唯一,与主服务器不同)
server-id = 2
# 启用中继日志
relay-log = /var/log/mysql/relay-bin
# 中继日志索引文件
relay-log-index = /var/log/mysql/relay-bin.index
# 从服务器只读(推荐配置)
read-only = 1
# 跳过错误(生产环境不推荐,仅用于测试)
# slave-skip-errors = all
# 重启MySQL服务
systemctl restart mysqld
# 验证服务器ID配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘server_id’;”
Enter password: Fgedu123!
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id | 2 |
+—————+——-+
3.1.3 创建复制用户
mysql -u root -p
Enter password: Fgedu123!
— 创建复制用户(限制从特定IP访问)
CREATE USER ‘repl’@’192.168.1.101’ IDENTIFIED BY ‘Fgedu123!’;
— 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.101’;
— 刷新权限
FLUSH PRIVILEGES;
— 验证用户权限
SHOW GRANTS FOR ‘repl’@’192.168.1.101’;
+———————————————————–+
| Grants for repl@192.168.1.101 |
+———————————————————–+
| GRANT REPLICATION SLAVE ON *.* TO `repl`@`192.168.1.101` |
+———————————————————–+
3.1.4 配置从服务器连接
mysql -u root -p -e “SHOW MASTER STATUS;”
Enter password: Fgedu123!
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000001 | 154 | | | |
+——————+———-+————–+——————+——————-+
# 在从服务器上连接MySQL
mysql -u root -p
Enter password: Fgedu123!
— 配置从服务器连接主服务器
CHANGE MASTER TO
MASTER_HOST = ‘192.168.1.100’, — 主服务器IP
MASTER_USER = ‘repl’, — 复制用户
MASTER_PASSWORD = ‘Fgedu123!’, — 复制用户密码
MASTER_LOG_FILE = ‘mysql-bin.000001’, — 主服务器日志文件
MASTER_LOG_POS = 154; — 主服务器日志位置
— 启动从服务器复制进程
START SLAVE;
— 查看从服务器状态
SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
3.2 MySQL主从复制监控
监控主从复制状态是确保复制正常运行的重要环节:更多视频教程www.fgedu.net.cn
3.2.1 查看复制状态
mysql -u root -p -e “SHOW SLAVE STATUS\G;”
3.2.2 监控复制延迟
mysql -u root -p -e “SHOW SLAVE STATUS\G” | grep Seconds_Behind_Master
Part04-生产案例与实战讲解
4.1 MySQL主从复制故障处理
主从复制过程中可能遇到各种故障,需要及时处理:学习交流加群风哥微信: itpux-com
4.1.1 常见故障及解决方法
- 复制中断:检查错误日志,修复错误后重新启动复制
- 复制延迟:优化网络、硬件或SQL语句
- 主从数据不一致:重新初始化从服务器
4.2 MySQL主从复制性能优化
性能优化可以提高主从复制的效率:学习交流加群风哥QQ113257174
- 使用ROW格式:减少复制冲突
- 启用并行复制:提高复制速度
- 优化网络:确保主从服务器之间的网络带宽
- 合理配置缓冲池:提高从服务器性能
4.3 MySQL半同步复制
半同步复制可以提高数据安全性:风哥提示:半同步复制会增加主服务器的响应时间,需要根据业务需求权衡。
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
# 启用半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Part05-风哥经验总结与分享
5.1 MySQL主从复制最佳实践
在生产环境中,主从复制的最佳实践包括:更多学习教程公众号风哥教程itpux_com
- 定期备份:即使有主从复制,也要定期备份数据
- 监控复制状态:及时发现和处理复制问题
- 合理规划架构:根据业务需求选择合适的复制架构
- 优化性能:根据实际情况优化复制性能
5.2 MySQL主从复制经验总结
通过实际项目经验,总结以下几点:from mysql视频:www.itpux.com
- 网络稳定性:确保主从服务器之间的网络稳定
- 硬件配置:从服务器的硬件配置不应低于主服务器
- 监控告警:设置复制延迟告警,及时发现问题
- 定期维护:定期清理二进制日志,优化复制配置
5.3 总结
MySQL主从复制是一种重要的数据复制机制,可以用于数据备份、负载均衡、高可用等场景。通过合理的配置和优化,可以确保主从复制的稳定运行,提高系统的可靠性和可用性。更多视频教程www.fgedu.net.cn
# 增大复制网络超时时间
slave_net_timeout = 60
# 重启MySQL服务
systemctl restart mysqld
# 验证并行复制配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘slave_parallel%’;”
Enter password: Fgedu123!
+————————+—————+
| Variable_name | Value |
+————————+—————+
| slave_parallel_type | LOGICAL_CLOCK |
| slave_parallel_workers | 4 |
+————————+—————+
4.1.2 配置优化
vi /etc/my.cnf
[mysqld]
# 二进制日志配置
binlog_format = ROW
sync_binlog = 1
binlog_cache_size = 32M
max_binlog_size = 1G
# 从服务器优化配置
vi /etc/my.cnf
[mysqld]
# 并行复制
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
# 中继日志优化
relay_log_recovery = 1
relay_log_space_limit = 4G
# 重启MySQL服务
systemctl restart mysqld
# 验证主服务器配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘binlog_format’;”
Enter password: Fgedu123!
+—————+——-+
| Variable_name | Value |
+—————+——-+
| binlog_format | ROW |
+—————+——-+
# 验证从服务器配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘relay_log_recovery’;”
Enter password: Fgedu123!
+———————+——-+
| Variable_name | Value |
+———————+——-+
| relay_log_recovery | ON |
+———————+——-+
4.1.3 网络优化
vi /etc/my.cnf
[mysqld]
# 启用压缩传输
slave_compressed_protocol = 1
# 调整网络超时时间
connect_timeout = 10
net_read_timeout = 30
net_write_timeout = 30
# 重启MySQL服务
systemctl restart mysqld
# 验证网络优化配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘slave_compressed_protocol’;”
Enter password: Fgedu123!
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| slave_compressed_protocol | ON |
+————————-+——-+
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%timeout’ LIMIT 3;”
Enter password: Fgedu123!
+———————+——-+
| Variable_name | Value |
+———————+——-+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
+———————+——-+
Part02-生产规划与架构设计
2.1 复制拓扑设计
2.1.1 一主一从
最简单的复制拓扑,一个主服务器和一个从服务器。
2.1.2 一主多从
一个主服务器和多个从服务器,适用于读负载较高的场景。
Part02-生产规划与架构设计
2.1.3 级联复制
从服务器作为其他从服务器的主服务器,减轻主服务器的负担。
2.1.4 双主复制
两个服务器互为主从,适用于需要双向复制的场景。
4.2 复制监控与故障排查
4.2.1 监控复制状态
mysql -u root -p
Enter password: Fgedu123!
— 查看完整复制状态
SHOW SLAVE STATUS\G;
— 检查复制延迟(使用performance_schema)
SELECT TIMESTAMPDIFF(SECOND, MAX(last_update), NOW()) AS replication_delay
FROM performance_schema.replication_connection_status;
+—————–+
| replication_delay |
+—————–+
| 0 |
+—————–+
— 监控复制工作线程状态
SELECT worker_id, service_state, last_error_number, last_error_message
FROM performance_schema.replication_applier_status_by_worker;
+———–+—————+——————+———————+
| worker_id | service_state | last_error_number | last_error_message |
+———–+—————+——————+———————+
| 1 | ON | 0 | |
| 2 | ON | 0 | |
| 3 | ON | 0 | |
| 4 | ON | 0 | |
+———–+—————+——————+———————+
— 检查复制连接状态
SELECT channel_name, service_state, last_error_number, last_error_message
FROM performance_schema.replication_connection_status;
+————–+—————+——————+———————+
| channel_name | service_state | last_error_number | last_error_message |
+————–+—————+——————+———————+
| | ON | 0 | |
+————–+—————+——————+———————+
4.2.2 常见复制错误
MySQL主从复制中常见的错误类型及解决方案:
- 错误1062 (Duplicate entry):主键冲突
- 可能原因:从服务器上已存在要复制的记录,导致主键冲突
- 解决方案:检查数据一致性,手动解决冲突,或使用
slave-skip-errors参数跳过特定错误
- 错误1032 (Can’t find record):记录不存在
- 可能原因:主服务器要删除的记录在从服务器上不存在
- 解决方案:检查数据一致性,手动解决,或跳过该错误
- 错误1236 (Got fatal error 1236):二进制日志损坏
- 可能原因:主服务器的二进制日志文件损坏或不完整
- 解决方案:重新配置复制,从新的日志位置开始,或使用
mysqlbinlog工具修复日志
- 错误2003 (Can’t connect to MySQL server):网络连接问题
- 可能原因:主从服务器之间网络连接失败,或防火墙阻止了连接
- 解决方案:检查网络连接和防火墙设置,确保复制用户权限正确
4.2.3 故障排查步骤
- 查看错误日志:检查MySQL错误日志
- 查看复制状态:使用SHOW SLAVE STATUS\G
- 检查网络连接:确保主从服务器之间网络通畅
- 检查数据一致性:使用工具检查主从数据一致性
- 重新配置复制:必要时重新配置复制
4.3 半同步复制
4.3.1 半同步复制的概念
半同步复制是一种增强的复制模式,主服务器在提交事务前,需要至少一个从服务器确认已接收并写入中继日志,然后才提交事务。这种模式提高了数据的安全性,但可能会增加主服务器的延迟。
4.3.2 半同步复制配置
vi /etc/my.cnf
[mysqld]
# 加载半同步主插件
plugin-load = “rpl_semi_sync_master=semisync_master.so”
# 启用半同步主复制
rpl_semi_sync_master_enabled = 1
# 设置超时时间(10秒)
rpl_semi_sync_master_timeout = 10000
# 重启主服务器MySQL服务
systemctl restart mysqld
# 从服务器配置半同步复制
vi /etc/my.cnf
[mysqld]
# 加载半同步从插件
plugin-load = “rpl_semi_sync_slave=semisync_slave.so”
# 启用半同步从复制
rpl_semi_sync_slave_enabled = 1
# 重启从服务器MySQL服务
systemctl restart mysqld
# 在主服务器上验证半同步复制是否启用
mysql -u root -p -e “SHOW GLOBAL VARIABLES LIKE ‘rpl_semi_sync_master_enabled’;”
Enter password: Fgedu123!
+——————————+——-+
| Variable_name | Value |
+——————————+——-+
| rpl_semi_sync_master_enabled | ON |
+——————————+——-+
# 在从服务器上验证半同步复制是否启用
mysql -u root -p -e “SHOW GLOBAL VARIABLES LIKE ‘rpl_semi_sync_slave_enabled’;”
Enter password: Fgedu123!
+—————————–+——-+
| Variable_name | Value |
+—————————–+——-+
| rpl_semi_sync_slave_enabled | ON |
+—————————–+——-+
4.3.3 半同步复制监控
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Rpl_semi_sync%’;”
Enter password: Fgedu123!
+——————————————–+——-+
| Variable_name | Value |
+——————————————–+——-+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 10 |
| Rpl_semi_sync_master_net_wait_time | 100 |
| Rpl_semi_sync_master_net_waits | 10 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 20 |
| Rpl_semi_sync_master_tx_wait_time | 200 |
| Rpl_semi_sync_master_tx_waits | 10 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 10 |
+——————————————–+
# 查看半同步复制配置
mysql -u root -p -e “SHOW GLOBAL VARIABLES LIKE ‘rpl_semi_sync%’;”
Enter password: Fgedu123!
+——————————————-+——-+
| Variable_name | Value |
+——————————————-+——-+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+——————————————-+——-+
Part05-风哥经验总结与分享
5.1 最佳实践
MySQL主从复制的最佳实践包括:
- 选择合适的复制类型:根据实际需求选择SBR、RBR或MBR
- 合理配置复制拓扑:根据业务需求选择一主一从、一主多从或级联复制
- 启用并行复制:提高从服务器的复制性能
- 监控复制状态:定期检查复制延迟和错误
- 备份二进制日志:确保数据可以恢复到任意时间点
- 使用半同步复制:提高数据的安全性
5.2 经验总结
5.2.1 复制工具
pt-table-checksum –host=192.168.1.100 –user=root –password=Fgedu123! –databases=app_db
# 使用pt-table-sync同步主从数据
pt-table-sync –execute –sync-to-master h=192.168.1.101,u=root,p=Fgedu123! –databases=app_db
# 使用mysqlbinlog查看二进制日志
mysqlbinlog /var/log/mysql/mysql-bin.000001 | head -50
# 使用mysqldump备份主服务器数据
mysqldump -u root -p –master-data=2 –single-transaction app_db > app_db.sql
Enter password: Fgedu123!
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥MySQL培训视频教程已上线B站
MySQL高级运维技术实战课程
数据库架构设计与优化专家
关注风哥获取更多数据库技术干货
9.2 复制配置示例
# 主服务器配置
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
sync_binlog = 1
plugin-load = "rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_master_enabled = 1
# 从服务器配置
[mysqld]
server-id = 2
relay-log = /var/log/mysql/relay-bin
read-only = 1
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
relay_log_recovery = 1
plugin-load = "rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_slave_enabled = 1
9.3 复制维护
- 定期备份:确保数据安全
- 监控复制延迟:及时发现问题
- 检查数据一致性:定期使用pt-table-checksum
- 更新MySQL版本:获取最新的复制功能和 bug 修复
- 文档化配置:记录复制拓扑和配置
10. 总结
MySQL的主从复制是一种重要的数据复制机制,可以用于数据备份、负载均衡、高可用等场景。通过合理的配置和优化,可以提高复制的性能和可靠性。
在实际生产环境中,建议使用行级复制、启用半同步复制、配置并行复制,并定期监控复制状态和数据一致性。同时,要根据具体的应用场景和需求,选择合适的复制拓扑,确保数据的安全性和可用性。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
