1. 首页 > MySQL教程 > 正文

MySQL教程FG041-MySQL主从复制配置与优化

本文档风哥主要介绍MySQL的主从复制配置与优化,包括主从复制的原理、配置步骤、故障处理等内容。风哥教程参考MySQL官方文档Replication、MySQL Server
Administration等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 MySQL主从复制的概念

主从复制是MySQL提供的一种数据复制机制,允许将主服务器(Master)的数据复制到一个或多个从服务器(Slave)。主从复制可以用于数据备份、负载均衡、高可用等场景。学习交流加群风哥微信: itpux-com

1.2 MySQL主从复制的原理

  1. 主服务器:将数据变更记录到二进制日志(Binary Log)
  2. 从服务器:读取主服务器的二进制日志,将变更应用到自己的数据库
  3. 复制过程:从服务器通过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 主服务器配置

# 编辑主服务器MySQL配置文件
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 从服务器配置

# 编辑从服务器MySQL配置文件
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
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

GF-MySQL数据库培训文档系列

# 增大复制网络超时时间
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 故障排查步骤

  1. 查看错误日志:检查MySQL错误日志
  2. 查看复制状态:使用SHOW SLAVE STATUS\G
  3. 检查网络连接:确保主从服务器之间网络通畅
  4. 检查数据一致性:使用工具检查主从数据一致性
  5. 重新配置复制:必要时重新配置复制

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检查主从数据一致性
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高级运维技术实战课程

数据库架构设计与优化专家

关注风哥获取更多数据库技术干货

GF-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的主从复制是一种重要的数据复制机制,可以用于数据备份、负载均衡、高可用等场景。通过合理的配置和优化,可以提高复制的性能和可靠性。

在实际生产环境中,建议使用行级复制、启用半同步复制、配置并行复制,并定期监控复制状态和数据一致性。同时,要根据具体的应用场景和需求,选择合适的复制拓扑,确保数据的安全性和可用性。

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息