写点什么

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

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

关注

评论

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

ansible 远程容器机种方法

ghostwritten

Docker ansible

数据增强(二)-SamplePairing

AIWeker

人工智能 深度学习 数据增强 5月月更

开源项目丨 Taier 1.1 版本正式发布,新增功能一览为快

袋鼠云数栈

大数据

【ELT.ZIP】OpenHarmony啃论文俱乐部——即刻征服3D网格压缩编码

ELT.ZIP

3D OpenHarmony ELT.ZIP 图像视觉

TiDB 6.0 Book Rush!一起来分布式创作 6.0 的使用手册吧!

TiDB 社区干货传送门

【刷题第四天】剑指 Offer II 076. 数组中的第 k 大的数字

白日梦

5月月更

如何使用 ansible 变量

ghostwritten

ansible

ansible 安装 httpd

ghostwritten

ansible httpd

helm charts 内置函数

ghostwritten

Kubernetes Helm

TiDB【城市开拓招募帖】回答“社区活动什么时候来我的城市?”

TiDB 社区干货传送门

ansible 模块:yum

ghostwritten

ansible yum

转行运维工程师之后,我先把这几个Linux 命令记在了本子上,实干9场景

梦想橡皮擦

5月月更

helm 自动滚动部署

ghostwritten

Kubernetes Helm

helm 注意事项

ghostwritten

Kubernetes Helm

helm 插件:helm-schema-gen——yaml转换json

ghostwritten

Kubernetes Helm

helm test 测试

ghostwritten

Kubernetes Helm

公有云厂商有哪些?排名是怎样?

行云管家

云计算 公有云 企业上云 云厂商

helm 3.8 命令指南

ghostwritten

Kubernetes Helm

helm 模板函数与管道

ghostwritten

Kubernetes Helm

web前端培训vue3响应式reactive源码分析

@零度

前端开发 Vue 3

helm 命名模板

ghostwritten

Kubernetes Helm

java培训redis集群原理分享

@零度

redis JAVA开发

helm v2 hooks

ghostwritten

Kubernetes Helm

用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性

TiDB 社区干货传送门

helm NOTES.txt

ghostwritten

Kubernetes Helm

helm 控制流程:循环、判断

ghostwritten

Kubernetes Helm

helm charts openshift Certified 实践

ghostwritten

Kubernetes Helm

2022年5月中国数据库排行榜:墨天轮榜单榜首易位,前九三商三云三开源

墨天轮

数据库 opengauss TiDB 国产数据库 达梦

将项目自动化发布到多台windows服务器上的工具有吗?哪个好?

行云管家

IT运维 自动化运维 服务器运维

helm v2 公共源大全

ghostwritten

Kubernetes Helm

helm values.yaml

ghostwritten

Kubernetes Helm

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