MySQL读写分离有好几种方式 MySQL中间件 MySQL驱动层 代码控制

关于 中间件 和 驱动层的方式这里不做深究 暂且简单介绍下 如何通过PHP代码来控制MySQL读写分离

我们都知道 “读” 在SQL语句里是 “SELECT”, ”写” 是 “INSERT”

那么我们第一时间就应该想到 字符串截取 substr() 这个函数

首先我们通过substr()函数来获取到 sql语句的前6个字符是否为 “SELECT” 如果是我们连接读服务器进行处理 如果不是 我们连接写服务器进行处理

思路有了 那么就是代码了

$querystr = strtolower(trim(substr($sql,0,6)));    //截取SQL语句字符串//如果是select,就连接slave(从)服务器
if($querystr == 'select')
{$slave_server='192.168.80.3::3306';$dsn="mysql:host=$slave_server;dbname=3d";$user='root';$pass='root';$dbh=new PDO($dsn, $user, $pass);$res=$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
//如果不是select,就连接master(主)服务器
else
{$master_server='192.168.33.22::3306';$dsn="mysql:host=$master_server;dbname=3dprintsys";$user='root';$pass='123456';$dbh=new PDO($dsn, $user, $pass);$res=$dbh->exec($sql);
}
//面向对象的风格
<?php
class Db
{private $res;function __construct($sql){$querystr = strtolower(trim(substr($sql,0,6)));  //截取SQL语句字符串//如果是select,就连接slave(从)服务器if($querystr == 'select'){$res=$this->slave ($sql);$this->res=$res;}//如果不是select,就连接master(主)服务器else{$res=$this->master ($sql);$this->res=$res;}}/*** slave从库返回sql查询结果* @param $sql* @return array*/private function slave ($sql){//由于现实中读服务器的数量可能在一个以上 会引出负载均衡问题 这里就不做阐述了 从服务器IP我就随机获取了$slave_ip=$this->get_slave_ip();$dsn="mysql:host=$slave_ip;dbname=test";$user='root';$pass='root123';$dbh=new PDO($dsn, $user, $pass);return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);}/**master主库返回sql执行结果* @param $sql* @return int*/private function master ($sql){$master_ip='192.168.80.3';$dsn="mysql:host=$master_ip;dbname=test";$user='root';$pass='root123';$dbh=new PDO($dsn, $user, $pass);return $dbh->exec($sql);}/*** 随机获取slave-ip* @return mixed*/private function get_slave_ip(){$slave_ips=['192.168.0.1','192.168.0.2'];$count=count($slave_ips)-1;$index =mt_rand(0,$count);return $slave_ips[$index];}/**       * 获取结果* @return int*/public function get_res(){return $this->res;}
}$sql1 = "select * from ecs_goods_info ";
$sql2 = "insert into ecs_goods_info (goods_name) values ('haha')";
$sql3 = "delete from ecs_goods_info where id=199";
$sql4 = "update ecs_goods_info set goods_name='金刚葫芦娃' where id=198";$db = new Db($sql1);
//$db = new Db($sql2);
//$db = new Db($sql3);
//$db = new Db($sql4);var_dump($db->get_res());

PHP+MySQL实现读写分离相关推荐

  1. mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询

    图/文:迷神 Thinkphp是一款不错的国产框架,使用范围广,应用也比较多.随着网站访问增大往往需要使用mysql主从同步功能,本身Thinkphp自带了主从读写分离的功能了. 但是我们经常有一个场 ...

  2. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  3. Centos7源码安装mysql及读写分离,互为主从

       Linux服务器 -源码安装mysql 及读写分离,互为主从   一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...

  4. MySQL Router实现MySQL的读写分离

    1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...

  5. mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离

    前言 在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈.幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上. ...

  6. mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    摘要:这篇MySQL栏目下的"详解如何利用amoeba(变形虫)实现mysql数据库读写分离",介绍的技术点是"MySQL数据库.数据库读写分离.amoeba.MySQL ...

  7. mysql proxy 主从_【MYSQL知识必知必会】MySQL主从复制读写分离(基于mysql-proxy实现)...

    MySQL主从复制读写分离(基于mysql-proxy实现) http://mirror.bit.edu.cn/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8. ...

  8. MySQL面试 - 读写分离

    MySQL面试 - 读写分离 面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 ...

  9. amoeba实现mysql主从读写分离_利用Amoeba实现MySQL主从复制和读写分离

    在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave) ...

  10. POWERDNS + LVS + LAMP + NFS + MYSQL主从读写分离

    文章目录 client 的配置 路由器的配置 powerdns 的搭建 firewall 的配置 LVS-DR 模式的配置 lvs服务器的配置 web服务器的配置 配置 mysql主从读写分离 MyS ...

最新文章

  1. [BZOJ2502]清理雪道 有上下界网络流(最小流)
  2. 服务器出口ip怎样修改,服务器出口ip设置
  3. 清理系统盘遇到的问题
  4. 请大家访问另一个我的博客!
  5. Centos7 单台服务器搭建Elasticsearch6.0.1集群
  6. 10_java之继承和抽象类
  7. leetcode 旋转图像
  8. plsql能连mysql吗_面试官:能给我讲讲用代码实现MySQL的读写分离的思路吗?
  9. Android JNI学习(六)——Java与Native实战演习
  10. linux添加了一条静态路由,为Linux新增静态路由的方法
  11. android开发之添加按钮事件的方法
  12. python数据结构-数组/列表/栈/队列及实现
  13. 用matlab仿真0到9十个数字的语音识别
  14. [debug] RuntimeError: CUDA error: no kernel image is available for execution on the device
  15. FTP文件上传并支持断点续传(一)—— win10 本地环境 ftp站点构建
  16. centreon与nagios整合
  17. 世界坐标和本地坐标之间的转换
  18. 【21天学习挑战赛】哪吒邀你参加Java研讨班
  19. sysbench 压力测试工具(实战)
  20. 程序员必备技能之Markdown

热门文章

  1. oracle instr函数 判断字段中是否有换行符
  2. 搜索(深度优先搜索与回溯) 经典例题题单+万字详解(C++)
  3. matlab边的介数,matlab-bgl-master 复杂网络工具包,便于计算 边介数,最短路径等问题 261万源代码下载- www.pudn.com...
  4. 第九届蓝桥杯省赛C/C++本科B组真题解析
  5. html怎么读取2进制视频,IE 中如何读取二进制文件的内容?
  6. 中input宽度_使用HOG对卫星图像中的船舶进行分类
  7. matlab连续时间系统复频域分析,实验五连续时间信号与系统的复频域分析的MATLAB实现.doc...
  8. 专业网站设计的实施步骤及有关疑难问题汇编
  9. php array函数 preg_match() 正则匹配
  10. linux 查看端口、进程情况及kill进程