从mysql主从复制原理分析故障及延时场景!

发布时间 2023-07-01 14:14:36作者: 萧痕痕痕痕

在很多的情况下生产环境所发生的问题,实际上都可以通过其工作原理来解决例如:mysql主从复制原理:

 

 

1.当用户在主库中写入数据时,将sql语句的执行写入binlog二进制文件中

2.从库会生成一个i/o线程用来监听binlog日志文件的变化,若binlog文件发生变化,那么i/o线程将会提取binlog日志文件中的变化,并将其写入从库relaylog中。而此过程进行的候,master主库也会生成mysql dump进程用来将日志改变内容发送给i/o线程。

3.从库也会生成一个sql线程用来将relaylog日志文件中的新增转换为sql语句在从库中执行。

4.至此主从复制完成。

  那么既然说知道了复制原理以及这个过程中关键的几个线程,那么我们所面对的问题是否可以从这几个核心内容上去入手分析!

 

首先从io线程去分析故障:

 

1.io线程要去binlog日志文件中获取日志,那么如果说binlog日志丢失呢,(公司定期清理日志,机缘巧合,刚复制的时候,日志被清理了)此时io线程找不到binlog日志则会成变为故障状态

2.io线程同时也会负责主从之间的连接,如果此时网络断了,或者时主库宕机了,或者是主数据库密码错误,也会导致双端故障。(双方都互相不通信了自然就会出现故障)

3.io线程拿到日志后会写入relaylog日志,那么如果从库relaylog丢失或者故障,那么会使拿到的日志没地方去写,导致主从故障。

 

再从sql线程去分析故障(sql语句执行不了)

那么sql线程是做什么的,他就是回访relaylog中的日志事件,也就是在后台执行sql语句。

1.realy-log文件丢失(误删或者是磁盘故障)。找不到relaylog文件导致主从复制故障。

2.数据库的版本不同,某些操作因为版本的不同无法操作。

3.表的数据类型不同,导致写入的时候,无法写入

4.当主库写入的时候发送从库内容不一致(异步复制的时候多见)出现故障。

 

那么分析完故障以后,再分析一下主从延时。(主库做了之后从库很久都没有做)

影响:业务中做了读写分离,写进入之后一致查询不到信息!

监控方法:Seconds_Behind_Master 参数

分析原理

主库:

1.binlogdumpbinlog中的日志发送给io线程,再高并发写入时,binlogdump压力过大导致延时。没有groupcommit5.7版本底层自动实现)批量提交时大量数据一条一条给到io

2.事务的大小导致binlogdump发的慢。

从库:

  1. i/o线程落地慢,写入慢。考虑高性能硬件。或者说换结构。
  2. Sql线程回放:默认只有1sql线程,那当执行时一条一条的执行relaylog。导致延时。当然也可以初始化多个sql线程,但对于执行的顺序会有问题发生!

 

 

总结:很多实际环境中的问题都可以通过从底层原理上去分析出来,那么当你遇到问题的时候能够快读定位问题所在,对于自己解决问题的帮助是否很大呢?比如故障了,选择重构,或者是根据业务指定其他解决方案。