阅读更多

0顶
0踩

数据库

原创新闻 MySQL主从同步那点事儿

2017-09-18 10:14 by 副主编 jihong10102006 评论(0) 有11743人浏览
关于mysql主从同步,相信大家都不陌生,随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时,将数据库的读写效率骤然下降,甚至不可用;为了解决此类问题,通常会采用mysql集群,当主库宕机后,集群会自动将一个从库升级为主库,继续对外提供服务;那么主库和从库之间的数据是如何同步的呢?本文针对MySQL 5.7版本进行下面的分析,下面随笔者一起探究一下mysql主从是如何同步的。

MySQL主从复制原理

为了减轻主库的压力,应该在系统应用层面做读写分离,写操作走主库,读操作走从库,下图为MySQL官网给出的主从复制的原理图,从图中可以简单的了解读写分离及主从同步的过程,分散了数据库的访问压力,提升整个系统的性能和可用性,降低了大访问量引发数据库宕机的故障率。

binlog简介

MySQL主从同步是基于binlog文件主从复制实现,为了更好的理解主从同步过程,这里简单介绍一下binlog日志文件。

binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改,它是以二进制的形式保存在磁盘中。我们可以通过mysql提供的查看工具mysqlbinlog查看文件中的内容,例如 mysqlbinlog mysql-bin.00001 | more,这里注意一下binlog文件的后缀名00001,binlog文件大小和个数会不断的增加,当MySQL停止或重启时,会产生一个新的binlog文件,后缀名会按序号递增,例如mysql-bin.00002、mysql-bin.00003,并且当binlog文件大小超过 max_binlog_size系统变量配置时也会产生新的binlog文件。

1. binlog日志格式

(1)statement : 记录每一条更改数据的sql

    优点:binlog文件较小,节约I/O,性能较高。
    缺点:不是所有的数据更改都会写入binlog文件中,尤其是使用MySQL中的一些特殊函数(如LOAD_FILE()、UUID()等)和一些不确定的语句操作,从而导致主从数据无法复制的问题。

(2)row : 不记录sql,只记录每行数据的更改细节

    优点:详细的记录了每一行数据的更改细节,这也意味着不会由于使用一些特殊函数或其他情况导致不能复制的问题。
    缺点:由于row格式记录了每一行数据的更改细节,会产生大量的binlog日志内容,性能不佳,并且会增大主从同步延迟出现的几率。

(3)mixed:一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

2. binlog日志内容

mysqlbinlog命令查看的内容如下:

根据事件类型查看的binlog内容:

3. binlog事件类型

MySQL binlog记录的所有操作实际上都有对应的事件类型的,譬如STATEMENT格式中的DML操作对应的是QUERY_EVENT类型,ROW格式下的DML操作对应的是ROWS_EVENT类型,如果想了解更多请参考官方文档,有关binlog日志内容不在这里过多赘述,简单介绍一下是为了更好的理解主从复制的细节,下面我们进入正题。

MySQL主从复制原理

mysql主从复制需要三个线程,master(binlog dump thread)、slave(I/O thread 、SQL thread)。

master

(1)binlog dump线程:当主库中有数据更新时,那么主库就会根据按照设置的binlog格式,将此次更新的事件类型写入到主库的binlog文件中,此时主库会创建log dump线程通知slave有数据更新,当I/O线程请求日志内容时,会将此时的binlog名称和当前更新的位置同时传给slave的I/O线程。

slave

(2)I/O线程:该线程会连接到master,向log dump线程请求一份指定binlog文件位置的副本,并将请求回来的binlog存到本地的relay log中,relay log和binlog日志一样也是记录了数据更新的事件,它也是按照递增后缀名的方式,产生多个relay log( host_name-relay-bin.000001)文件,slave会使用一个index文件( host_name-relay-bin.index)来追踪当前正在使用的relay log文件。

(3)SQL线程:该线程检测到relay log有更新后,会读取并在本地做redo操作,将发生在主库的事件在本地重新执行一遍,来保证主从数据同步。此外,如果一个relay log文件中的全部事件都执行完毕,那么SQL线程会自动将该relay log 文件删除掉。

下面是整个复制过程的原理图:

主从同步延迟

mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的I/O线程到主库取日志,效率也比较高,但是,slave的SQL线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能存在slave上的其他查询产生lock争用的情况,由于SQL也是单线程的,所以一个DDL卡住了,需要执行很长一段事件,后续的DDL线程会等待这个DDL执行完毕之后才执行,这就导致了延时。当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,延时就产生了,除此之外,还有可能与slave的大型query语句产生了锁等待导致。

由于主从同步延迟是客观存在的,我们只能从我们自己的架构上进行设计, 尽量让主库的DDL快速执行。下面列出几种常见的解决方案:
  • 业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力;
  • 服务的基础架构在业务和mysql之间加入memcache或者Redis的cache层。降低mysql的读压力;
  • 使用比主库更好的硬件设备作为slave;
  • sync_binlog在slave端设置为0;
  • –logs-slave-updates 从服务器从主服务器接收到的更新不记入它的二进制日志;
  • 禁用slave的binlog。
参考资料
引用
本文来自linkedkeeper.com(文/张松然)。作者:张岩,2016年加入京东,熟悉大型分布式系统设计及开发,有丰富的web开发实战经验,对spring等开源框架有源码级了解,目前主要负责京麦插件市场及交易平台的研发工作。

  • 大小: 141.3 KB
  • 大小: 4.2 KB
  • 大小: 28.4 KB
  • 大小: 40.8 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • MySQL 主从同步那点事儿

    关于mysql主从同步,相信大家都不陌生,随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时,将数据库的读写效率骤然下降,甚至不可用;为了解决此类问题,通常会采用mysql...

  • mysql主从同步问题_聊聊 MySQL 主从同步那点事儿

    原标题:聊聊 MySQL 主从同步那点事儿关于mysql主从同步,相信大家都不陌生,随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时,将数据库的读写效率骤然下降,甚至不可用;...

  • 干货分享;MySQL主从同步那点事儿

    关于mysql主从同步,相信大家都不陌生,随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时,将数据库的读写效率骤然下降,甚至不可用;为了解决此类问题,通常会采用mysql...

  • mysql设置自动递增_干货分享;MySQL主从同步那点事儿

    欢迎关注我的头条号:Wooola,专注于Java、Golang、微服务架构,致力于每天分享快乐编码和开源技术。

  • mysql 同步加速_一种MySQL主从同步加速方案

    转载自:http://dinglin.iteye.com/blog/1179574一、问题起源MySQL的主从同步一直有从库延迟的问题,背景资料网上很多,原因简单描述如下:1、 MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL...

  • 什么是mysql 主从同步_Mysql主从同步

    什么是Mysql 主从同步 ?从库同步主库上的数据,(让其他数据库服务器自动同步当前正在被访问的数据服务器上的数据)主从同步的结构类型1主------>1从 (常用) 一台主服务器(负责业务更新)一台从服务器1主-------&gt...

  • MySQL主从同步设置工具_Mysql主从同步实战

    1、Introduction之前写过一篇文章:Mysql主从同步的原理。相信看过这篇文章的童鞋,都摩拳擦掌,跃跃一试了吧?今天我们就来一次mysql主从同步实战!2、环境说明os:ubuntu16.04mysql:5.7.17下面的实战演练,都是基于...

  • mysql主从数据库同步问题_聊聊MySQL主从数据库同步的那些事儿

    在linux服务器下测试:主(master)服务器IP:219.223.5.105(对应内网IP:192.168.1.75)从(slave)服务器IP:219.223.5.104(对应内网IP:192.168.1.74)一、修改主服务器master[mysqld]log-bin=mysql-bin//[必须]启用二...

  • mysql 主从同步原理_Mysql主从同步的原理

    关于实战,请参考我的另一篇文章:Mysql主从同步实战1、什么是mysql主从同步?当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。2、主从同步有什么好处?水平扩展数据库的负载能力。容错,高...

  • 在阿里云Centos7配置Mysql主从同步的那些事儿

    这里写目录标题一、操作步骤二、开始配置三、配置完主从库后,将主库数据同步至从库(主库已有数据)四、如果从库状态显示主从同步出现异常 在正式开始之前,我们先要配置好阿里云...mysql主从同步的原理很简单,从库生

  • 和面试官聊 MySQL 为什么需要主从同步

    就说白了,MySQL 的主从同步到底解决了什么样的一个问题。这道面试题啊并不难,其实经历过主从复制的都应该知道它为了什么。比如读写分离,分库分表,都是我们主动同步要解决一个关键点。但是面试中如果问到了,你要...

  • 饕餮族北京之选(二)

    饕餮族北京之选(二)从东三环国贸向北,一直延伸到三元西桥附近,是北京美食的中心,在这一区域中有各种档次的各种风味的美食,不少美食潮流就是从这里开始的。  在国贸地区,皇城老妈是四川火锅的代表之一,与一般四川火锅的平民化相比,皇城老妈走的是高档火锅路线,对环境、对菜品档次都非常注意。在中服大厦二楼,金山城重庆菜是这一地方最有名的餐厅,无论是泡椒系列、糊辣系列、各种烧菜,还是毛血旺以及各种四川小吃都让

  • 饕餮族北京之选(四)

    饕餮族北京之选(四)   用了一上午的工夫,重新梳理了一下那张“美食地图”,把地址不详的删掉,太多的废话删掉,雷同的删掉……最后呈现给大家的是下面这份“美食宝典”,大家可以按图索骥,去找自己想吃的东东了~~祝大家胃口好   小吃:   1热干面 新街口的稻香春门脸,有个小小小小小极了的四川小吃店里的热干面一绝,好像只要两元五哟~~~~~   2锅贴 从地百北边的胡同串向后海,中途会有个小店,里面的

  • 中国发展3G尚需解决的几大问题

    尽管“跨过3G上4G”的言论正鼓动着一部分人,但从中国的国情来看,3G仍是中国移动通信产业不可逾越的发展阶段。诚然,目前还有许多问题需要解决,但这些大多是发展中的问题,不应成为中国发展3G产业的桎梏,因此发展3G乃大势所趋。 前不久,沃达丰在德国和葡萄牙正式推出用3G业务,欧洲已有许多国家实现了3G商用,即使在亚洲,日本及韩国的3G发展也取得了不小的成绩。在此背景下,有关中国3G何时启动的问题再度

  • 互动式语音应答业务IVR能否续写短信神话

    短信的发展创造了一个通信业的奇迹,无论是运营商还是SP,无时无刻不在寻找着继短信之后的另一"杀手"级业务。2004年,人们把目光不约而同地聚焦到了IVR上。   IVR(Interactive Voice Response)即互动式语音应答业务,是中国移动早在2002年底就推出的一项业务。由于种种原因,IVR一直到今年初才出现在新浪、搜狐等公司的网页上,并且发展速度之快引起了业界的关注。   与短

  • 饕餮族北京之选(五)

    饕餮族北京之选(五)一、水煮鱼1、大阿福水煮鱼餐厅,朝阳区三里屯北14楼,消费水平30-50元,水煮鱼:82元/份。2、花诚酒家,外馆斜街,辣嘴不辣喉咙!香,18元儿一斤!3、辣婆婆水煮鱼店,沙滩后街47号(丽都饭店对面另一家),启用御仁舫和富丽的雅号,4、“皇阿婆”, 西直门外北下关里,北方交大南门外,5、渝信川菜,工体北路幸福一村,价钱贵了点,48/盆,一整条鱼为一份!6、红京鱼餐厅(原先是在

  • 躁动于3G母腹中的手机游戏

    如果明年之前3G牌照能够不出所料地发放的话,手机游戏市场的快速启动及其对运营商ARPU值的提升,该是可以预期的   本报记者 王宏亮   中国无线领域当前的状态,可以说是新旧纷扰,良莠杂陈:自2G以至2.5G、2.75G、3G,自GSM以至CDMA、小灵通,自WCDMA以至CDMA2000、TD-SCDMA,自GPRS以至WIMAX、WLAN、CDMA1X、PHS,自短信(SMS)以至彩信、IVR

  • WebAudioAPIError(解决方案).md

    项目中常见的问题,记录一下解决方案

Global site tag (gtag.js) - Google Analytics