当前位置: 首页 > 图文教程 > 数据库 > MYSQL > 如何使用"MySQL-Proxy"实现读写分离

MYSQL
MySQL 实用命令
Mysql 默认字符集设置方法(免安装版)
MySQL 数据库对服务器端光标的限制
MySQL UPDATE更新语句精解
Table ‘xxx’ is marked as crashed and should be repaired 错误解决方法参考
mysql 读写分离(基础篇)
mysql 读写分离(实战篇)
processlist命令 查看mysql 线程
MySQL 数据类型 大全
MySQL 密码设置
MYSQL代码 定期备份Mysql数据库
汇总整理MYSQL相关操作命令
MySQL 数据库两台主机同步实战(linux)
MSSQL 添加字段说明
MySQL 查询某个字段不重复的所有记录
mysql 设置默认的时间值
mysqlreport显示Com_中change_db占用比例高的问题的解决方法
解决mysql不能插入中文Incorrect string value
mysql从执行.sql文件时处理\n换行的问题
mysql 主从服务器的简单配置

MYSQL 中的 如何使用"MySQL-Proxy"实现读写分离


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 97 ::
收藏到网摘: n/a

MySQL-Proxy处在MySQL数据库客户和服务端之间的程序,它支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:

·负载平衡和故障转移处理

·查询分析和日志

·SQL宏(SQL macros)

·查询重写(query rewriting)

·执行shell命令

MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。

如何使用 MySQL-Proxy"实现读写分离

Jan Kneschke在《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题:

为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。MySQL协议首先进行握手。当进入到查询/返回结果的阶段再认证新连接就太晚了。我们必须保证拥有足够的打开的连接才能保持运作正常。

实现读写分离的LUA脚本:

-- 读写分离

以下为引用的内容:

 --
 -- 发送所有的非事务性Select到一个从数据库
 if is_in_transaction == 0 and
   packet:byte() == proxy.COM_QUERY and
   packet:sub(2, 7) == "SELECT" then
  local max_conns = -1
  local max_conns_ndx = 0
  for i = 1, #proxy.servers do
   local s = proxy.servers[i]
   -- 需要选择一个拥有空闲连接的从数据库
   if s.type == proxy.BACKEND_TYPE_RO and
     s.idling_connections > 0 then
    if max_conns == -1 or
      s.connected_clients < max_conns then
     max_conns = s.connected_clients
     max_conns_ndx = i
    end
   end
  end
  -- 至此,我们找到了一个拥有空闲连接的从数据库
  if max_conns_ndx > 0 then
   proxy.connection.backend_ndx = max_conns_ndx
  end
 else
  -- 发送到主数据库
 end
 return proxy.PROXY_SEND_QUERY


注释:此技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。