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

MYSQL
mysql Load Data InFile 的用法
MSSQL output使用
mysql 性能的检查和调优方法
mysql 的load data infile
MySQL 配置文件my.cnf 例子最详细翻译
MYSQL 随机 抽取实现方法及效率分析
mysql 存储过程的问题
Mysql my.ini 配置文件详解
mysql 控制台操作
mysql 服务完全卸载技巧
mysql 数据库设计
mysql 中文乱码 解决方法集锦
MYSQL 没有完全卸载将导致其安装不成功
mysql 教程 存储过程
asp.net 将图片上传到mysql数据库的方法
绿色版 mysql 安装配置
mysql root用户的密码修改和消除
MySQL 相关的环境变量
mysql 常用命令集锦[绝对精华]
linux mysql 安装与操作

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 101 ::
收藏到网摘: 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)。