AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

从React源码来学hooks是不是更香呢

goClient1992

React

JVM 浅析(二)

Andy

一面高频vue面试题

bb_xiaxia1998

Vue

顶级的计算机科学家是如何养成的?

博文视点Broadview

《一条select 语句在TiDB Server层都发生了什么》

TiDB 社区干货传送门

管理与运维

react源码中的协调与调度

flyzz177

React

千锋1024程序员节锋企优联开启认证考试大咖直播,为学员开启认证学习秘籍

千锋IT教育

前端培训适合零基础学习吗

小谷哥

每日一题之请描述Vue组件渲染流程

bb_xiaxia1998

Vue

负载均衡

Andy

等保备案和通信网络单元定级备案的五大区别讲解

行云管家

等保 等级保护 等保备案

【IT运维小知识】如何通俗理解节点、集群以及主从?

行云管家

高可用 高可用HA

云原生安全系列 1:零信任安全和软件开发生命周期

HummerCloud

云原生 安全 云原生安全 安全软件开发生命周期 10月月更

专项贴息贷款加速投放 锋云智慧助力教育信息化乘风而上

千锋IT教育

如何在填报场景中使用数据绑定获取数据源

葡萄城技术团队

户外LED电子显示屏市场会走向哪

Dylan

LED LED显示屏 户外LED显示屏

问:React的useState和setState到底是同步还是异步呢?

beifeng1996

React

什么是分布式数据库?我不信,看完这篇你还不懂!

TiDB 社区干货传送门

数据库架构设计 数据库前沿趋势

一次TiDB GC阻塞引发的性能问题分析

TiDB 社区干货传送门

性能调优 管理与运维 故障排查/诊断

「Go工具箱」go语言csrf库的使用方式和实现原理

Go学堂

golang 开源 程序员 CSRF 10月月更

干货好文 | 初探MySQL迁移到ClickHouse

沃趣科技

MySQL Clickhouse

Nginx浅析

Andy

TiDB 生产集群与加密通讯TLS的辛酸苦辣 - 开启篇

TiDB 社区干货传送门

集群管理 管理与运维

嵌入式 Linux 入门(七、Linux 下的环境变量)

矜辰所致

Linux 环境变量 10月月更

react源码中的生命周期和事件系统

flyzz177

React

MySQL高级:explain分析SQL,索引失效&常见优化场景

程序员小毕

Java MySQL 数据库 后端 索引

新思科技推出适用于IntelliJ集成开发环境的Code Sight标准版解决方案

InfoQ_434670063458

软件开发 代码 新思科技

微信小程序浅践

Andy

【web 开发基础】PHP 循环结构之 for 循环 -PHP 快速入门 (19)

迷彩

for循环 10月月更 web开发基础 PHP基础

每日一题之Vue的异步更新实现原理是怎样的?

bb_xiaxia1998

Vue

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