免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1135 | 回复: 0
打印 上一主题 下一主题

用MySQL-Proxy实现读写分离 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-24 14:19 |只看该作者 |倒序浏览

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

  • 负载平衡和故障转移处理
  • 查询分析和日志
  • SQL宏(SQL macros)
  • 查询重写(query rewriting)

  • 执行shell命令

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


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
      -- 选择一个拥有空闲连接的从数据库
      if s.type == proxy.BACKEND_TYPE_RO and
         s.idling_connections > 0 then
        if max_conns == -1 or
           s.connected_clients  0 then
      proxy.connection.backend_ndx = max_conns_ndx
    end
  else
    -- 发送到主数据库
  end
  return proxy.PROXY_SEND_QUERY
Jan提醒说这个技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8111/showart_449100.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP