PHP+MySQL实现读写分离
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实现读写分离相关推荐
- mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询
图/文:迷神 Thinkphp是一款不错的国产框架,使用范围广,应用也比较多.随着网站访问增大往往需要使用mysql主从同步功能,本身Thinkphp自带了主从读写分离的功能了. 但是我们经常有一个场 ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- Centos7源码安装mysql及读写分离,互为主从
Linux服务器 -源码安装mysql 及读写分离,互为主从 一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...
- MySQL Router实现MySQL的读写分离
1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...
- mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离
前言 在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈.幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上. ...
- mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离
摘要:这篇MySQL栏目下的"详解如何利用amoeba(变形虫)实现mysql数据库读写分离",介绍的技术点是"MySQL数据库.数据库读写分离.amoeba.MySQL ...
- mysql proxy 主从_【MYSQL知识必知必会】MySQL主从复制读写分离(基于mysql-proxy实现)...
MySQL主从复制读写分离(基于mysql-proxy实现) http://mirror.bit.edu.cn/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8. ...
- MySQL面试 - 读写分离
MySQL面试 - 读写分离 面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 ...
- amoeba实现mysql主从读写分离_利用Amoeba实现MySQL主从复制和读写分离
在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave) ...
- POWERDNS + LVS + LAMP + NFS + MYSQL主从读写分离
文章目录 client 的配置 路由器的配置 powerdns 的搭建 firewall 的配置 LVS-DR 模式的配置 lvs服务器的配置 web服务器的配置 配置 mysql主从读写分离 MyS ...
最新文章
- [BZOJ2502]清理雪道 有上下界网络流(最小流)
- 服务器出口ip怎样修改,服务器出口ip设置
- 清理系统盘遇到的问题
- 请大家访问另一个我的博客!
- Centos7 单台服务器搭建Elasticsearch6.0.1集群
- 10_java之继承和抽象类
- leetcode 旋转图像
- plsql能连mysql吗_面试官:能给我讲讲用代码实现MySQL的读写分离的思路吗?
- Android JNI学习(六)——Java与Native实战演习
- linux添加了一条静态路由,为Linux新增静态路由的方法
- android开发之添加按钮事件的方法
- python数据结构-数组/列表/栈/队列及实现
- 用matlab仿真0到9十个数字的语音识别
- [debug] RuntimeError: CUDA error: no kernel image is available for execution on the device
- FTP文件上传并支持断点续传(一)—— win10 本地环境 ftp站点构建
- centreon与nagios整合
- 世界坐标和本地坐标之间的转换
- 【21天学习挑战赛】哪吒邀你参加Java研讨班
- sysbench 压力测试工具(实战)
- 程序员必备技能之Markdown
热门文章
- oracle instr函数 判断字段中是否有换行符
- 搜索(深度优先搜索与回溯) 经典例题题单+万字详解(C++)
- matlab边的介数,matlab-bgl-master 复杂网络工具包,便于计算 边介数,最短路径等问题 261万源代码下载- www.pudn.com...
- 第九届蓝桥杯省赛C/C++本科B组真题解析
- html怎么读取2进制视频,IE 中如何读取二进制文件的内容?
- 中input宽度_使用HOG对卫星图像中的船舶进行分类
- matlab连续时间系统复频域分析,实验五连续时间信号与系统的复频域分析的MATLAB实现.doc...
- 专业网站设计的实施步骤及有关疑难问题汇编
- php array函数 preg_match() 正则匹配
- linux 查看端口、进程情况及kill进程