mysql读写分离延迟_解决Mysql读写分离数据延迟[通俗易懂]

mysql读写分离延迟_解决Mysql读写分离数据延迟[通俗易懂]使用MySQLProxy解决MySQL主从同步延迟MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方面开发带来了极大的便利。但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负载、网络拥堵等方面的原因,Master与Slave之间的数据同步延迟是完全没有保证的。短在1秒内,长则几秒、几十秒甚至更长都有可能。…

大家好,又见面了,我是你们的朋友全栈君。

使用MySQL Proxy解决MySQL主从同步延迟

MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方面开发带来了极大的便利。但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负载、网络拥堵等方面的原因,Master与Slave 之间的数据同步延迟是完全没有保证的。短在1秒内,长则几秒、几十秒甚至更长都有可能。

由于数据延迟问题的存在,当应用程序在Master 上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也是当前Web开发的常规做法),就可能出现读取不到期望的数据,造成程序运行异常。

解决这个问题有多种方式,比如最简单的在所有的insert和update之后,强制sleep几秒钟。这是非常粗鲁的方式,对于更新操作不是很高的中小型系统,此方式基本能解决问题。

另外一种方式是应用程序把被更新的数据保存在本机的内存(或者集中式缓存)中,如果在写入数据完成后需要直接读取数据,则从本机内存中读取。这种方式的缺点是极大的增加了应用程序的复杂度,而且可靠性并不能完全得到保障。

使用MySQL Proxy可以很方便的解决这个问题。MySQL Proxy是基于MySQL Client 和 MySQL Server之间的代理程序,能够完成对Client所发请求的监控、修改。从Client角度看,通过Proxy访问Server和直接访问Server没有任何区别。对于既有的程序而言,只要把直接被访问的Server的IP地址和端口号换成Proxy的IP地址和端口号就可以。

MySQL Proxy的工作原理也较简单。在Proxy启动时可以指定Proxy所需要使用的lua脚本,在lua脚本中预先实现6个方法:

* connect_server() // 接收到Client的连接请求时调用

* read_handshake() //

* read_auth() // 读取Client的认证信息时调用

* read_auth_result() // 读取认证结果时调用

* read_query() // 读取Client的query请求时调用

* read_query_result() //读取query结果时调用

当 Proxy接收到Client请求时,在请求的不同的阶段会调用上面的不同方法。这样Proxy使用者就可以根据自己的业务需求,自由的实现这6个方法达到目的。

通过在read_query()中加入代码,我们可以截取出当前的请求是insert、update还是select,然后把 insert和update请求发送到Master中,把select请求发送到Slave中,这样就解决了读写分离的问题。

在解决了读写分离后,如何解决同步延迟呢?

方法是在Master上增加一个自增表,这个表仅含有1个的字段。当Master接收到任何数据更新的请求时,均会触发这个触发器,该触发器更新自增表中的记录。如下图所示:

c7d53e7b8f1528e2741077f5bbbbb748.png

mysql_proxy_write

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

3bcd20021815d1592dd077520ff6cf43.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133516.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python数据可视化从入门到实战_大数据可视化概念

    python数据可视化从入门到实战_大数据可视化概念真依然很拉风,简书《数据可视化》专栏维护者,里面有很多优秀的文章,本文便是其中一篇。文章总结了多种数据可视化图形,并简要介绍了各种图形的作用,能为科研工作者在数据可视化阶段提供新的思路,在…

    2022年10月2日
    3
  • mybatis逆向生成java代码_mybatis生成

    mybatis逆向生成java代码_mybatis生成前言有时候,我们创建实体类需要跟数据库表里面的字段对应起来。假如一张表有数百个字段,那么手动去写实体类的话就比较麻烦,而且容易出错。解决方案其实解决这个问题的方式有很多,本文介绍其中一种解决方案,通过mybatis的逆向工程生成实体类。本文使用的数据库是Oracle,MySQL只需要修改jar包以及generator.properties配置即可。可以从公众号【程序员高手之路】回复“逆向工程”获取源码!Step1修改p…

    2022年8月21日
    6
  • pycharm设置代理_mac pycharm怎么设置环境

    pycharm设置代理_mac pycharm怎么设置环境一、Shadowsocket用默认端口即可不需要改二、mac网络三、Pycharm配置代理检测成功四、然而执行代码还是没走代理最后方式直接request加代理#!/usr/bin/evnpython#-*-coding:utf-8-*-importrequestsproxy={“http”…

    2022年8月26日
    5
  • 微信小程序转二维码教程_小程序码转换成二维码

    微信小程序转二维码教程_小程序码转换成二维码微信小程序转二维码方法分享需要转码的可以看看这个东西是看个人需求的,618就要来了,各种活动也将来袭为了方便小程序邀请活动没法外发,这里分享下将小程序转二维码的方法首先,你需要在电脑上打开https://mp.weixin.qq.com注册一个个人微信订阅号,其次,登陆微信电脑版,微信号关注你注册的订阅号,这是重点注册好了,接下来就是详细步骤1首页-新建群发-选择自建图文-最上边点小程序2选择你要转码的小程序名字或者微信号如“来客有礼”,点下一步3点击“获取更多页

    2025年9月17日
    4
  • linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]

    linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]linux命令的基本用法是:zip[参数][打包后的文件名][打包的目录路径]linuxzip命令参数列表:-a将文件转成ASCII模式-F尝试修复损坏的压缩文件-h显示帮助界面-m将文件压缩之后,删除源文件-n特定字符串不压缩具有特定字尾字符串的文件-o将压缩文件内的所有文件的最新变动时间设为压缩时候的时间-q安静模…

    2022年10月20日
    2
  • tp框架使用心得(六)——分页查询

    tp框架使用心得(六)——分页查询

    2021年10月21日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号