名词解释:
文件:
binlog:主库存二进制日志的
relay-log:从库接收主库的二进制日志临时存放处。
master.info:从库中存放主库的信息处
relay-log.info:存上次接收到的relay-log位置点的信息处
线程:
binlog_dump_thread:主库用于进行二进制投递的线程
io和sql线程:从库复制的线程
主从延时原因分析:
一检查从库延时主库的时间(单位秒),执行语句mysql> show slave status \G
Seconds_Behind_Master:0
二是否执行了双一标准:
双1标准:
在主库中执行:mysql> select @@innodb_flush_log_at_trx_commit;查看值是否是1:
innodb_flush_log_at_trx_commit = 1,这也是Innodb的默认设置。我们每次事务的结束都会触发Log Thread 将log buffer中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash或者是主机断电都不会丢失任何已经提交的数据。
在主库中执行Mysql> select @@sync_binlog,查看值是否是1:
sync_binlog=1,表示每次事务提交,MySQL都会立即刷新binlog,是最安全但是
能损耗最大的设置。这样的话,在数据库所在的主机操作系统损坏或者突然掉电的情况下,系统才有可能不丢失1个事务的数据。
三主库的并发业务太高
如果并发业务太高影响力主从延时,可以考虑升级硬件或者考虑分布式架构
四从库太多:
可以在主库和从库之间架设一台中间库,同时中间库只负责rely_log和bin_log,而不进行数据写入,进行级联主从的方法进行处理(不推荐)
五:对于传统的Classic Replication主从复制搭建,主库并发运行事物,但Dump_T在传输日志的时候是以时间为单元串行的方式传输,从而产生主从延时:
处理办法:
使用group commit方式搭建主从,从mysql5.6版本以后,引入了GTID编号,在同一时间提交的事务GTID号一致,因此主推开启GTID复制,并且要双一保证,这样就可以保证Dump_T传输的方式以GTID号为组进行并行传输至从库。
从库方面原因:
传统的classic replication主从复制的SQL线程只有一个,也就是说我们从主库一下子拿来100个事物存放在relay_log里,而从库里的SQL线程对事物进行一个一个的串行回放,
处理办法:
mysql5.7版本以后加入了MTS,真正实现了事物级别的并发