mysql读写分离延迟_解决Mysql读写分离数据延迟
使用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读写分离数据延迟相关推荐
- mysql占用多少内存_解决mySQL占用内存超大问题
解决mySQL占用内存超大问题 解决mySQL占用内存超大问题 为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆.网上搜索了一下,得到高人指点my.ini.再也没见 ...
- mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况
我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...
- mysql拒绝远程连接_解决Mysql数据库拒绝远程连接和忘记密码的问题
解决数据库忘记密码的问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 编辑m ...
- mysql中文模糊查询_解决MySQL中文模糊查询问题
解决MySQL中文模糊查询问题: 我们在MySQL中进行中文模糊查询时,经常会返回一些与之不相关的记录,比如查找%a%时,返回的可能有中文字符,却没有a字符存在.对于此问题目前发现一种方法可以很方便解 ...
- mysql远程不能访问_解决MySQL无法远程访问的3方案
在解决MySQL无法远程访问的实际操作中我们经常会选择的方案,除了改表法与授权法,在安装MySQL的机器上运行这一方法也是比较好用的方案,以下就是文章对解决MySQL无法远程访问的一些解决方案的描述. ...
- mysql不同版本乱码_解决MySQL中文乱码以及版本不一致问题_MySQL
一.导出数据 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MySQL Workbench 5.2.47. 我想把本机数据库内的 ...
- xp mysql字符集与乱码_解决MYSQL中文乱码问题三种方法
方法三 1>本文将消除乱码分为三步: >消除页面乱码, >消除从mysql教程中读出中文乱码, >消除插入mysql数据库教程中的中文乱码: 15>注意编码表示方式在网页 ...
- mysql 中文模糊查询_解决mysql中文模糊查询问题的方法
mysql进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在. 通过阅读MySQL的Manual,发现了一种可以满意 ...
- mysql字符集乱码问题_解决mysql字符集乱码问题
character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...
- mysql登陆1130错误_解决MySQL远程登录时出现ERROR 1130错误问题
在用mysql进行远程连接时出现下列错误 [root@openfire ~]# mysql -u root -h mysql.clvn.com.cn -p Enter password: ERROR ...
最新文章
- ARM汇编 beq和bne
- android一天一次弹窗,Android自定义Toast,多次弹出时取消上次弹出,最后一次弹出为准...
- js 正则表达式 整合
- 随笔27 面向对象的五大基本原则
- java并发:初探消费者和生产者模式
- 对付洗稿者的一个脑洞
- atitit.html5 拼图游戏的解决之道.
- 一款Mac平台上自带广告拦截功能插件的浏览器软件
- OSEK和Autosar网络管理的区别和共同点
- 批量md5解密教程,用这个免费md5解密网站亲测能解
- 【Jmeter+ant+Jenkins自动化持续集成】
- 查询数据表中重复数据及重复次数
- 枚举所有IE窗口,实现自动登录
- 网络安全风险无处不在
- 【C语言蓝桥杯每日一题】——跑步锻炼
- 利用excel与Pandas完成实现数据透视表(文末赠书)
- nb_samples(采样数)转换
- 微信小游戏实现语音识别(超详细)
- 【JAVA】-- 字符流(Reader、Writer)
- 2、公众号开发--自定义(简易模式)菜单以及素材的永久URL地址获取方法
热门文章
- 瑞星保卫统计局杀软网络版获青睐
- RGB 256颜色表代码表
- 首份2020信创报告出炉,四大巨头市场格局立现(附全文下载)
- 圈子圈套 pdf_名字叫什么? 如何圈套好域名
- 遭遇nat.exe,socks.exe,USP10.dll,BOSC.dll,kb080387.CNT,~ctwxw.txt等1
- CashFiesta 攻略
- 强制删除“无法删除文件/文件夹”方法全集合
- ssl证书下载与安装 – 如何下载ssl证书
- 百度网盘有linux客户端吗,bcloud-百度网盘Linux客户端
- ubuntu下安装万能五笔