来源:公众号「神谕的暗影长廊」
在异步或半同步的复制结构中,从库出现延迟是一件十分正常的事。
虽出现延迟正常,但是否需要关注,则一般是由业务来评估。
如:从库上有需要较高一致性的读业务,并且要求延迟小于某个值,那么则需要关注。
简单概述一下复制逻辑:
1、主库将对数据库实例的变更记录到binlog中。
2、主库会有binlog dump
线程实时监测binlog的变更并将这些新的events推给从库(Master has sent all binlog to slave; waiting for more updates
)
3、从库的IO Thread
接收这些events,并将其记录入relaylog。
4、从库的SQL Thread
读取relaylog的events,并将这些events应用(或称为重放)到从库实例。
上述为默认的异步复制逻辑,半同步复制又有些许不同,此处不再赘述。
此外,判断从库有延迟是十分简单的一件事:
在从库上通过SHOW SLAVE STATUS
检查Seconds_Behind_Master
值即可。
产生延迟的原因及处理思路
〇 主库DML请求频繁(tps较大)
即主库写请求较多,有大量insert、delete、update并发操作,短时间产生了大量的binlog。
【原因分析】
主库并发写入数据,而从库SQL Thread
为单线程应用日志,很容易造成relaylog堆积,产生延迟。
【解决思路】
做sharding,通过scale out打散写请求。或考虑升级到MySQL 5.7+,开启基于逻辑时钟的并行复制。
〇 主库执行大事务
比如大量导入数据,INSERT INTO $tb1 SELECT * FROM $tb2、LOAD DATA INFILE
等
比如UPDATE
、DELETE
了全表等
Exec_Master_Log_Pos
一直未变,Slave_SQL_Running_State
为Reading event from the relay log
分析主库binlog,看主库当前执行的事务也可知晓。
【原因分析】
假如主库花费200s更新了一张大表,在主从库配置相近的情况下,从库也需要花几乎同样的时间更新这张大表,此时从库延迟开始堆积,后续的events无法更新。
【解决思路】
拆分大事务,及时提交。
〇 主库对大表执行DDL语句
现象和主库执行大事务相近。
检查Exec_Master_Log_Pos一直未动,也有可能是在执行DDL。
分析主库binlog,看主库当前执行的事务也可知晓。
【原因分析】
1、DDL未开始,被阻塞,SHOW SLAVE STATUS
检查到Slave_SQL_Running_State
为waiting for table metadata lock
,且Exec_Master_Log_Pos
不变。
2、DDL正在执行,SQL Thread
单线程应用导致延迟增加。Slave_SQL_Running_State
为altering table
,Exec_Master_Log_Pos
不变
【解决思路】
通过processlist
或information_schema.innodb_trx
来找到阻塞DDL语句的查询,干掉该查询,让DDL正常在从库执行。
DDL本身造成的延迟难以避免,建议考虑:
① 业务低峰期执行
② set sql_log_bin=0
后,分别在主从库上手动执行DDL(此操作对于某些DDL操作会造成数据不一致,请务必严格测试)
〇 主库与从库配置不一致:
【原因分析】
硬件上:主库实例服务器使用SSD,而从库实例服务器使用普通SAS盘、cpu主频不一致等
配置上:如RAID卡写策略不一致,OS内核参数设置不一致,MySQL落盘策略不一致等
【解决思路】
尽量统一DB机器的配置(包括硬件及选项参数)
甚至对于某些OLAP业务,从库实例硬件配置高于主库等
〇 表缺乏主键或唯一索引
binlog_format=row
的情况下,如果表缺乏主键或唯一索引,在UPDATE
、DELETE
的时候可能会造成从库延迟骤增。
此时Slave_SQL_Running_State
为Reading event from the relay log
。
并且SHOW OPEN TABLES WHERE in_use=1
的表一直存在。
Exec_Master_Log_Pos
不变。
mysqld进程的cpu几近100%(无读业务时),io压力不大
【原因分析】
做个极端情况下的假设,主库更新一张500w表中的20w行数据,该update语句需要全表扫描
而row格式下,记录到binlog的为20w次update操作,此时SQL Thread重放将特别慢,每一次update可能需要进行一次全表扫描
【解决思路】
检查表结构,保证每个表都有显式自增主键,并建立合适索引。
〇 从库自身压力过大
【原因分析】
从库执行大量select请求,或业务大部分select请求被路由到从库实例上,甚至大量OLAP业务,或者从库正在备份等。
此时可能造成cpu负载过高,io利用率过高等,导致SQL Thread应用过慢。
【解决思路】
建立更多从库,打散读请求,降低现有从库实例的压力。
〇 MyISAM存储引擎
此时从库Slave_SQL_Running_State
为Waiting for table level lock
【原因分析】
MyISAM只支持表级锁,并且读写不可并发操作。
主库在设置@@concurrent_insert
对应值的情况下,能并发在select时执行insert,但从库SQL Thread
重放时并不可并发,有兴趣可以再去看看myisam这块的实现。
【解决思路】
当然是选择原谅它了,既然选择了MyISAM,那么也应该要有心理准备。(还存在其他场景,也不推荐MyISAM在复制结构中使用)
改成InnoDB吧。
总结:
通过SHOW SLAVE STATUS
与SHOW PROCESSLIST
查看现在从库的情况。(顺便也可排除在从库备份时这种原因)
若Exec_Master_Log_Pos
不变,考虑大事务、DDL、无主键,检查主库对应的binlog及position即可。
若Exec_Master_Log_Pos
变化,延迟逐步增加,考虑从库机器负载,如io、cpu等,并考虑主库写操作与从库自身压力是否过大。
如果上述原因都没有,那么请教请教DBA大佬们吧。
当然,Seconds_Behind_Master
也不一定准确,存在在少部分场景下,虽Seconds_Behind_Master
为0,但主从数据不一致的情况。
这将是另一篇博文了。
全文完。
以上就是MySQL主从复制延迟原因以及解决方案的详细内容,更多关于MySQL主从复制延迟的资料请关注其它相关文章!
《魔兽世界》大逃杀!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]