2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

MobPush Android 厂商通道回执配置指南

MobTech袤博科技

这5个有趣、强大的AIGC,你值得拥有

没有用户名丶

火山引擎基于 Dragonfly 加速实践

SOFAStack

开源 开发者 开发

MQTT安全专题01|构建可靠的物联网系统

EMQ映云科技

物联网 IoT mqtt 物联网安全 企业号 3 月 PK 榜

JVM超神之路:金三银四跳槽需要的JVM知识点,都给你整理好了

Java你猿哥

Java 面试 JVM 面经 Java工程师

QPSK/DQPSK 调制解调系统仿真

timerring

通信系统仿真

江苏银行与易观千帆达成合作,打造金融服务“新样本”

易观分析

金融 银行 经济

什么是 LuaJIT?为什么 Apache APISIX 选择了 LuaJIT?

API7.ai 技术团队

lua api 网关 APISIX API Gateway

真香!180页100+题15W+字解析的《Java高级面试指南》,果断收下

Java java面试 Java八股文 Java面试题 Java面试八股文

阿里面试:100个高频Spring面试题,助你一臂之力

Java你猿哥

Java spring 面试 Spring Boot 面经

视频回放编辑工具:Mitti 激活版

真大的脸盆

Mac 视频处理 Mac 软件 视频编辑 视频回放工具

来啦!OceanBase DevCon • 2023议程公布!

OceanBase 数据库

数据库 oceanbase

来2023全球边缘计算大会与EMQ探讨云边协同落地实践

EMQ映云科技

物联网 IoT 边缘计算 emq 企业号 3 月 PK 榜

面试官:说说什么是单点登录?什么是SSO?什么是CAS?

Java你猿哥

Java ssm CAS SSO

面试官:给你一段SQL,你会如何优化?

Java MySQL 数据库 sql 性能优化

活动回顾|龙蜥社区云原生 SIG 首届 MeetUp 圆满落幕 持续打造面向云时代的竞争力

OpenAnolis小助手

开源 云原生 Meetup 龙蜥社区 sig

OpenAI 发布ChatGPT 插件支持,官方文档译文

B Impact

大模型时代的异构计算平台

百度Geek说

人工智能 深度学习 AI 企业号 3 月 PK 榜

2023年中国品牌全域智能营销白皮书

易观分析

营销 品牌

【3.17-3.24】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

浅谈 Java线程状态转换及控制

Java你猿哥

Java 后端 多线程 ssm Java工程师

硬核!最全“Java面试宝典+Java核心知识集”,一箭双雕杠春招

Java java面试 Java八股文 Java面试题 Java面试八股文

操作系统跻身国家战略,中国操作系统开源社区走向何方?

OpenCloudOS

Linux 操作系统 DPU 大禹智芯 opencloudOS

周杰伦在唱什么?数据可视化告诉你!

博文视点Broadview

linux环境arm64架构编译iotDB

小黄鱼

Thrift IoTDB arm64

面试官:kafka分布式消息系统,你真的了解吗?

Java kafka 消息队列 消息系统 消息中间件

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