减少mysql主从数据同步延迟问题的详解

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


mysql 主从同步延迟时,缓存如何取到最新的?修改

mysql 通过主从实现读写分离,读操作又有缓存(例如用 memcached/redis),但主从同步会有延迟,此时从库读出来的数据可能还没同步,如果存入缓存,一直都是脏数据了,延迟不可避免的,只能软硬架构优化降低,但极端情况下可能几秒,例如业务高峰期,或者前端做大促的时候,那么问题来了,有什么好的机制,可以在从从库上读的时候,知道是否是最新的,如果不是可以从主库读一下来解决?或者还有什么机制?

回答:

既要读写分离,又要缓存实时更新,
这时候,
还要坚持‘读取的时候加缓存’,就犯了教条主义错误了 ^_^

你写数据时候顺便搞一下缓存如何



1. 这些测试实际用处不大,系统架构设计的时候,就应该考虑复制的延时的影响. 对于时间不敏感的部分数据才可能应用到读写分离. 还需要保证只写一个库. 敏感的部分继续从主库读咯
2. 一般不推荐读写分离.你会有更成熟的做法


------------------------------------------------------------------------------------------------------------------

MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL线程负责执行这些本地日志,实现命令重放;

正常网络状况下IO线程没有性能问题,问题是SQL线程只有一个,更新速度跟不上。所以经常会看到从库的CPU idle很高,但同步性能就是上不去。



MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方 面开发带来了极大的便利。但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负 载、网络拥堵等方面的原因,Master与Slave之间的数据同步延迟是完全没有保证的。短在1秒内,长则几秒、几十秒甚至更长都有可能。
由于数据延迟问题的存在,当应用程序在Master上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也是当前Web开发的常规做法),就可能出现读取不到期望的数据,造成程序运行异常。
解决这个问题有多种方式,比如最简单的在所有的insert和update之后,强制sleep几秒钟。这是非常粗鲁的方式,对于更新操作不是很高的中小型系统,此方式基本能解决问题。
另外一种方式是应用程序把被更新的数据保存在本机的内存(或者集中式缓存)中,如果在写入数据完成后需要直接读取数据,则从本机内存中读取。这种方式的缺点是极大的增加了应用程序的复杂度,而且可靠性并不能完全得到保障。

在解决了读写分离后,如何解决同步延迟呢?
方法是在Master上增加一个自增表,这个表仅含有1个的字段。当Master接收到任何数据更新的请求时,均会触发这个触发器,该触发器更新自增表中的记录。如下图所示:

由于Count_table也参与Mysq的主从同步,因此在Master上作的Update更新也会同步到Slave上。当Client通过Proxy进行数据读取时,Proxy可以先向Master和Slave的Count_table表发送查询请求,当二者的数据相同时,Proxy可以认定Master和Slave的数据状态是一致的,然后把select请求发送到Slave服务器上,否则就发送到Master上。如下图所示:

通 过这种方式,就可以比较完美的结果MySQL的同步延迟不可控问题。之所以所“比较完美”,是因为这种方案double了查询请求,对Master和 Slave构成了额外的压力。不过由于Proxy与真实的Mysql Server采用连接池的方式连接,因此额外的压力还是可以接受的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值