使用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接收到任何数据更新的请求时,均会触发这个触发器,该触发器更新自增表中的记录。如下图所示:

mysql_proxy_write

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

mysql读写分离延迟_解决Mysql读写分离数据延迟相关推荐

  1. mysql占用多少内存_解决mySQL占用内存超大问题

    解决mySQL占用内存超大问题 解决mySQL占用内存超大问题 为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆.网上搜索了一下,得到高人指点my.ini.再也没见 ...

  2. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

  3. mysql拒绝远程连接_解决Mysql数据库拒绝远程连接和忘记密码的问题

    解决数据库忘记密码的问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 编辑m ...

  4. mysql中文模糊查询_解决MySQL中文模糊查询问题

    解决MySQL中文模糊查询问题: 我们在MySQL中进行中文模糊查询时,经常会返回一些与之不相关的记录,比如查找%a%时,返回的可能有中文字符,却没有a字符存在.对于此问题目前发现一种方法可以很方便解 ...

  5. mysql远程不能访问_解决MySQL无法远程访问的3方案

    在解决MySQL无法远程访问的实际操作中我们经常会选择的方案,除了改表法与授权法,在安装MySQL的机器上运行这一方法也是比较好用的方案,以下就是文章对解决MySQL无法远程访问的一些解决方案的描述. ...

  6. mysql不同版本乱码_解决MySQL中文乱码以及版本不一致问题_MySQL

    一.导出数据 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MySQL Workbench 5.2.47. 我想把本机数据库内的 ...

  7. xp mysql字符集与乱码_解决MYSQL中文乱码问题三种方法

    方法三 1>本文将消除乱码分为三步: >消除页面乱码, >消除从mysql教程中读出中文乱码, >消除插入mysql数据库教程中的中文乱码: 15>注意编码表示方式在网页 ...

  8. mysql 中文模糊查询_解决mysql中文模糊查询问题的方法

    mysql进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在. 通过阅读MySQL的Manual,发现了一种可以满意 ...

  9. mysql字符集乱码问题_解决mysql字符集乱码问题

    character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...

  10. mysql登陆1130错误_解决MySQL远程登录时出现ERROR 1130错误问题

    在用mysql进行远程连接时出现下列错误 [root@openfire ~]# mysql -u root -h mysql.clvn.com.cn -p Enter password: ERROR  ...

最新文章

  1. ARM汇编 beq和bne
  2. android一天一次弹窗,Android自定义Toast,多次弹出时取消上次弹出,最后一次弹出为准...
  3. js 正则表达式 整合
  4. 随笔27 面向对象的五大基本原则
  5. java并发:初探消费者和生产者模式
  6. 对付洗稿者的一个脑洞
  7. atitit.html5 拼图游戏的解决之道.
  8. 一款Mac平台上自带广告拦截功能插件的浏览器软件
  9. OSEK和Autosar网络管理的区别和共同点
  10. 批量md5解密教程,用这个免费md5解密网站亲测能解
  11. 【Jmeter+ant+Jenkins自动化持续集成】
  12. 查询数据表中重复数据及重复次数
  13. 枚举所有IE窗口,实现自动登录
  14. 网络安全风险无处不在
  15. 【C语言蓝桥杯每日一题】——跑步锻炼
  16. 利用excel与Pandas完成实现数据透视表(文末赠书)
  17. nb_samples(采样数)转换
  18. 微信小游戏实现语音识别(超详细)
  19. 【JAVA】-- 字符流(Reader、Writer)
  20. 2、公众号开发--自定义(简易模式)菜单以及素材的永久URL地址获取方法

热门文章

  1. 瑞星保卫统计局杀软网络版获青睐
  2. RGB 256颜色表代码表
  3. 首份2020信创报告出炉,四大巨头市场格局立现(附全文下载)
  4. 圈子圈套 pdf_名字叫什么? 如何圈套好域名
  5. 遭遇nat.exe,socks.exe,USP10.dll,BOSC.dll,kb080387.CNT,~ctwxw.txt等1
  6. CashFiesta 攻略
  7. 强制删除“无法删除文件/文件夹”方法全集合
  8. ssl证书下载与安装 – 如何下载ssl证书
  9. 百度网盘有linux客户端吗,bcloud-百度网盘Linux客户端
  10. ubuntu下安装万能五笔