一、现象
凌晨对线上一张表添加索引,表数据量太大(1亿+数据,数据量50G以上),造成主从延迟几个小时,各个依赖从库的系统无法查询数据,最终影响业务。
现在就梳理下主从延迟的原理。
二、原理
根据 MySQL 官方文档 MySQL Replication Implementation Details 中的描述,MySQL 主从复制依赖于三个线程:master
一个线程(Binlog dump thread
),slave
两个线程(I/O thread
和SQL thread
)。主从复制流程如下图:
master 服务器和 slave 服务器连接时,创建Binlog dump thread
以发送bin log
数据:
- 一个
Binlog dump thread
对应一个 slave 服务器; Binlog dump thread
从bin log
获取数据时会加锁,获取到数据后,立即释放锁。
当 slave 服务器收到 START_SLAVE 命令时,会创建I/O thread
和SQL thread
:
I/O thread
以拉的方式,从 master 读取事件,并存储到 slave 服务器的relay log
中;SQL thread
从relay log
中读取事件并执行;slave
可以按照自己的节奏读取和更新数据,也可以随意操作复制进程(启动和停止)。
注: START_SLAVE
命令成功启动线程后,如果后面I/O thread
或SQL thread
因为某些原因停止,则不会有任何的警告,业务方无法感知。可以通过查看 slave 的 error 日志,或者通过 SHOW SLAVE STATUS 查看 slave 上的线程状态。
通过 SHOW PROCESSLIST 可查看线程状态:
Binlog dump thread:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL
I/O thread 和 SQL thread:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL
三、分析
根据上面的原理,由于slave
是单线程(I/O thread
)读取数据,单线程(SQL thread
)更新数据,而master
是多线程写入,那么只要master
写入的频率大于slave
读取更新的频率,就有可能出现主从延迟的情况,如:
master
写入tps
较高,大于slave
更新速度;slave
执行某些语句耗时较长,如持有锁等;master
执行某些DDL
语句时,执行的时间较长,在slave
也执行相同的时间;
此处创建了索引,咨询 DBA,产生的bin log
文件有100多G,数据量太大,导致从库I/O thread
一直读取DDL
操作产生的bin log
事件,而影响到正常的业务DML
事件的更新,从而表现为主从同步延迟。
四、解决方案
从主从延迟的原因来看,解决方案可以从以下几个方向入手:
- 业务选型,对于无法忍受从库延迟的架构,可选择分布式架构等,避开从库延迟问题
- 执行时间,对大表进行线上
DDL
操作尽量选择凌晨等业务量较小的时候 - 硬件配置,升级从库硬件配置,如SSD
- 减少请求,增加缓存层,减少读请求落库
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]