- 浏览: 177786 次
- 性别:
- 来自: 上海
文章分类
最新评论
使用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_proxy_read
通过这种方式,就可以比较完美的结果MySQL的同步延迟不可控问题。之所以所“比较完美”,是因为这种方案double了查询请求,对Master和Slave构成了额外的压力。不过由于Proxy与真实的Mysql Server采用连接池的方式连接,因此额外的压力还是可以接受的
发表评论
-
oracle 查看执行计划的方式
2016-12-20 18:16 348一、通过PL/SQL Dev工具 1、直接File- ... -
pl/sql 乱码解决
2016-08-25 16:25 292select userenv('language') from ... -
分库分表
2016-07-03 12:30 503第1章 引言 随着互联网 ... -
select for update
2016-03-30 17:45 575xjr80C7HA3olbVr3y6H3t5--AcosrkB ... -
数据库超时
2016-03-07 10:37 378 -
oracle merge into
2016-03-04 16:16 383/*Merge into 详细介绍 MERGE语句是Oracl ... -
oracle 分区表
2016-03-02 14:59 386(1) 表空间及分区表的 ... -
一些注意的sql写法
2016-01-20 14:07 728Dashboard > 流程空间 > home ... -
oracle 组合索引使用
2016-01-14 20:33 854在Oracle中可以创建组合索引,即同时包含两个或两个以上列的 ... -
oracle 索引
2016-01-14 20:24 611一、 ROWID的概念 存储了row在数据文件中的具体位置: ... -
oracle 查看sql执行计划
2016-01-14 14:06 355如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划 ... -
oracle sql调优 执行计划固化 排序等 SQL Plan Baseline
2015-11-14 16:13 13731.对查询进行优化,应 ... -
oracle 字段类型 收录
2015-11-02 19:52 724字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符 ... -
oracle trunc 函数
2015-08-25 17:57 538Oracle trunc()函数的用法 --Oracle t ... -
oracle 分析函数
2015-08-03 12:49 561oracle分析函数--SQL*PLUS环 ... -
跨数据库事务研究
2015-05-12 11:16 826两种方案: 1、分布式 ... -
Oracle的悲观锁和乐观锁
2015-04-22 13:27 417为了得到最大的性能, ... -
MySQL数据库MyISAM和InnoDB存储引擎的比较
2015-04-21 13:49 451MySQL有多种存储引擎,MyISAM和InnoDB是其中常用 ... -
nosql学习
2015-04-20 09:56 5241、NoSQL数据库概念 NoSQL ... -
sql distinctt group by 分析
2015-04-14 15:28 521在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅 ...
相关推荐
公司运维手册,安装LAP+mysql主从库 apache+mysql+proxy主从+PHP+discuz论坛,废话不多说,上干货!
学习使用mysql的官方docker镜像,在宿主机上启动mysql docker镜像搭建主从复制
MySQL 主从配置(linux),mysql-proxy
mysql数据库主从数据同步, vim /etc/mysql/my.cnf server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog-do-db=proxy 注:binlog-do-db提供数据同步服务的数据库 #忽略的数据库复制 binlog-ignore-db=...
该压缩包中包含了测试proxy和mycat对mysql主从的方法,测试环境的搭建步骤和测试对比结果
MySQL数据库主从复制以及读写分离搭建过程
14-企业生产场景MySQL主从复制故障原因及实战解决.avi 15-从库开启BINLOG原因及开启实战讲解1.avi 16-从库开启BINLOG原因及开启实战讲解2.avi 17-企业场景一主多从宕机从库切换主继续和从同步过程详解1.avi 18-企业...
MySQL主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的
该文档参考网上的博客,亲测mysql实现主从分离,用mysql-proxy实现读写分离,里面记录了踩到的三个大坑,希望可以帮助朋友们!
docker_compose搭建shardingSphereProxyMysql主从读写分离
linux_基于主从结构读写分离MYSQL集群
1. mysql-proxy (GA) 2. mysql router(待完善) 3. Mycat 7. 要理解为什么分库分表 8. 要理解如何分库分表 9. 什么时候选择垂直分库、什么时候选择水平分表 10. 要明白分库分表中会存在的问题 11. Mycat(录播) ...
一般来说mysql都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
一、MySQL-Proxy基础 MySQL Proxy是一个处于你的Client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改...
在windows下配置的,后面会在Linux下配置进行测试,需要配置mysql数据库同步的朋友可以参考下。
25-MySQL主从集群配置.wmv 26-Binlog-Format的区别.wmv 27-主主复制.wmv 28-主主复制时的主键冲突解决.wmv 29-被动主主复制.wmv 30-MySQL Proxy完成负载均衡与读写分离.wmv 31-Partition分区.wmv 32-事务讲解.wmv
基本需求:1、高可用性:将停止服务时间降低到最低甚至是不间断服务2...更近一步,使用mysqlproxy技术,实现主从服务器的读写分离,大大提高这个系统的性能和负载能力。2、数据库与外部网络隔离,只允许web服务器(bbs,
一个完整的mysql读写分离环境包括以下几个部分: • 应用程序client • database proxy • database集群
环境: 192.168.100.210 ... 208作为mysql-proxy. 106作为测试机器.相关软件下载: lua www.lua.org mysql-proxy http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/1. 在208上安装lua #tar zxvf lua-5.