暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql主从复制那点事

龙叔18岁 2021-04-07
247

本文简单的讲解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表

  1. CREATE TABLE heartbeat (

  2. ts varchar(26) NOT NULL,

  3. server_id int unsigned NOT NULL PRIMARY KEY,

  4. file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS

  5. position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS

  6. relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS

  7. exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS

  8. );


复制

【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岁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论