数据库运维状况里,MySQL从库复制延迟常常属于最让人头疼的问题范畴之一,它针对数据一致性有着直接影响,对业务查询准确性,也有着直接影响,另对系统扩展能力同样有着直接影响,甚至还极有可能致使生产事故发生。
sync相关参数调整
处于从库追延迟的那种场景的时候,去调整跟日志落盘有关联的sync参数,能够以显著的程度提升效率。
进行具体操作之时,是要把innodb_flush_log_at_trx_commit设置成2,还要把sync_binlog设置为0,而这两个调整能够使得磁盘I/O频率得以减少,进而让日志写入变得更快。
应该特别加以留意的是,这般调整会致使数据安全程度下降,且仅仅是适宜于在紧急追赶延迟的状况下阶段性使用的。
当延迟问题解决后,务必及时将参数恢复为原值。
在正常的情形状况之下,提议倡导保持innodb_flush_log_at_trx_commit的值为1,sync_binlog的值为1,以此来保障确保数据的完整性以及主从的一致性。
在2024年,于MySQL 8.0版本里,这些参数的影响更为显著,操作的时候,需要格外小心、留意且慎重对待。
并发与内存优化
增加从库的回放线程并发度是提升追延迟速度的关键手段。
能够适度调节slave_parallel_workers参数,加添并行复制的线程数目,以使从库能够与此同时处理更多的事务。
MySQL 5.7以及比它更高的版本,对基于库的并行复制予以支持,8.0版本呢,支持的是基于WRITESET的更精细的粒度并行。
sync_binlog=0
sync_master_info=10000 #default
sync_relay_log=10000 #default
sync_relay_log_info=10000 #default
关于内存配置,同样不可以被忽视,当去确认延迟库不存在业务连接的这种状况下,酌情对缓冲池比例予以调整。
但是增大这个innodb_buffer_pool_size会有着风险,内存要是过度分配的话,就有可能致使SWAP触发,或者导致OOM。
基于二零二五年所积累的运维经验呢,给出这样的建议,缓冲池的容量不应超过物理内存的百分之七十,而且调整操作要分步骤去开展,与此同时还要对系统内存的使用状况进行监控。
slave并行复制配置
开启并行复制,是解决延迟问题当中,具备有效性的一种手段,对于MySQL 8.0+版本而言,能够纳入考量范围的,是使用基于logical_clock的并行复制方式。
进行实际操作期间,要将slave_parallel_type设置成LOGICAL_CLOCK,并且按照CPU核心数量对slave_parallel_workers作出调整。
不建议复制线程的数量超过 CPU 的核心数,不然的话,有可能会因为线程之间的竞争,反而致使效率降低。
innodb_buffer_pool_size=24G #24*1024*1024*1024
innodb_change_buffer_max_size=50
innodb_thread_concurrency=0
innodb_adaptive_hash_index=0
在进行并行复制这个过程的时候,是会涉及到锁机制的,而要是追求延迟时间的话,那么建议把 binlog_group_commit_sync_delay 等延迟提交的参数给关闭掉。
这一些参数,于主库之上,能够提高组提交效率,然而,在从库回放的时候,却反倒会增添等待时间。
后续从库恢复正常业务后再重新开启即可。
MGR架构临时调整

就使用MGR架构的那种环境而言,在碰到严重复制延迟的状况时,能够考虑临时性地调整成异步复制。
详细的操作是,把super_read_only设定为ON,接着,将group_replication_consistency配置为EVENTUAL,在等待延迟完全追赶上之后,再次加入到集群当中。
这种方案在2024年某电商双十一大促前的扩容中被成功应用。
需要注意的是,这种临时调整需要评估业务影响。
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=16
slave_preserve_commit_order=OFF
在处于调整的这个期间,这个节点是不会去参与集群的那种强一致性保证的,它是适宜用在只读场景的分析查询方面的。
等到数据追上平齐之后,接着逐步恢复成原来的一致性等级,整个这个过程建议在业务处于低峰的时期进行操作。
需要谨慎修改的参数
就个人而言,不建议去修改,与组提交相关的,那两个参数,即binlog_group_commit_sync_delay,以及binlog_group_commit_sync_no_delay_count。
调节这些参数,虽说能够提升性能,然而与此同时,将会致使主库事务等待,进而增加响应时间。
除非是非实时的离线分析类业务,否则不建议轻易改动。
要让关闭log_slave_updates这个参数生效,是需要对数据库进行重启操作的。
有经验的技术人员,能够借助gdb方式来进行修改,而且是不需要重启的那种,然而呢,这种办法所存在的风险是比较高的。
2023 年,有运维人员,因 gdb 操作不当,致使从库 crash,所以,没有丰富经验,就不建议去尝试!
操作前必须确认无级联复制依赖且无业务连接。
性能模板与监控分析
按照标准性能模板配置的参数通常不会成为延迟瓶颈。
经过上述思路的调整之后,从库延迟很有可能会出现一定程度的下降,而追平这一情况仅仅只是时间方面的问题而已。
其中关键之处在于,需要凭借监控工具,实时去观察复制状态,比如说借助MySQL的performance_schema,查看复制线程的具体等待事件。
解析并行复制积压日志,需要关注Relay_Log_Health指标。
要是察觉到,SQL线程所应用的日志量,跟IO线程所接收的日志量,二者之间差距特别大的时候,那就表明积压的情况非常严重了。
就在这个时候,能够将slave_status里的Seconds_Behind_Master以及Exec_Master_Log_Pos结合起来,展开综合性的判断,从而找寻出真正的瓶颈所处的地方。
你在处理MySQL从库延迟时,遇到过最棘手的案例是什么?
请在评论区踊跃分享你的实战经验,去点赞并收藏这篇文章,进而在下次碰到延迟方面的问题的时候能够迅速地进行参考。

Comments NOTHING