免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

用 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:0628785
用户头像

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

关注

评论

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

应聘高级Java工程师历程感言,附赠复习资料

Java 程序员 后端

微信抢红包实战案例,在线面试指南

策划Java工程师

Java 程序员 后端

成功从三线小公司跳进大厂涨薪8K,你值得拥有

策划Java工程师

Java 程序员 后端

促进数字经济向更高水平发展

CECBC

已获千赞,进阶学习资料!

Java 程序员 后端

带你彻底搞懂Java启动速度优化!全网独家首发!

Java 程序员 后端

弄到一份宝藏级SpringCloud实战文档,成功入职阿里

策划Java工程师

Java 程序员 后端

微信抢红包实战案例,已开源

策划Java工程师

Java 程序员 后端

有产品思维和数据意识的解决方案架构师?

escray

学习 极客时间 朱赟的技术管理课 8月日更

区块链需要一场革命

CECBC

总结2021年最全180道Java岗面试题,系列篇

策划Java工程师

Java 程序员 后端

开发8年的老Java才知道,详细解说

Java 程序员 后端

我们究竟还要学习哪些Java知识?程序员翻身之路

策划Java工程师

Java 程序员 后端

结合源码讲解:Kafka消费者参数配置(解释、定义、引用、注意事项)

石头哥谈架构

大数据 kafka架构 Kafka参数配置 Kafka技术内幕 分布式消息中间件

避免将 JWT 存储在 localStorage 中

devpoint

Token JWT LocalStorage 8月日更

【前端 · 面试 】HTTP 总结(二)—— HTTP 消息

编程三昧

面试 HTTP HTTP协议 8月日更 http消息

「SQL数据分析系列」14. 视图

Databri_AI

sql 数据 视图

TypeScript学习笔记——TS类型/高级用法

前端依依

typescript 学习 程序员 大前端 JavaScrip

一波三折,终于找到src漏洞挖掘的方法了【建议收藏】

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

奔着腾讯去

cpu Linux Kenel linuix

幸亏有这本623页的微服务框架实战笔记,讲的太清楚了

Java 程序员 后端

成功跳槽百度工资从15K涨到28K,面试突击版!

策划Java工程师

Java 程序员 后端

【LeetCode】删除有序数组中的重复项Java题解

Albert

算法 LeetCode 8月日更

一场“软硬兼施”的数字革新,帮外卖商家和骑手节省时间

脑极体

渣男已经预订大碗牢饭,“科技渣男”怎么还在疯狂套路?

脑极体

业务架构训练营学习总结

好吃不贵

【设计模式】建造者

Andy阿辉

C# 编程 后端 设计模式 8月日更

我凭借这份PDF的复习思路,面试题+笔记+项目实战

策划Java工程师

Java 程序员 后端

我用2个月的时间破茧成蝶,附赠课程+题库

策划Java工程师

Java 程序员 后端

Linux内核这么复杂,我该如何学习?

奔着腾讯去

学习 面试 内存 Linux Kenel 进程管理

别再用平板和手机当泡面盖了,将平板和手机同时作为电脑的外接显示屏,效率不只提升一点点 ! ! !

码农的后花园

ipad #windows #Mac 平板 电脑

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