在很多的情况下生产环境所发生的问题,实际上都可以通过其工作原理来解决例如: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.binlogdump将binlog中的日志发送给io线程,再高并发写入时,binlogdump压力过大导致延时。没有groupcommit(5.7版本底层自动实现)批量提交时大量数据一条一条给到io。
2.事务的大小导致binlogdump发的慢。
从库:
- i/o线程落地慢,写入慢。考虑高性能硬件。或者说换结构。
- Sql线程回放:默认只有1个sql线程,那当执行时一条一条的执行relaylog。导致延时。当然也可以初始化多个sql线程,但对于执行的顺序会有问题发生!
总结:很多实际环境中的问题都可以通过从底层原理上去分析出来,那么当你遇到问题的时候能够快读定位问题所在,对于自己解决问题的帮助是否很大呢?比如故障了,选择重构,或者是根据业务指定其他解决方案。
标签:binlog,主从复制,sql,故障,线程,延时,mysql,日志,从库 From: https://www.cnblogs.com/lgdyes/p/17519218.html