主从延时问题的监控及处理建议

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 主从延时问题的监控及处理建议

监控方法

方法一:有没有延时
Seconds_Behind_Master: 0
方法二:
主库:
mysql> show master status ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |   151847 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从库:
[root@db01 data]# mysql -S /tmp/mysql3308.sock -uroot -p123  -e "show slave status \G"|grep "Master_Log"
已经拿到的主库日志量(master.info):判断传输有没有延时
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 151847
已经执行的主库日质量(relay-log.info): 判断回放有没有延时
Relay_Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 141847
计算主从复制延时日志量。

导致延时的主要原因

外部因素
网络延时  
主从硬件、参数等不一致
从库太多。
主库压力大。
主库 
1) binlog记录不及时。
mysql> select @@sync_binlog;
+---------------+
| @@sync_binlog |
+---------------+
|             1 |
+---------------+
参数说明:
     1 :每次事务提交都立即刷新binlog到磁盘。
     0 :由操作系统决定,什么刷新磁盘。
(2) DUMP线程串行工作。
大事务、并发事务高、DDL
解决办法:
  5.6版本加入GTID复制模式,但手工配置。DUMP在传输日志时可以并发。
    5.7版本GTID做了增强,不手工开启也自动维护匿名的GTID信息。
(3)怎么判断是主库导致的延时?
主库:
mysql> show master status ;
从库:
mysql -S /tmp/mysql3308.sock -uroot -p123  -e "show slave status \G"|grep "Master_Log"
从库方面
# IO线程:
从库IO比较慢。relay 落地慢。可以将realy放到 SSD
# SQL 线程:串行回放。
主库可以并行事务,从库SQL线程串行回放。
所以:并发事务高、大事务、DDL
解决方法:
     5.6 版本:开启GTID后,可以多SQL线程,只能针对不同的库的事务进行并行SQL恢复。
     5.7 版本:做了增强,基于逻辑时钟的并行回放。MTS。
5.7 的从库并发配置方法。
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 已经执行的主库日质量(relay-log.info): 判断回放有没有延时
Relay_Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 141847

过滤复制

主库实现
binlog_do_db      白名单
binlog_ignore_db  黑名单
说明:是否记录binlog日志来控制过滤。
7.2 从库实现 ******
实现方法:
IO线程不做限制。
SQL线程回放时,选择性回放。
参数:
replicate_do_db=world
replicate_do_db=oldboy
replicate_ignore_db= 
replicate_do_table=world.city 
replicate_ignore_table= 
replicate_wild_do_table=world.t*
replicate_wild_ignore_table=
配置方法:
方法一:
修改配置文件并重启
vim /data/3308/my.cnf 
replicate_do_db=world
replicate_do_db=oldboy
systemctl restart mysqld3308
方法二:
STOP SLAVE SQL_THREAD;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (oldguo, oldboy);
START  SLAVE SQL_THREAD;

延时从库的应用

配置方法:
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;
mysql> show slave status \G
SQL_Delay: 300
SQL_Remaining_Delay: NULL
思路 :
主库发生了逻辑损坏(DROP,truncate)时,可以使用延时从库快速恢复数据。
   2小时延时  
  10:00  做的drop database A;
1. 及时监控故障:主库 10:05发现故障,从库此时8:05数据状态
2. 立即将从库的SQL线程关闭。需要对A业务挂维护页。
3. 停止所有线程。
4. 在延时从。恢复A库数据
   手工模拟SQL线程工作,直到drop之前位置点。
   SQL线程上次执行到的位置------> drop之前
   relay.info   ----> 分析drop位置点   ---> 截取relaylog日志----> source

故障模拟及恢复

故障模拟:
create database delaydb charset utf8mb4;
use delaydb;
create table t1(id int);
insert into t1 values(1),(2),(3);
commit;
drop database delaydb;
截取日志:
起点: SQL上次执行到的位置点,
Relay_Log_File: db01-relay-bin.000004
Relay_Log_Pos: 320
终点:drop 之前 
db01-relay-bin.000004 | 1006 | Query          |         7 |      152967 | drop databas
[root@db01 tmp]# mysqlbinlog --start-position=320 --stop-position=1006 /data/3309/data/db01-relay-bin.000004 >/tmp/bin.sql
mysql> reset slave all;
mysql> set sql_log_bin=0;
mysql> source /tmp/bin.sql;
mysql> set sql_log_bin=1;
mysql> show  tables;
+-------------------+
| Tables_in_delaydb |
+-------------------+
| t1                |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

GTID复制

清理环境
pkill mysqld
 \rm -rf /data/mysql/data/*
 \rm -rf /data/binlog/*
mkdir -p /data/mysql/data /data/binlog 
chown -R mysql.mysql /data/*
准备配置文件
主库db01:
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF
slave1(db02):
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF
slave2(db03):
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF

初始化数据

/data/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/mysql  --datadir=/data/mysql/data

启动数据库

/etc/init.d/mysqld start

构建主从:

master:51slave:52,53

51主库操作

grant replication slave  on *.* to repl@'10.0.1.%' identified by '123';

52/53从库操作

change master to 
master_host='10.0.1.121',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
show slave status \G
Slave_IO_Running: Yes                
Slave_SQL_Running: Yes
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL
记一次不常见到主从延迟问题
Slave_SQL_Running_State: Waiting for dependent transaction to commit 导致的主从延迟
7613 1
|
6月前
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方案
MySQL主从同步延迟原因与解决方案
498 0
MySQL主从同步延迟原因与解决方案
|
SQL 缓存 算法
主从不一致解决方案 && 如何降低主从延迟
主从不一致解决方案 && 如何降低主从延迟
主从不一致解决方案 && 如何降低主从延迟
|
存储 缓存 运维
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
194 0
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
|
SQL 数据采集 算法
Mysql主从同步及主从同步延迟解决方案
Mysql主从同步及主从同步延迟解决方案
696 0
Mysql主从同步及主从同步延迟解决方案
|
消息中间件 关系型数据库 MySQL
数据量激增,导致MySQL主从同步延迟
数据量激增,导致MySQL主从同步延迟
266 0
数据量激增,导致MySQL主从同步延迟
|
SQL 容灾 关系型数据库
一次DTS同步延时过高的排错过程
业务场景: 秒级数据同步要求的容灾场景,通过阿里云数据库同步工具DTS实时将阿里云上RDS的数据实时同步至自建MySQL数据库故障现象: DTS同步延时高达2小时,造成主备数据不一致,无法满足业务的容灾需求排查经过: 首先,联系阿里云DTS后台,后台同学反馈,目标数据库RT(响应时间)过高。
1596 0
一次DTS同步延时过高的排错过程
|
关系型数据库 MySQL
MySQL主从延时这么长,要怎么优化?
MySQL主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。
1048 0
|
消息中间件 NoSQL Java
为什么分布式一定要有延时任务?
0 引言 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。
1322 0