什么情况会导致mysql主从同步延迟复制延迟

请教:如何解决mysql主从复制带来的数据延迟问题?
现在面临这样的问题:数据库使用mysql主从复制后,某一时刻在主节点插入的数据后,不能马上从其他从节点获取到刚刚插入主节点的数据,从而带来数据的延迟问题。
烦请各位同仁给点建议,有什么行之有效的方案解决这个问题?
小弟在此跪谢了!
在写入数据库的同时写缓存,数据先从缓存读再读数据库
--- 共有 1 条评论 ---
写入到第三方缓存,如果是下个订单,当点击定订单列表的时候,怎么显示所有的订单? 从库读数据+缓存图数据?
引用来自“红薯”的评论
在写入数据库的同时写缓存,数据先从缓存读再读数据库
谢谢,这个方案能够解决这个问题!
1楼的正解。
插入后,更新缓存服务如redis,其他节点需先读缓存中的数据。然后在写入从mysql。
当然如果你不想立即更新从mysql库,可以把数据写入队列,当队列达到规定的值,就进行插入从mysql。也要在缓存时间快到期时,检查队列做出相应的操作。
引用来自“Black_JackQ”的评论
1楼的正解。
插入后,更新缓存服务如redis,其他节点需先读缓存中的数据。然后在写入从mysql。
当然如果你不想立即更新从mysql库,可以把数据写入队列,当队列达到规定的值,就进行插入从mysql。也要在缓存时间快到期时,检查队列做出相应的操作。
感谢你的指点,不过我觉得主节点和从节点的数据之间的同步问题还是用mysql自己负责好些,不用程序主动往从节点插入数据,因为mysql主从复制就是为了给数据库服务器减压,将所有的读操作放在各个从节点进行!
引用来自“Black_JackQ”的评论
1楼的正解。
插入后,更新缓存服务如redis,其他节点需先读缓存中的数据。然后在写入从mysql。
当然如果你不想立即更新从mysql库,可以把数据写入队列,当队列达到规定的值,就进行插入从mysql。也要在缓存时间快到期时,检查队列做出相应的操作。
引用来自“mrZhan_223”的评论感谢你的指点,不过我觉得主节点和从节点的数据之间的同步问题还是用mysql自己负责好些,不用程序主动往从节点插入数据,因为mysql主从复制就是为了给数据库服务器减压,将所有的读操作放在各个从节点进行!嗯,那对缓存失效时间要做一个教精准的规划。
引用来自“Black_JackQ”的评论
1楼的正解。
插入后,更新缓存服务如redis,其他节点需先读缓存中的数据。然后在写入从mysql。
当然如果你不想立即更新从mysql库,可以把数据写入队列,当队列达到规定的值,就进行插入从mysql。也要在缓存时间快到期时,检查队列做出相应的操作。
引用来自“mrZhan_223”的评论感谢你的指点,不过我觉得主节点和从节点的数据之间的同步问题还是用mysql自己负责好些,不用程序主动往从节点插入数据,因为mysql主从复制就是为了给数据库服务器减压,将所有的读操作放在各个从节点进行!引用来自“Black_JackQ”的评论嗯,那对缓存失效时间要做一个教精准的规划。是啊,这也是难点所在!
如果从读不到数据的话, 从主再读一次不就可以, 虽说读写分离, 但没必要这么控制得这么严重吧, 以解决问题为要
请用正正的mysql多master集群软件:galera cluster for mysql:http://my.oschina.net/wstone/blog/410908
引用来自“chinaxuguojun”的评论如果从读不到数据的话, 从主再读一次不就可以, 虽说读写分离, 但没必要这么控制得这么严重吧, 以解决问题为要谢谢你的指点,一般主从复制的结构都使用了中间代理层,如mysql-proxy之类的,某个操作该从主库操作还是在从库中操作,是由中间代理层决定的,都是事先配置好的,对程序是透明的,因此你说的这种方案应该又在代码中显示的控制,我在想,使用memcached,实现一个aop,来解决主从数据延迟问题!
我们是先写memcached再写从库老男孩oldboy 的BLOG
用户名:老男孩oldboy
文章数:548
评论数:6837
访问量:4373585
注册日期:
阅读量:5863
阅读量:12276
阅读量:380239
阅读量:1072576
51CTO推荐博文
企业面试题042:MySQL出现同步延迟有哪些原因?如何解决?
1.从库太多导致复制延迟
优化:建议从库数量3-5个为宜
2.从库硬件比主库硬件差
优化:提升硬件性能
3.慢SQL语句过多
优化:SQL语句执行时间太长,需要优化SQL语句
4.主从复制的设计问题
优化:主从复制单线程,可以通过多线程IO方案解决;另外MySQL5.6.3支持多线程IO复制。
5.主从库之间的网络延迟
优化:尽量链路短,提升端口带宽
6.主库读写压力大
优化:前端加buffer和缓存。主从延迟不同步:
不管有多延迟,只要不影响业务就没事
7、业务设计缺陷导致延迟影响业务
优化:从库没有数据改读主库
本文来自老男孩教育运维班课堂内容讲解,及学生课后总结,如果转载请完整转载并保留版权声明! 本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
10:07:51 18:55:52 00:34:49博客访问: 72347
博文数量: 73
博客积分: 0
博客等级: 民兵
技术积分: 571
注册时间:
开心了, 就笑;不开心了,就过会儿再笑。。。。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
在从服务器上执行可以查看到很多同步的参数,我们需要特别注意的参数如下,希望文章对各位会有所帮助。
在从服务器上执行可以查看到很多同步的参数,我们需要特别注意的参数如下:
Master_Log_File:&&&&&&&&&&&&&&&&&&&&& SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称
Read_Master_Log_Pos:&&&&&&& 在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置
Relay_Log_File:&&&&&&&&&&&&&&&&&&&&&&& SQL线程当前正在读取和执行的中继日志文件的名称
Relay_Log_Pos:&&&&&&&&&&&&&&&&&&&&&&& 在当前的中继日志中,SQL线程已读取和执行的位置
Relay_Master_Log_File:&&&&& 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Slave_IO_Running:&&&&&&&&&&&&&&&& I/O线程是否被启动并成功地连接到主服务器上
Slave_SQL_Running:&&&&&&&&&&&&& SQL线程是否被启动
Seconds_Behind_Master:&&&& 从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。
从库同步延迟情况出现的
1、show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大
2、show slave status显示参数Relay_Master_Log_File和Master_Log_File显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大
3、mysql的从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害
a、MySQL主从同步延迟原理
mysql主从同步原理:
主库针对写操作,顺序写binlog,从库单线程去主库顺序读”写操作的binlog”,从库取到binlog在本地原样执行(随机写),来保证主从数据逻辑上一致。
mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。
有朋友会问:“主库上那个相同的DDL也需要执行10分,为什么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。
&Exec_Master_Log_Pos:&从库上的这个卡着 ,没有变化。
查看查看从库的rely-bin log 时 有些点是空的,过段时间,会自己跟上
&mysqlbinlog&--base64-output=decode-row&-v&-v&-j&&--stop-position=&/data/mysql/mysql-relay-bin.002797&>/tmp/bin.log
b、 MySQL主从同步延迟是怎么产生的?
当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。
首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高
次要原因:读写binlog带来的性能影响,网络传输延迟。
c、 MySQL数据库主从同步延迟解决方案。
1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。
2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。
3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。
4.不同业务的mysql物理上放在不同机器,分散压力。
5.使用比主库更好的硬件设备作为slave
总结,mysql压力小,延迟自然会变小。
1.采用好服务器,比如4u比2u性能明显好,2u比1u性能明显好。
2.存储用ssd或者盘阵或者san,提升随机写的性能。
3.主从间保证处在同一个交换机下面,并且是万兆环境。
总结,硬件强劲,延迟自然会变小。一句话,缩小延迟的解决方案就是花钱和花时间。
mysql主从同步加速
1、sync_binlog在slave端设置为0
2、–logs-slave-updates 从服务器从主服务器接收到的更新不记入它的二进制日志。
3、直接禁用slave端的binlog
4、slave端,如果使用的存储引擎是innodb,innodb_flush_log_at_trx_commit =2
从文件系统本身属性角度优化
修改、Unix文件系统中文件的etime属性, 由于每当读文件时OS都会将读取操作发生的时间回写到磁盘上,对于读操作频繁的数据库文件来说这是没必要的,只会增加磁盘系统的负担影响I/O性能。可以通过设置文件系统的mount属性,组织操作系统写atime信息,在linux上的操作为:
打开/etc/fstab,加上noatime参数
/dev/sdb1 /data reiserfs noatime 1 2
然后重新mount文件系统
#mount -oremount /data
主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置是需要的
而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率
1、sync_binlog=1 o
MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去。
默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。
如果sync_binlog>0,表示每sync_binlog次事务提交,MySQL调用文件系统的刷新操作将缓存刷下去。最安全的就是sync_binlog=1了,表示每次事务提交,MySQL都会把binlog刷下去,是最安全但是性能损耗最大的设置。这样的话,在数据库所在的主机操作系统损坏或者突然掉电的情况下,系统才有可能丢失1个事务的数据。
但是binlog虽然是顺序IO,但是设置sync_binlog=1,多个事务同时提交,同样很大的影响MySQL和IO性能。
虽然可以通过group commit的补丁缓解,但是刷新的频率过高对IO的影响也非常大。对于高并发事务的系统来说,
“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。
所以很多MySQL DBA设置的sync_binlog并不是最安全的1,而是2或者是0。这样牺牲一定的一致性,可以获得更高的并发和性能。
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。
2、innodb_flush_log_at_trx_commit (这个很管用)
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。
日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。
3、ls(1) 命令可用来列出文件的 atime、ctime 和 mtime。
atime 文件的access time 在读取文件或者执行文件时更改的
ctime 文件的create time 在写入文件,更改所有者,权限或链接设置时随inode的内容更改而更改
mtime 文件的modified time 在写入文件时随文件内容的更改而更改
ls -lc filename 列出文件的 ctime
ls -lu filename 列出文件的 atime
ls -l filename 列出文件的 mtime
stat filename 列出atime,mtime,ctime
atime不一定在访问文件之后被修改
因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime信息。
这三个time stamp都放在 inode 中.如果mtime,atime 修改,inode 就一定会改, 既然 inode 改了,那ctime也就跟着改了.
之所以在 mount option 中使用 noatime, 就是不想file system 做太多的修改, 而改善读取效能
阅读(493) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
怎样解决MySQL数据库主从复制延迟的问题
下载积分:400
内容提示:怎样解决MySQL数据库主从复制延迟的问题 10:07像..
文档格式:PDF|
浏览次数:422|
上传日期: 23:59:12|
文档星级:
该用户还上传了这些文档
怎样解决MySQL数据库主从复制延迟的问题
官方公共微信MySQL主从数据库同步延迟问题解决_数据库技术_Linux公社-Linux系统门户网站
你好,游客
MySQL主从数据库同步延迟问题解决
来源:Linux社区&
作者:Linux
最近在做MySQL主从数据库同步测试,发现了一些问题,其中主从同步延迟问题是其中之一,下面内容是从网上找到的一些讲解,记录下来以便自己学习;
MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。
MySQL主从同步故障-Slave_SQL_Running: No
MySQL主从同步搭建
MySQL主从复制配置详述
MySQL Replication(主从服务器)配置实例
在Linux系统中做MySQL数据库主从服务器
MySQL 安装与主从配置
相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?
1. MySQL数据库主从同步延迟原理。
2. MySQL数据库主从同步延迟是怎么产生的。
3. MySQL数据库主从同步延迟解决方案。
1. MySQL数据库主从同步延迟原理。
答:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:&主库上那个相同的DDL也需要执行10分,为什么slave会延时?&,答案是master可以并发,Slave_SQL_Running线程却不可以。
2. MySQL数据库主从同步延迟是怎么产生的。
答:当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。
3. MySQL数据库主从同步延迟解决方案
答:最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。
mysql-5.6.3已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,使用的是以数据库(schema)为单位做多线程,不同的库可以使用不同的复制线程。
sync_binlog=1
This makes MySQL synchronize the binary log&s contents to disk each time it commits a transaction
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢 失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器 处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍 然存在binlog中。可以用--innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要--innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收 回滚的语句)。
innodb_flush_log_at_trx_commit (这个很管用)
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。
本文永久更新链接地址:
相关资讯 & & &
& (11月09日)
& (09月01日)
& (11月29日)
& (09月29日)
& (09月01日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 mysql主从延迟解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信