写点什么

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

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

关注

评论

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

架构之:并发和并行

程序那些事

架构 软件架构 架构师 程序那些事

这是我在银四拿到的第6个offer!分享我的成功秘籍:阿里巴巴 Java 面试参考指南(2021 最新版)

Java 程序员 架构 面试

21岁就走了“狗屎运”(4面拿字节跳动offer Java岗)

Java架构师迁哥

女裤裤兜如何影响工业设计?

脑极体

限时分享:Alibaba技术官整理出来的Java零基础学习笔记

Java架构师迁哥

架构师实战营 模块五作业(设计微博评论的高性能高可用计算架构)

代廉洁

架构实战营

有点东西,GC与内存泄漏之间的联系分不清,居然也可以进微软?

Java架构师迁哥

阿里内部面试手册,Github 上获赞 80K,无论工作几年都可以看看

Java 编程 架构 面试

爆赞!GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 编程 程序员 架构师 IntelliJ IDEA

原来真的有外卖员转行学Java,还三面“拿下”拼多多offer!

Java架构师迁哥

基于ECS搭建FTP服务

若尘

阿里云 服务器 5月日更

21分钟 MySQL 入门教程

???

MySQL 编程

Java也太卷了,应届生找工作都需要准备这些知识点了!

Java架构师迁哥

网络攻防学习笔记 Day30

穿过生命散发芬芳

5月日更 网络攻防

通过混沌测试发现 HTTP/2 缺陷

卫智雄

🔎【Java源码探索】深入浅出的分析 ThreadPoolExecutor

码界西柚

Java 线程池工作原理 ThreadPoolExecutor 5月日更 Worker

使用 Quarkus 和 MicroProfile 实现微服务特性

张晓辉

Kubernetes 云原生 Quarkus Microprofile

交叉验证

Qien Z.

5月日更 交叉验证

开箱即用的 Prometheus 告警规则集

张晓辉

监控 Prometheus 告警

如何成为一名拖垮整个团队的产品经理?

冰河

深度思考 产品经理 自我思考 产品经历 技能提升

已经成功拿到字节offer,阿里内部二十三万字 Java 面试题总结

Java 程序员 架构 面试

消息队列并不能解耦

Xargin

☕【JVM 技术之旅】深入JVM回收器之Parallel Scavenge(上篇)

码界西柚

JVM GC 垃圾收集 5月日更 Parallel Scavenge

ubuntu64 位搭建 OpenVINO 系统(下篇)

IT蜗壳-Tango

5月日更

Spring XML Schema扩展机制源码解读

Hex

Java spring 后端 Java EE

华为内部论坛爆火的一份:Java面试培训笔记,秒变资深面试官

Java架构师迁哥

架构师实战营模块五

ifc177

随机数在区块链中的应用

CECBC

小王毕业两年转行学Java,现在过得比科班生过得还好?

Java架构师迁哥

Spark如何进行动态资源分配

数据社

spark 5月日更

Nginx利用resolver实现动态upstream

运维研习社

nginx 运维 5月日更 动态负载均衡

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