mysql主从复制那点事

本文记录了对MySQL主从复制的理解。介绍了主从复制整体过程、涉及的线程和日志,阐述了关键参数。分析了主从复制延迟产生的原因,如主库写请求多、执行大事务等,并给出解决方法。还介绍了用pt - heartbeat监控主从复制一致性的工作原理和使用方法。

本文简单的记录一些个人对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岁

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙叔运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值