mysql-proxy学习

转载 2012年03月28日 21:45:33

使用MySQL将读写请求转接到主从Server。

 

一 安装MySQL Proxy

MySQL Proxy的二进制版非常方便,下载解压缩后即用。

解压缩的目录为:
$mysql-proxy_installed_dir (这里为/usr/local/mysql-proxy)
|_ bin
|_ include
|_ lib
|_ share

1. 为mysql-proxy建立配置文件。
如在$mysql-proxy_installed_dir创建文件mysql-proxy.cnf,内容如下:
Text代码  收藏代码
  1. [mysql-proxy]  
  2. admin-address = localhost:4041  
  3. admin-username = mytest  
  4. admin-password = 123456  
  5. admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua  
  6.   
  7. proxy-backend-addresses=192.168.1.241:3306  

注:在windows下我没发现admin.lua, 关于admin功能我还没去尝试。重要的是proxy-backend-addresses配置,上面的例子表示发往mysql proxy的请求将转发到192.168.1.241这个MySQL服务器的3306端口。
Linux下mysql-proxy.cnf要设置为0660权限。

2.启动MySQL Proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.cnf &
默认启动4040端口。
 

 

二 使用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采用连接池的方式连接,因此额外的压力还是可以接受的。


作者:iTech
出处:http://itech.cnblogs.com/

 


mysql-proxy学习(四)——性能测试

1.     硬件配置 hwconfig Summary:        Intel S5500WBV, 2 x Xeon E5620 2.40GHz,23.5GB / 24GB 1067MHz ...

mysql proxy学习(三)——体系结构

Mysql proxy体系结构:多线程+libevent+glib2 从前面的内容我们已经确认了accept过程是由主线程完成的,并且它创建了一个con->client的与client连接的even...

MySQL Proxy 学习笔记

作者:heiyeluren时间:2008-1-28博客:http://blog.csdn.net/heiyeshuwu【 测试平台 】服务器端:OS:FreeBSD 6.2Lua: 5.1.1MySQ...

MySql Proxy

  • 2014年06月21日 21:36
  • 22KB
  • 下载

MySQL-Proxy

  • 2016年10月09日 16:41
  • 3KB
  • 下载

Mysql主从复制/读写分离/proxy机制

mysql主从分离(双机热备) master-多slaver 如何实现读写分离 mysql如何采用代理实现...

mysql proxy

  • 2010年07月22日 17:44
  • 68KB
  • 下载

windows++mysql-proxy全部数据包

  • 2017年05月19日 16:26
  • 12.14MB
  • 下载

mysql proxy读写分离

mysql proxy 介绍 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途...
  • xy2204
  • xy2204
  • 2016年08月19日 17:21
  • 729

mysql-proxy-0.8.3-win32-x86.zip

  • 2013年01月16日 14:49
  • 7.91MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql-proxy学习
举报原因:
原因补充:

(最多只允许输入30个字)