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主从复制那点事的主要内容,如果未能解决你的问题,请参考以下文章

关于centOS安装配置mysql5.6那点事

PHP与MySQL通讯那点事

PHP与MySQL通讯那点事

iOS_UITableView性能优化那点事

mysql第四篇文章~关于锁的那点事

mysql字符集与校对规则---大小写敏感那点事