mysql主从是同步还是异步_mysql主从同步异步场景的分析

之所以进行这块内容的研究,主要针对之前遇到的两个未解的疑惑:

a. 线上有个系统,半同步状态经常从半同步变成异步,然后又马上恢复为半同步,具体原因未明,虽然之前也猜得八九不离十,但还是未完全确定。

b. 前段时间因为有业务场景需求,做了跨机房异步复制测试。当mysql写qps非常高的时候,发现很多日志还没有来得及发送到从库,也就是binlog日志在主库的产生速度大于传送到从库的速度,这个速度差一直存在,因此当主库在持续高压力地产生binlog的时候,越来越多的binlog没有传送到从库,但当时的网络流量也才18M/S左右(一主一从),从常规的知识认为,千兆的网络传送的速度可以达到100M,而当前的主从之间的binlog传送速度只达到了18M左右,原因是什么? 是网络问题? 还是其他原因。

主从复制原理

Dump线程与io线程

当主从复制关系建立之后,主库上有个dump线程,用来传送在主库产生的binlog日志的,而从库上的io线程,则用来接收由dump线程通过网络传送到从库的binlog日志,并负责将其写入relay log 中去。 这就是主从复制的机制, 同时,由于是异步复制,传送过程不需要ack的确认。

疑问也正在此处——因为是异步传输,如果单纯地理解为binlog文件直接网络传送,这个速度应该很快才是,但实际情况:在我们的测试环境中,binlog日志的传送速度才18M/s ,小于日志产生的22M/s左右的速度。为什么只有这个速度,而没有把网络带宽用满?原因是什么?

日志传送细节

主从复制的结构中,主库上的dump线程跟从库上的io线程各自有一个,所以不存在多线程地并发发送跟接收的情况,只需要了解binlog dump线程的工作机制,就能了解所有的细节。

通过解析binlog文件,我们可以知道,一个事务可以包含多个event, 下面是一个最简单的事物的在binlog中所记录的信息:

# at 33580

#170531 17:22:53 server id 153443358  end_log_pos 33645 CRC32 0x4ea17869        GTID    last_committed=125      sequence_number=126

SET @@SESSION.GTID_NEXT= ‘e1028e43-4123-11e7-a3c2-005056aa17e6:198’/*!*/;

# at 33645

#170531 17:22:53 server id 153443358  end_log_pos 33717 CRC32 0x66820e00        Query   thread_id=4     exec_time=0     error_code=0

SET TIMESTAMP=1496222573/*!*/;

BEGIN

/*!*/;

# at 33717

#170531 17:22:53 server id 153443358  end_log_pos 33770 CRC32 0x22ddf25e        Table_map: `test`.`xcytest` mapped to number 222

# at 33770

#170531 17:22:53 server id 153443358  end_log_pos 33817 CRC32 0x61051ea0        Write_rows: table id 222 flags: STMT_END_F

BINLOG ‘

bYsuWRMeXCUJNQAAAOqDAAAAAN4AAAAAAAEABHRlc3QAB3hjeXRlc3QAAgMPAlgCAl7y3SI=

bYsuWR4eXCUJLwAAABmEAAAAAN4AAAAAAAEAAgAC//x9AAAABQBzZGZhc6AeBWE=

‘/*!*/;

### INSERT INTO `test`.`xcytest`

### SET

###   @1=125 /* INT meta=0 nullable=0 is_null=0 */

###   @2=’sdfas’ /* VARSTRING(600) meta=600 nullable=1 is_null=0 */

# at 33817

#170531 17:22:53 server id 153443358  end_log_pos 33848 CRC32 0x630805b4        Xid = 303

COMMIT/*!*/;

每一个at xxxxx段,是一个event .

函数Binlog_sender::send_events 就是发送binlog中的event事件的函数:

函数入参:

end_pos,当前读到的binlog文件的最末尾位置。

log_cache,记录是当前传送的日志的信息,包含已经传送的binlog日志的位置,以及binlog日志文件。

函数逻辑分析:

如果当前已发送的位置log_pos小于已获取到的文件的末尾位置end_pos.则表明还有binlog日志未发送,进入循环。

循环体内:

a. 首先调用函数read_event,获取一个事件event.

b. Log_event_type event_type= (Log_event_type)event_ptr[EVENT_TYPE_OFFSET];

该语句用来获取事件event的类型,然后进行类型检查

check_event_type(event_type, log_file, log_pos),如果没有通过检查,直接返回1给上层函数。

c. log_pos= my_b_tell(log_cache); 更新log_pos位置,也就是将读binlog位置的游标前移到当前位置。

d. 然后调用send_packet() 函数进行binlog的发送。

原来, 不管当前还有多少binlog没有同步到从库,主库发送binlog的粒度依然是一个一个event的发送,发送之前,还需要检查event的类型。因为是小包发送,所以网络的流量并不大。

但需要说明一下出现这个现象的前提条件:我们测试环境中,当时数据库的写qps达到了50000以上,所以需要发送的event特别多,即使是异步,也导致单线程的dump线程来不及发送当前产生的日志。

当写的qps巨大的时候,确实存在来不及发送日志的情景。

总结

现在,再来回头看线上遇到的问题,“同步状态经常从半同步状态变成异步状态,然后又被及时复原到半同步状态”,原因是该数据库是一个分析系统,有时候会做批量的更新,以及批量的导入。同时,数据库设置的binlog格式为row模式,对于一个更新多行的事务,里面包含很多的event(一行是一个event), 所以发送这个事务的binlog耗时会比较长,无法在1秒钟内发送完成(半同步的timeout时间设置为1),所以半同步状态变成了异步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不用恐惧AI的高速发展,论击败阿法狗(零)最简单的方法

作者:刘锋 计算机博士,互联网进化论作者 10月19日凌晨,在国际学术期刊《自然》(Nature)上发表的一篇研究论文中,谷歌下属公司Deepmind报告新版程序AlphaGo Zero:从空白状态学起,在无…

mysql不能设置密码_mysql不能设置密码

你的位置:问答吧-> FreeBSD-> 问题详情mysql不能设置密码ports安装mysql-4.0.15,设置密码时:# mysqladmin -u root password 2568723630mysqladmin: unable to change password; error: Access denied for user: localhost to database mysql也不能添加数据库…

神经网络中的「注意力」是什么?怎么用?

来源:转载自公众号「雷克世界」微信号:ROBO_AI 编译:嗯~阿童木呀、多啦A亮 概要:神经网络中的注意力机制(Attention mechanisms),也被称为“神经注意力”或“注意力”,最近吸引了广泛…

redis配置mysql缓存_Redis做mysql的缓存服务器

一redis简介:redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 的所有数据都是保存在内存中,然…

2018 年将打响 AI 战争,7 条实战经验帮你战胜恐惧

来源:36氪 概要:不管是对科技巨头还是对创业公司,人工智能可以说是移动互联网时代以来最大的一个机遇。但是,人工智能同时也是让大多数人感到非常困惑的一项新技术,对它的发展现状和未来都非常迷惑。 不管是对科技巨头…

debconf-set-selections mysql_docker 静默安装mysql

1.功能作用在debconf database中插入默认值2.位置/usr/bin/debconf-set-selections3.格式用法debconf-set-selections [-vcu] [file]4.主要参数123-v,--verbose显示运行过程信息-c,--checkonly只检查输入文件的格式-u,--unseen在预置参数时,不设置‘seen‘标识5.应用…

人工智能对医疗行业影响的专题研究:基本结论

来源:本翼资本 概要:从未来5-7年的中期来看,我们认为计算智能和部分感知智能将迎来机会,计算智能的基因检测和药物发现、感知智能中的医疗智能语音、医疗智能视觉、可穿戴医疗设备等将迎来爆发。 从未来5-7年的中期来看&#x…

谷歌的量子计算机如何改变世界

来源:网易科技 概要:“可正常运作的话,量子计算机将会改变整个世界,改变事物的运作方式。”硅谷知名风投Andreessen Horowitz合伙人、物理学家维贾伊潘德(Vijay Pande)说道。 10月17日消息,华尔…

layer加载的页面偶尔出现空白_Layer-Cake 模式的设计

人们通常不会阅读网页,应用程序甚至文章或文本段落中的每个单词。相反,他们经常进行浏览 -因为他们在许多网站上的经验告诉他们,浏览可以用更少的时间和精力来提供几乎相同的价值(即信息量)。页面的可视化布局结构方式在人们浏览内容方面起着…

未来30年的科技发展趋势

来源:DeepTech深科技、全球创新论坛 概要:20项最值得关注的科技发展趋势,带你通向未来。 美国公布了一份长达35页的《2016-2045年新兴科技趋势报告》。该报告是在美国过去五年内由政府机构、咨询机构、智囊团、科研机构等发表的32份科技趋势相…

mysql dns反向解析_Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)时间:2019-01-19 11:28作者:网友投稿MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名…

[机器人-3]:开源MIT Min cheetah机械狗设计(三):嵌入式硬件设计

目录 概述: 1、硬件组成 2、通信速率 3、通信协议 4、mbedOS 概述: 以1条腿进行设计,其它腿也一样: 腿部硬件组成 1、硬件组成 1)UP board计算机板卡(Linux OS): 腿部控制器…

AlphaGo Zero的伟大与局限——ResNet作者、旷视研究院院长孙剑深度评述

来源:Megvii旷视科技 概要:2017年10月19日,Deepmind 团队发布强化版的 AlphaGo Zero,该版本的 AlphaGo 实现了在 AI 发展中非常有意义的一步——“无师自通”,这也让去年败在未升级版本 AlphaGo Master 下的中国棋手柯…

mysql 窗口函数最新一条_MySQL 8.0 窗口函数(window functions)

窗口函数(window functions)是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。窗口函数,简单来说就是对于一个查询SQL,将其结果集按指定的规则进…

《人类简史》作者:应对 AI 革命,要打造新的经济、社会和教育体系

来源:36氪 概要:正在进行的人工智能革命将改变几乎所有的工作,给社会和经济的发展带来机遇和挑战。一些人认为,人工智能将把人类赶出就业市场,创造一个新的“无用的阶层”;另一些人则认为,自动化…

php mysql 胚子_php mysql数据库连接浅识

1、连接数据库连接函数:a、mysql_connect() :函数打开非持久的 MySQL 连接b、mysql_pconnect() :函数打开持久的MySQL 连接mysql_connect()格式:mysql_connect(server,user,pwd,newlink,clientflag)注:脚本一结束&…

全球厂商已向自动驾驶投入800亿美元 依然群龙无首 | 厚势

来源: 腾讯科技 概要:近日发表的一份权威研究报告指出,全球厂商已经在自动驾驶领域投资 800 亿美元,但是迄今为止,仍然没有一家明显处于领先优势的厂商。 自动驾驶和电动车成为当下科技行业两大热点之一,几…

promise的状态值_什么是Promise,Promise的三种状态

什么是Promise对象:Js中进行异步编程的新的解决方案,用于表示一个异步操作的最终完成 (或失败), 及其结果值.。语法上:promise是一个构造函数简单来说,promise对象用来封装一个异步操作并可以获取其结果语法:new Promi…

埃森哲报告:2017年数字化浪潮下的医疗行业五大趋势

来源:AI掘金志 概要:日前,埃森哲发布了《2017年数字化健康技术展望》报告,分析了数字化浪潮下的医疗护理行业的实际落地情况和发展前景,主要围绕着AI、生态系统建设、新型医疗人才挖掘、新的监督法规等五个方面进行解…

python修改xpath节点_Xpath python在特定文本后查找节点

这里是HTML代码:Specific text 1link1 inside specific text 1link2 inside specific text 1link3 inside specific text 1Specific text 2link1 inside specific text 2link2 inside specific text 2link3 inside specific text 2link4 inside specific text 2Spec…