写点什么

用 MySQL-Proxy 实现读写分离

  • 2007-10-17
  • 本文字数:993 字

    阅读完需:约 3 分钟

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 脚本是简单明了的:

-- 读写分离 <br></br>  --<br></br>  -- 发送所有的非事务性 SELECT 到一个从数据库 <br></br>  if is_in_transaction == 0 and<br></br>     packet:byte() == proxy.COM_QUERY and<br></br>     packet:sub(2, 7) == "SELECT" then<br></br>    local max_conns = -1<br></br>    local max_conns_ndx = 0<p>    for i = 1, #proxy.servers do</p><br></br>      local s = proxy.servers[i]<p>      -- 选择一个拥有空闲连接的从数据库 </p><br></br>      if s.type == proxy.BACKEND_TYPE_RO and<br></br>         s.idling_connections > 0 then<br></br>        if max_conns == -1 or<br></br>           s.connected_clients < max_conns then<br></br>          max_conns = s.connected_clients<br></br>          max_conns_ndx = i<br></br>        end<br></br>      end<br></br>    end<p>    -- 我们找到了一个拥有空闲连接的从数据库 </p><br></br>    if max_conns_ndx > 0 then<br></br>      proxy.connection.backend_ndx = max_conns_ndx<br></br>    end<br></br>  else<br></br>    -- 发送到主数据库 <br></br>  end<p>  return proxy.PROXY_SEND_QUERY</p><br></br>Jan 提醒说这个技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。

查看英文原文: Read/Write Splitting with MySQL-Proxy

2007-10-17 13:0629188
用户头像

发布了 225 篇内容, 共 72.2 次阅读, 收获喜欢 52 次。

关注

评论

发布
暂无评论
发现更多内容

揭秘版权保护下的视频隐形水印算法(下篇)

拍乐云Pano

音视频 RTC 拍乐云 隐形水印

【虚拟机专栏】Rust智能合约的应用

趣链科技

区块链 智能合约 虚拟机

数据安全法真的来了,这6个“雷区”千万别踩!

腾讯安全云鼎实验室

数据安全 数据安全法

数据结构和算法在流程画布中的实际应用

GrowingIO技术专栏

数据结构 G6 图可视化引擎 流程画布

MySQL 获取表的信息

玄兴梦影

MySQL 数据库表 查询语句

《转》什么是跨域?如何解决跨域问题?

hasWhere

北鲲云超算平台如何帮助现代生物制药发展?

北鲲云

“人类先锋”点亮物联网灯塔

脑极体

洞穿性能测试痛点,PerfDog以提升应用和游戏的品质为使命

WeTest

网络攻防学习笔记 Day124

穿过生命散发芬芳

9月日更 互联网安全

kubebuilder 构建控制器说明点

Geek_f24c45

Kubernetes kubebuilder kube-controller

fil挖矿机靠谱吗?fil挖矿哪家靠谱?

fil挖矿哪家靠谱 fil挖矿机靠谱吗

直播访谈-数据产品修炼之路

第519区

数据产品经理

数字人民币最新技术成果将亮相2021年服贸会

CECBC

🐦【Mybatis开发指南】如何清晰的解决出现「多对一模型」和「一对多模型」的问题

码界西柚

Java mybatis mybatis配置 9月日更

鸿蒙轻内核的得力助手:带你掌握4种内存调试方法

华为云开发者联盟

鸿蒙

InfoQ 引航计划正式启动!全网最优质技术内容,拿来吧你!

InfoQ写作社区官方

引航计划 技术专题合集 热门活动

fil挖矿gas费怎么看?fil挖矿需要质押多少?

fil挖矿需要质押多少 fil挖矿gas费怎么看

AISWare AntDB 亚信数据库在多省份计费系统应用案例

亚信AntDB数据库

案例分享 #数据库 9月日更

财经大课:如何看待规模化与差异化竞争

石云升

财经思维 9月日更

以两军问题为背景来演绎BasicPaxos

OpenIM

企业有运维人员,还有必要买运维管理系统吗?

行云管家

企业运维 运维审计 运维系统

AJAX获取的日期相差8小时

hasWhere

看云起云动 览开源盛世 | 亚马逊云科技中国峰会Dev Day线上来袭!

亚马逊云科技 (Amazon Web Services)

【HTML5游戏】从敲打空格键开始

devpoint

HTML5游戏 9月日更

2021年广播电视网络安全等级保护定级流程

行云管家

运维 等保测评 企业运维 广播电视

7个非常有前景的C++专业就业方向

hanaper

OCR加持白描App,让AI成为视障者的眼睛

百度开发者中心

人工智能 最佳实践 方法论 前沿技术

重磅!博睿数据通过CMMI5级评估,国内APM领域首家

博睿数据

Java + opencv 实现图片修复(图片去水印)

张音乐

Java OpenCV 音视频 9月日更 图片去水印

国产接口管理工具ApiPost中的COOKIE管理器

Proud lion

大前端 后端 Postman 开发工具 Cookie

用MySQL-Proxy实现读写分离_数据库_Gavin Terrill_InfoQ精选文章