mysql 读写分离(实战篇)

MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。

  Jan Kneschke在《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题:
  为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。MySQL协议首先进行握手。当进入到查询/返回结果的阶段再认证新连接就太晚了。我们必须保证拥有足够的打开的连接才能保持运作正常。
  实现读写分离的LUA脚本:
  

代码如下:

-- 读写分离
  --
  -- 发送所有的非事务性Select到一个从数据库
  if is_in_transaction == 0 and
  packet:byte() == proxy.COM_QUERY and
  packet:sub(2, 7) == "SELECT" then
  local max_conns = -1
  local max_conns_ndx = 0
  for i = 1, #proxy.servers do
  local s = proxy.servers[i]
  -- 需要选择一个拥有空闲连接的从数据库
  if s.type == proxy.BACKEND_TYPE_RO and
  s.idling_connections > 0 then
  if max_conns == -1 or
  s.connected_clients < max_conns then
  max_conns = s.connected_clients
  max_conns_ndx = i
  end
  end
  end
  -- 至此,我们找到了一个拥有空闲连接的从数据库
  if max_conns_ndx > 0 then
  proxy.connection.backend_ndx = max_conns_ndx
  end
  else
  -- 发送到主数据库
  end
  return proxy.PROXY_SEND_QUERY

  注释:此技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。

(0)

相关推荐

  • php实现带读写分离功能的MySQL类完整实例

    本文实例讲述了php实现带读写分离功能的MySQL类.分享给大家供大家参考,具体如下: 概述: 1. 根据sql语句判断是连接读库还是写库 2. 链式调用$this->where()->get() 3. 不同的主机对应不同的实例, 不再多次new 具体代码如下: <?php class DBRWmysql { private static $Instance = null; private $links = array();//链接数组 private $link = null; //当

  • Ubuntu10下如何搭建MySQL Proxy读写分离探讨

    一.MySQL-Proxy基础 MySQL Proxy是一个处于你的Client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析,查询过滤和修改等等. (Figure1:MySQL Proxy) MySQL-Proxy, announced in June, is a binary application that sits between your MySQL client and server, a

  • MySQL5.6 Replication主从复制(读写分离) 配置完整版

    MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTID(全局事务标示符). 需要注意的是:GTID方式不支持临时表!所以如果你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制还是不支持临时表的. 所以本教程主要是告诉大家如何通过日志(binlog)方式做主从复制! 2.MySQL官方提供的MySQL Replication教程: http://dev.mysql.com/

  • mysql 读写分离(基础篇)

    基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询.数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库. Jan Kneschke在<MySQL Proxy learns R/W Splitting>中详细的介绍了这种技巧以及连接池问题: 为了实现读写分离我们需要连接池.我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端.MySQL协议首先进行握手.当进入到查询/返回结果的阶段再认证新连接就太晚了.我们必须保证拥有足够的打开的连接才能保持运作正常

  • 通过mysql-proxy完成mysql读写分离

    环境:   192.168.100.210          192.168.100.104           192.168.100.208            192.168.100.106 说明:  210,104作为mysql数据库.      208作为mysql-proxy.      106作为测试机器. 相关软件下载:    lua        www.lua.org     mysql-proxy   http://mysql.cdpa.nsysu.edu.tw/Down

  • MySQL的使用中实现读写分离的教程

    mysql-proxy实现读写分离 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析,查询过滤和修改等等. MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡.对于应用来说,MySQL Pr

  • Yii实现MySQL多数据库和读写分离实例分析

    本文实例分析了Yii实现MySQL多数据库和读写分离的方法.分享给大家供大家参考.具体分析如下: Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能,也是最强大的框架之一,下文我们来介绍Yii实现MySQL多库和读写分离的方法 前段时间为SNS产品做了架构设计,在程序框架方面做了不少相关的压力测试,最终选定了YiiFramework,至于为什么没选用公司内部的 PHP框架,其实理由很充分,公司的框

  • MySQL主从同步、读写分离配置步骤

    现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,

  • MySQL 读写分离实例详解

    MySQL 读写分离 MySQL读写分离又一好办法 使用 com.mysql.jdbc.ReplicationDriver 在用过Amoeba 和 Cobar,还有dbware 等读写分离组件后,今天我的一个好朋友跟我讲,MySQL自身的也是可以读写分离的,因为他们提供了一个新的驱动,叫 com.mysql.jdbc.ReplicationDriver 说明文档:http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replic

  • 使用PHP实现Mysql读写分离

    本代码是从uchome的代码修改的,是因为要解决uchome的效率而处理的.这个思维其实很久就有了,只是一直没有去做,相信也有人有同样的想法,如果有类似的,那真的希望提出相关的建议. 封装的方式比较简单,增加了只读数据库连接的接口扩展,不使用只读数据库也不影响原代码使用.有待以后不断完善..为了方便,试试建立了google的一个项目:http://code.google.com/p/mysql-rw-php/希望给有需要的朋友带来帮助. PHP实现的Mysql读写分离主要特性:1.简单的读写分离

  • Thinkphp实现MySQL读写分离操作示例

    相对于其他方法实现MySQL的读写分离来说,采用Thinkphp框架实现MySQL的读写分离简单易用,其配置文件示例代码如下: 'DB_TYPE'=> 'mysql', 'DB_DEPLOY_TYPE' => 1, //开打支持多服务器 'DB_RW_SEPARATE'=>true,//数据库读写否分离 'DB_HOST'=> '192.168.11.101,192.168.11.102', 'DB_NAME'=>'test', 'DB_USER'=>'admin',

随机推荐