写点什么

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

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

关注

评论

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

飞桨框架v2.4 API新升级!全面支持稀疏计算、图学习、语音处理等任务

飞桨PaddlePaddle

paddle API 飞桨

2023年新广州市等保测评机构名单看这里!

行云管家

等级保护 等保测评 广州

天翼云发布《中国医疗云建设与应用白皮书》 推动医疗数字化提质增速

Geek_2d6073

ChatGPT入门案例|商务智能对话客服(一)| 社区征文

TiAmo

AI ChatGPT

面试官:如果 MySQL 数据库中的数据丢失,有哪些补救的办法呢?

做梦都在改BUG

Java MySQL 数据库

明晚 8 点直播!OpenCloudOS 中的海光国密算法分析

OpenCloudOS

Linux

进击中的 Zebec 生态,Web2 与 Web3 世界的连接器

西柚子

模块六作业

程序员小张

「架构实战营」

Linux安装ElasticSearch

Geek_7ubdnf

Java elasticsearch

实现一个简单的Database10(译文)

GreatSQL

sqlite myslq greatsql greatsql社区

从实战出发,聊聊缓存数据库一致性

做梦都在改BUG

Java 数据库 缓存 一致性

Redis高级数据结构Stream和HyperLogLog

做梦都在改BUG

Java redis stream HyperLogLog

安全等保二级和三级哪个高?哪个费用更高?

行云管家

网络安全 信息安全 等保 等级保护 等级

入门数据分析师的最强秘籍,都在这4本书里!

博文视点Broadview

用这4招优雅的实现Spring Boot 异步线程间数据传递

小小怪下士

Java spring 程序员 springboot

怎样快速地迁移 MySQL 中的数据?

做梦都在改BUG

Java MySQL 数据库

分布式事务解决方案

Java 分布式事务 事务

Spring Security怎么从数据库加载我们的用户?

做梦都在改BUG

Java spring spring security

联邦GNN综述与经典算法介绍

京东科技开发者

算法 数据 GNN 联邦算法 图场景

基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地

汀丶人工智能

自然语言处理 nlp 2月月更 2月日更 文本匹配算法

5 步带你入门 GaussDB (DWS) 的 GDS 导入导出

华为云开发者联盟

数据库 华为云 企业号 2 月 PK 榜 华为云开发者联盟

ArkUI新能力,助力应用开发更便捷

HarmonyOS开发者

HarmonyOS

微服务 SpringBoot 整合 Redis GEO 实现附近商户功能

做梦都在改BUG

Java redis 微服务 Spring Boot

记一次SpringBoot启动优化实践

做梦都在改BUG

Java spring Spring Boot

软件测试/测试开发 | web自动化测试-执行 JavaScript 脚本

测试人

软件测试 自动化测试 测试开发 Web自动化测试 selenium

把盏言欢,款款而谈,当WorkPlus接入了ChatGPT机器人

WorkPlus

面试官:分库分表,真的有必要吗?

做梦都在改BUG

Java 分库分表

软件测试/测试开发 | Selenium多浏览器处理

测试人

软件测试 自动化测试 测试开发 selenium web测试

面试官:你来谈一下Synchronized-轻量级锁

做梦都在改BUG

Java synchronized 轻量级锁

OneCode开源低代码引擎白皮书

codebee

低代码 开发工具 低代码平台 java UI

Mac 使用brew install zsh 遇到 Error: Command failed with exit 128: git

24号工程师

brew zsh

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