mysql主从复制那点事
Posted 龙叔运维
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主从复制那点事相关的知识,希望对你有一定的参考价值。
本文简单的记录一些个人对mysql主从复制的理解,后续会不断更新补充
1·主从复制整体过程概览
1)主库 Binlog Dump线程在binlog有变化时,主动推送最新的binlog到从库。
2)从库 I/O线程被动接收主库传来的binlog之后,记录到从库的relay log(中继日志)中,当没有数据传入的时候则会等待。
3)从库sql线程会将relay log(中继日志)的内容解析成sql语句,顺序执行
2·主从复制涉及的线程
2.1·主库线程
【BinLog Dump线程】返回bin-log日志,以及新的binlog文件名和下一个指定更新位置给从库的IO线程
2.2·从库线程
【I/O线程】将binlog日志信息追加在中继日志末尾
【sql线程】将中继日志解析成sql语句,并顺序执行
3·主从复制涉及的日志
3.1·Master_Log_File,Read_MAster_Log_Pos
Master_Log_File,Read_MAster_Log_Pos记录了IO线程读到的当前master binlog文件和位置,对应master的binlog文件和位置
3.2·Realy_Log_File,Realy_Log_Pos
Realy_Log_File,Realy_Log_Pos记录了sql线程执行到realy log的哪个文件和位置,对应的是slave上的realy log文件和位置
3.3·Realy_Master_Log_File,Exec_Matser_Log_Pos
Realy_Master_Log_File,Exec_Matser_Log_Pos记录的是sql线程执行到matser binlog的文件和位置,对应的master上的binlog的文件和位置
4·关键参数
slave-net-timeout,master-connect-retry,master-retry-count
解释:
从库过了slave-net-timeout秒还没有收到主库来的数据,它就会开始第一次重试,然后每过master-connect-retry秒,从库会再次尝试重连主库。直到重试了master-retry-count次,它才会放弃重试。如果重试的过程中,连上了主库,那么它认为当前主库是好的,又会开始slave-net-timeout秒的等待
slave-net-timeout默认是3600秒,master-connect-retry默认是60秒,master-retry-count默认是86400次
5·主从复制延迟
5.1·产生的原因
【1】主库写请求较多,有大量insert、delete、update并发操作,短时间产生了大量的binlog。主库并发写入数据,而从库SQL Thread为单线程应用日志,很容易造成relaylog堆积,产生延迟。
解决方法:做sharding,通过scale out打散写请求。或考虑升级到MySQL 5.7+,开启基于逻辑时钟的并行复制。
【2】主库执行大事务,假如主库花费200s更新了一张大表,在主从库配置相近的情况下,从库也需要花几乎同样的时间更新这张大表,此时从库延迟开始堆积,后续的events无法更新。
解决方法:拆分大事务,分段提交。
5.2·监控方法-pt-heartbeat
可以用pt-heartbeat监控主从复制的一致性(是percona-tooklkit中的一个工具,具体可以自己查查资料)
5.2.1·工作原理
1.在主机上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去)
2.从主库连接到从库检查复制的时间记录,和从库当前系统时间进行比较,得出时间的差异。
5.2.2·使用介绍
【1】主库创建heartbeat表
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS
position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS
exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS
);
【2】主库开启守护进程来更新heatbeat表
pt-heartbeat -D mysql_test --update -h localhost --user=wxl --password=123456 --daemonize
【3】监控主从复制延迟
执行一次就退出:pt-heartbeat -D mysql_test01 --check --user=wxl --password=123456 -h30.99.136.105
一直执行不退出:pt-heartbeat -D mysql_test01 --monitor --user=wxl --password=123456 -h30.99.136.105
推荐公众号,分享运维知识:龙叔18岁
以上是关于mysql主从复制那点事的主要内容,如果未能解决你的问题,请参考以下文章