写点什么

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

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

关注

评论

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

Java-技术专题-final关键字

码界西柚

知识点梳理:聊聊iOS SDK数据采集那点事儿

易观大数据

C++ 手把手教你实现可变长的数组

小林coding

c++ 编程 数组

C++ 一篇搞懂继承的常见特性

小林coding

c++ 编程 继承

SpreadJS 纯前端表格控件应用案例:铭天预算执行系统

葡萄城技术团队

SpreadJS 预算执行系统

使用 Golang 和 HTML5 开发一个 MacOS App

郭旭东

macos Go 语言

高效程序员的45个习惯:敏捷开发修炼之道(2)

石云升

读书笔记 敏捷开发 对事不对人 欲速则不达

最佳实践:使用阿里云CDN加速OSS访问

阿里云Edge Plus

CDN

C++ this指针的理解和作用

小林coding

c c++ 指针

C++ 模板常见特性(函数模板、类模板)

小林coding

c++ 编程 模板方法

Go语言专家测试,80%的人第一题就挂了!

博文视点Broadview

云原生 评测 Go 语言

C++ 自增、自减运算符的重载和性能分析

小林coding

c++ 编程 运算符

微服务-技术专题-初步介绍服务发现

码界西柚

Java 技术 微服务

排序算法一(冒泡排序、选择排序、插入排序)

xcbeyond

Java 算法 冒泡排序 选择排序 插入排序

C++ static 与 const 的认识

小林coding

c++ 编程 static关键字

经济优势再显,江苏如何通过职教打造人才高地?

InfoQ_967a83c6d0d7

云计算的可信新边界:边缘计算与协同未来——【两万五千字长文】

华为云开发者联盟

云计算 云原生 5G 边缘计算 云服务

白鹭引擎助力《迷你世界》研发团队开发3D小游戏版

DT极客

C++ 一篇搞懂多态的实现原理

小林coding

c++ 编程 封装、继承、多态

C++ 流插入和流提取运算符的重载

小林coding

c++ 编程

SpringCloud(Netflix)-技术专题-Ribbon的基本使用

码界西柚

Java 技术 SpringCloud

Volcano:带你体验容器与批量计算的碰撞的火花

华为云开发者联盟

Kubernetes 容器 分布式 Volcano 批量计算

2. 整体把握 CocoaPods 核心组件

Edmond

ruby ios swift CocoaPods 包管理工具

区块链:在发展的同时,准备好你的产品。

石云升

区块链 DCEP 创新

排序算法二(归并排序、快速排序、希尔排序)

xcbeyond

Java 算法 快速排序 归并排序 希尔排序

C++ 赋值运算符‘=‘的重载(浅拷贝、深拷贝)

小林coding

c++ 编程 浅拷贝和深拷贝

Linux 平均负载高了怎么办?

小林coding

Linux 问题处理 linux命令

C++ 运算符重载的基本概念

小林coding

c++ 编程

央行发行的数字货币会带来哪些变化?

石云升

区块链 数字货币 DECP

Java NIO 是 NIO么?

soolaugust

Java io nio

职教黄金时代,河南如何继续“乘风破浪”?

InfoQ_967a83c6d0d7

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