面试题答案
一键面试优化 binlog 写入性能
- 调整 binlog 写入模式:
sync_binlog
参数:- 取值为0时,MySQL不主动将binlog cache中的数据同步到磁盘,而是由操作系统控制刷盘时机,这样性能最高,但在系统崩溃时可能丢失部分binlog数据。
- 取值为1时,每次事务提交时都将binlog cache中的数据同步到磁盘,这保证了数据的一致性,但性能相对较低。
- 取值大于1时,表示每N次事务提交后才将binlog cache中的数据同步到磁盘,在性能和数据安全性之间取得一定平衡。一般可根据业务对数据安全的要求,适当设置大于1的值,如
sync_binlog = 100
,即每100次事务提交后同步binlog到磁盘,可提升写入性能。
- 增大 binlog cache 大小:
binlog_cache_size
参数:设置每个连接的binlog cache大小。对于大事务,适当增大此值可避免多次将binlog cache中的数据写入临时文件,从而提升性能。例如,若经常有大事务操作,可将其设置为64M
甚至更大。
- 使用组提交(Group Commit):
- MySQL从5.5版本开始支持二进制日志组提交。多个事务提交时,可将它们的binlog写入操作合并,减少磁盘I/O次数。这一机制是自动启用的,但可通过调整相关参数进一步优化。如
innodb_flush_log_at_trx_commit
参数设置为2时,InnoDB的redo log刷盘频率和binlog组提交能更好配合,在保证一定数据安全性的同时提升写入性能。
- MySQL从5.5版本开始支持二进制日志组提交。多个事务提交时,可将它们的binlog写入操作合并,减少磁盘I/O次数。这一机制是自动启用的,但可通过调整相关参数进一步优化。如
从库端高效处理事件分发
- 多线程复制:
- 从MySQL 5.6开始支持并行复制。可通过设置
slave_parallel_workers
参数开启多线程复制,指定从库用于并行应用中继日志(relay log)的线程数。例如设置为8,表示从库可以同时有8个线程并行应用中继日志中的事件,加快复制速度。 - 并行复制模式:
slave_parallel_type
参数,取值为DATABASE
时,基于库并行复制,不同库的事务可并行应用;取值为LOGICAL_CLOCK
时,基于逻辑时钟并行复制,更细粒度地根据事务间的依赖关系并行应用事务,性能提升更显著。
- 从MySQL 5.6开始支持并行复制。可通过设置
- 优化中继日志处理:
relay_log_recovery
参数设置为1,从库在崩溃恢复时能自动重新创建中继日志,并从中断点继续复制,避免因中继日志损坏导致复制中断。max_relay_log_size
参数设置中继日志的最大大小,避免中继日志过大影响I/O性能。
可能涉及到的MySQL参数调整与相关机制
- 主库参数:
log_bin
:开启二进制日志功能,格式为log_bin = /path/to/binlog
,指定binlog文件路径。binlog_format
:设置二进制日志格式,常见取值有STATEMENT
(基于语句记录)、ROW
(基于行记录)、MIXED
(混合模式)。ROW
模式在高并发写入时能更准确记录数据变化,减少主从数据不一致风险,但日志量相对较大;STATEMENT
模式日志量小,但在某些复杂场景下可能导致主从数据不一致。
- 从库参数:
read_only
:设置为1,使从库只读,防止误操作修改数据。slave_sql_verify_checksum
:设置为1,从库在应用中继日志时验证checksum,确保数据一致性。master_info_repository
和relay_log_info_repository
:可设置为TABLE
,将主库连接信息和中继日志信息存储在表中,相比文件存储更可靠,在崩溃恢复时更稳定。