MySQL主从复制对主库性能的影响通常很小,约在1-5%之间,但具体影响取决于多个因素。
| 场景 | 性能影响 | 说明 |
|---|---|---|
| 低负载场景 | 1-2% | 写入量小,影响可忽略 |
| 中等负载场景 | 2-4% | 正常业务负载,影响轻微 |
| 高负载场景 | 4-8% | 大量写入操作,影响稍明显 |
| 极高负载场景 | 5-10% | 极端情况下可能达到10% |
无主从复制:
事务提交 → 数据写入 → 提交完成
有主从复制:
事务提交 → 数据写入 → binlog写入 → 提交完成
↑ 额外开销(约1-3%)
| 指标 | 无主从 | 有主从 | 性能下降 |
|---|---|---|---|
| TPS | 5000 | 4850 | 3% |
| 平均响应时间 | 20ms | 21ms | 5% |
| CPU使用率 | 65% | 68% | 4.6% |
| 磁盘I/O | 80MB/s | 85MB/s | 6.25% |
| 网络带宽 | 0 | 15MB/s | - |
# my.cnf 主库配置
[mysqld]
# 使用ROW格式,性能最优
binlog-format = ROW
# 优点:
# - 数据一致性最好
# - 主库性能影响最小
# - 支持并行复制
性能提升:相比STATEMENT格式,性能提升约2-3%
# my.cnf 主库配置
[mysqld]
# 方案A:性能优先(推荐用于主从场景)
sync_binlog = 0
# 说明:由操作系统控制刷盘,性能最好
# 风险:主库宕机可能丢失最后1秒的binlog
# 适用:主从复制场景,从库有数据备份
# 方案B:安全优先(推荐用于单机场景)
sync_binlog = 1
# 说明:每次事务提交都刷盘,最安全
# 性能:性能下降约5-10%
# 适用:无主从复制或对数据安全要求极高
# 方案C:平衡方案
sync_binlog = 100
# 说明:每100个事务刷盘一次
# 性能:性能下降约2-3%
# 适用:平衡性能和安全
性能提升:使用sync_binlog=0可提升约3-5%
# my.cnf 主库配置
[mysqld]
# 增大binlog文件大小,减少文件切换开销
max_binlog_size = 500M
# 默认100M,增大到500M可减少约1%开销
# my.cnf 主库配置
[mysqld]
# 自动清理7天前的binlog
expire_logs_days = 7
# 或使用定时任务手动清理
# 0 2 * * * mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
性能提升:减少磁盘空间占用,间接提升性能
# 主从复制使用专用网络接口
# 避免与业务流量竞争带宽
# 主库配置
bind-address = 172.16.0.67 # 业务网络
# 从库通过172.16.0.67连接
# 或使用专用网卡
# 主库:eth0(业务),eth1(复制)
# 从库通过eth1连接
# my.cnf 主库配置
[mysqld]
# 增大binlog传输缓冲区
binlog_cache_size = 1M
# 优化网络超时
slave_net_timeout = 60
# 将binlog存储在SSD上
# /etc/my.cnf
[mysqld]
log-bin = /ssd/mysql-bin/mysql-bin
性能提升:SSD相比机械硬盘,binlog写入性能提升约50-80%
# my.cnf 主库配置
[mysqld]
# 增大InnoDB缓冲池
innodb_buffer_pool_size = 8G
# 增大binlog缓存
binlog_cache_size = 2M
max_binlog_cache_size = 512M
# my.cnf 从库配置
[mysqld]
# 启用并行复制,加快从库应用速度
slave_parallel_workers = 4
slave_parallel_type = LOGICAL_CLOCK
效果:从库应用更快,减少主库binlog堆积,间接提升主库性能
-- 从库配置延迟复制(可选)
CHANGE MASTER TO
MASTER_DELAY = 3600; -- 延迟1小时
说明:延迟复制不影响主库性能,但可以用于数据恢复
# /etc/my.cnf 主库配置
[mysqld]
# 基础配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
# 性能优化
sync_binlog = 0 # 性能优先
max_binlog_size = 500M # 增大文件大小
expire_logs_days = 7 # 自动清理
binlog_cache_size = 2M # 增大缓存
# 硬件优化
innodb_flush_log_at_trx_commit = 2 # 性能优先
适用场景:
性能影响:约 1-2%
# /etc/my.cnf 主库配置
[mysqld]
# 基础配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
# 安全优化
sync_binlog = 1 # 安全优先
max_binlog_size = 100M
expire_logs_days = 7
binlog_cache_size = 1M
# 数据安全
innodb_flush_log_at_trx_commit = 1 # 安全优先
适用场景:
性能影响:约 4-6%
# /etc/my.cnf 主库配置
[mysqld]
# 基础配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
# 平衡配置
sync_binlog = 100 # 每100个事务刷盘
max_binlog_size = 500M
expire_logs_days = 7
binlog_cache_size = 2M
# 数据安全
innodb_flush_log_at_trx_commit = 1 # 安全优先
适用场景:
性能影响:约 2-3%
-- 1. 查看binlog写入性能
SHOW STATUS LIKE 'Binlog_cache%';
SHOW STATUS LIKE 'Binlog_stmt_cache%';
-- 2. 查看主从复制延迟
SHOW SLAVE STATUS\G
-- 关注:Seconds_Behind_Master
-- 3. 查看binlog文件大小
SHOW BINARY LOGS;
-- 4. 查看主库性能
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Questions';
SHOW STATUS LIKE 'Slow_queries';
# 使用sysbench进行压力测试
# 测试无主从场景
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=password \
--mysql-db=test \
--tables=10 \
--table-size=100000 \
--threads=16 \
--time=300 \
run
# 测试有主从场景(相同参数)
# 对比TPS和响应时间
sync_binlog=0时,主库宕机可能丢失最后1秒数据📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✍️ 作者: Cursor AI