日期:2014-05-16  浏览次数:21023 次

php+MySQL Proxy快速实现读写分离以及负载均衡,故障转移
MySQLPHPLuaSQL ServerSQL

简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本 ,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。


典型配置案例:
1、最基础的应用,代理单个数据库服务器,这样就可以通过4040端口访问mysql数据库。
mysql-proxy –proxy-backend-addresses=192.168.18.110:3306
2、连接多个数据库服务器,假如A and B. 第一个客户端连接到 A,第二个连接到 B。
如果有一台停止服务时,代理会自动检测到,有新连接时会自动连接到一台正常的数据库。
mysql-proxy \
–proxy-backend-addresses=narcissus:3306 \
–proxy-backend-addresses=nostromo:3306
3、数据库读写分离,192.168.18.110负责写入,192.168.18.107负责读取数据,当然也可以再增加读取数据的服务器。
mysql-proxy \
–proxy-backend-addresses=192.168.18.110:3306 \
–proxy-read-only-backend-addresses=192.168.18.107:3306
这种方式常被理解为可以读写分离了,但是实际不是的。mysql-proxy不能区分哪些是发往从服务器的,还需要自己用脚本控制,见第四种方式。
4、 Lua 脚本能很好的控制连接和分布, 以及查询及返回的结果集.
使用Lua脚本时,必须使用 –proxy-lua-script 指定脚本的名称。
直到产生连接的时候才会读取脚本,也就是修改脚本后不用重新启动服务。
mysql-proxy –proxy-lua-script=rw-splitting.lua –proxy-backend-addresses=192.168.18.110:3306 –proxy-read-only-backend-addresses=192.168.18.107:3306
注意的问题:
1、proxy的读写分离机制是先把最初的几条查询发到master上建立连接,
当发送到master上的查询数超过连接池的最小值时开始把查询
2、LAST_INSERT_ID不能发送到主服务器上, 226 行修改为下面的就可以了
elseif not is_insert_id and token.token_name == “TK_FUNCTION” then
3、使用默认的rw-splitting.lua时,会提示找不到proxy-command,我把mysql-proxy的路径设置为系统路径,然后在 share目录下运行就一切Ok了,在运行中输入cmd,然后cd C:\tools\mysql-proxy\share。
4、字符乱码
通过proxy连上数据库之后,查到的字符串始终是乱码,即便手工执行了set names ‘utf8′也没有效果。
解决办法,mysql server必须设置
1.[mysqld]
2.skip-character-set-client-handshake
3. init-connect=’SET NAMES utf8′
4. default-character-set=utf8

Java代码 复制代码
  1. public?function?isReadOperation($sql)?{ ??
  2. ????return?preg_match('/^\s*(SELECT|SHOW|DESC|PRAGMA)\s+/i',$sql); ??
  3. }??
public function isReadOperation($sql) {
	return preg_match('/^\s*(SELECT|SHOW|DESC|PRAGMA)\s+/i',$sql);
}

php读写分离类

Php代码 复制代码
  1. <?php ??
  2. /**************************************** ?
  3. ***?mysql-rw-php?version?0.1?@?2009-4-16 ?
  4. ***?code?by?hqlulu#gmail.com ?
  5. ***?http://www.aslibra.com ?
  6. ***?http://code.google.com/p/mysql-rw-php/ ?
  7. ***?code?modify?from?class_mysql.php?(uchome) ?
  8. ****************************************/??
  9. ??