MySQL主从复制、参数优化
MySQL作为一款主流的关系型数据库,具有优秀的性能和高并发能力。本文档主要记录MySQL的安装、用户访问配置、配置文件优化和主从复制等内容。关于Linux系统的安装、磁盘挂载与扩容等内容请参考博客的其他目录。
MySQL安装
安装MySQL为了快捷安装,直接使用宝塔面板安装的mysql5.7.44版本。安装完成之后将存储目录迁移至/data/mysql目录下,/data目录挂载的1.2T容量的xfs文件系统。这样就满足了数据存储容量的需要,同时使用逻辑卷和磁盘卷组进行方便后续的动态扩容。此过程较为简单不再进行赘述。
MySQL主机
创建复制账号
1 | //创建复制账号 |
主机配置参数
1 | # 设定log参数 |
主机状态
MySQL主机先不要写入数据,同时查看主机的状态。
1 | mysql> show master status; |
MySQL从机
从机配置参数
1 | log-bin=mysql-bin |
从机此时从主机将目标数据库中的数据全部拷贝过来,保证主从数据库最开始的一致性。
从机启动复制
1 | change master to master_host='192.168.0.42',master_user='accountSlave',master_password='yourpassword',master_log_file='mysql-bin.000015',master_log_pos=991771720; |
从机查阅到主机的日志文件和pos位置,将其写入到拷贝命令中,然后启动复制。然后登录客户端查看从机状态。Slave_IO_Running: Yes和Slave_SQL_Running: Yes表示从机正常复制。
1 | mysql> show slave status\G; |
MySQL性能调优
MySQL大多数场景都是使用innodb引擎,故相关的调优以innodb进行设置记录。
innodb_buffer_pool_size
该参数是innodb引擎的缓冲池大小,其设置值最大为服务器内存的75%,剩余25%部分需要供操作系统和其他软件进行使用。InnoDB 缓冲池是内存中的缓存区域,用于存储:
- 数据页:表数据
- 索引页:索引数据
- 自适应哈希索引
- 锁信息(部分)
- 数据字典
innodb_read_io_threads与innodb_write_io_threads
控制 InnoDB 后台I/O线程数 的重要参数,直接影响数据库的磁盘I/O性能该参数的设置要考虑实际CPU核数,设置过大并不会带来性能的提升,反而会导致竞争加大。一般设置为=CPU的核数即可。
max_connections
MySQL允许的最大并发连接数,此处需要估计业务实际情况,设置偏小会影响业务的正常运行,同时也要考虑ulimit限制和MySQL的open_files_limit参数限制。应首先从系统层面优化,然后协同MySQL配置优化。
table_open_cache
MySQL 中控制表文件描述符缓存的关键参数,直接影响数据库的并发性能。一般为max_connections的两倍。
query_cache_type与query_cache_size
MySQL从5.7开始就准备废弃查询缓存,8.0直接废弃掉查询缓存。
| 问题 | 影响 |
|---|---|
| 全局锁竞争 | 每次缓存访问需要全局锁,高并发下成为瓶颈 |
| 缓存失效频繁 | 表有更新就整个表缓存失效 |
| 内存碎片化 | 长期运行后内存效率下降 |
| MySQL 8.0已移除 | 技术已淘汰 |
innodb_flush_log_at_trx_commit
InnoDB 最关键的持久性配置参数,直接决定事务的 ACID 特性中 Durability(持久性) 的保证级别。这个参数控制 InnoDB 在事务提交时如何将 redo log(重做日志)写入并刷新到磁盘。
| 值 | 工作机制 | 数据安全性 | 性能影响 | 适用场景 |
|---|---|---|---|---|
1 (默认) |
每次提交都执行 write() + fsync(),确保日志落盘 |
最高 崩溃/断电不丢已提交事务 | 最慢 频繁磁盘I/O | 金融、支付等绝对不能丢数据的场景 |
0 |
每秒一次由后台线程执行 write() + fsync() |
最低 崩溃可能丢失近1秒数据 | 最快 大幅减少I/O | 监控数据、日志等可容忍丢失的场景 |
2 |
每次提交执行 write(),每秒一次 fsync() |
中等 MySQL崩溃安全,OS崩溃可能丢数据 | 较快 平衡性能与安全 | 常规业务,可接受OS崩溃风险 |
sync_binlog
MySQL二进制日志刷盘策略的核心参数,直接控制主从复制的数据安全性与性能平衡,尤其在你的主从架构中至关重要。
| 值 | 刷盘时机 | 数据安全 | 性能 | 适用场景 |
|---|---|---|---|---|
0 |
OS控制,异步刷盘 | 最低 MySQL/OS崩溃都可能丢数据 | 最高 | 可丢数据的非核心业务 |
1 (推荐) |
每次事务提交都刷盘 | 最高 最多丢失1个事务 | 最低 | 生产主库必须 |
N (>1) |
每N个事务刷盘一次 | 中等 可能丢失最多N个事务 | 中等 | 高写入负载,明确接受风险 |
binlog_format
MySQL二进制日志格式 的关键参数,决定了主从复制中数据变更的记录方式,直接影响复制可靠性、性能和数据一致性。
| 特性 | STATEMENT | ROW (推荐) | MIXED |
|---|---|---|---|
| 记录内容 | SQL语句 | 每行数据变化 | 混合,由MySQL决定 |
| 数据一致性 | 低(可能主从不一致) | 高(绝对一致) | 中等(大部分一致) |
| 日志大小 | 很小 | 可能很大(取决于变更行数) | 中等 |
| 复制性能 | 高(重放SQL快) | 可能较低(传输数据多) | 可变 |
| 故障排查 | 难(不知道具体数据变化) | 易(看到每行变化) | 混合 |
| MySQL 8.0默认 | 不支持(已移除) | ROW | 不支持(已移除) |
expire_logs_days
二进制日志文件自动保留的天数,超过天数的 binlog 文件会被自动删除。
慢查询日志
1 | slow_query_log=1 |
开启慢查询,指定慢查询日志位置,同时指定超过n秒的慢查询都要进行记录。这有助于排查sql语句,优化数据库结构或者业务结构。
innodb_lock_wait_timeout
设置 事务等待行锁的最长时间(秒),超过时间后自动回滚并报错。
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 实时交易 | 10-20秒 | 快速失败,避免堆积 |
| 常规业务 | 30秒 | 平衡等待与超时 |
| 批量处理 | 50-120秒 | 长事务需要更长时间 |
| 数据同步 | 300秒 | 容忍长时间锁等待 |
| 当前配置 | 50秒 | 偏长,可优化 |

