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";
8 $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读写分离(PHP类)
mysql读写分离(PHP类) 博客分类: php mysql 自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...
- amoeba实现MySQL读写分离
amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...
- PHP代码实现MySQL读写分离
关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...
- 转:Mysql读写分离实现的三种方式
1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自 ...
- 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置
参考博文: MySQL-(Master-Slave)配置 本人按照博友北在北方的配置已成功 我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...
- MySQL读写分离技术
1.简介 当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式数据库.负载均衡.读写分离.增加缓存服务器等等.这里我们将采用读写分 ...
- [记录]MySQL读写分离(Atlas和MySQL-proxy)
MySQL读写分离(Atlas和MySQL-proxy) 一.阿里云使用Atlas从外网访问MySQL(RDS) (同样的方式修改配置文件可以实现代理也可以实现读写分离,具体看使用场景) 1.在跳板机 ...
- docker环境 mysql读写分离 mycat maxscale
#mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...
- mysql读写分离总结
随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状.读写分离现在被大量应用于很多大型网站,这个技 ...
随机推荐
- Spring Cloud Eureka服务Demo级搭建
仅用于个人备忘,有错误之处还请文明指出,3Q 开发环境以及工具:Windows.JDK8.STS 1.新建SpringBoot工程作为Eureka Server ...
- windows10版本1709 在桌面和文件中点击右键,会引起卡顿
windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win+R regedit 路径:可直接复制后粘贴+回车 HKEY_CLASS ...
- tensorflow MNIST新手教程
官方教程代码如下: import gzip import os import tempfile import numpy from six.moves import urllib from six.m ...
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...
- 经典面试题目——250M内存处理10G大小的log文件
前言 周末逛知乎的时候,看到的一个经典面试题目:http://www.zhihu.com/question/26435483.非常经典的一道分而治之的题目. 题目描写叙述例如以下: 有次面试遇到一个问 ...
- kotlin web开发教程【一】从零搭建kotlin与spring boot开发环境
IDEA中文输入法的智能提示框不会跟随光标的问题 我用的开发工具是IDEA 这个版本的IDEA有一个问题: 就是中文输入法的智能提示框不会跟随光标 解决这个问题的办法很简单,只有在安装目录下把JRE文 ...
- 沉迷 Docker,无法自拔(在 Docker 中运行 MySQL)
记得之前做网站开发的时候,因为服务端用的 MySQL 数据库,为了方便调试以及隔离生产与开发环境,自己就在本地也安装了一个 MySQL 数据库.但是用着用着慢慢的也发现了一些不舒服的地方,比如常驻后台 ...
- 十六、Spring Boot 部署与服务配置
spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat).当然你也可以将项 ...
- linux 磁盘管理三部曲——(3)mount挂载,/etc/fstab配置文件
当我们分完区,并做好文件系统格式化,就到了最后的挂载mount了,挂载完毕就可以使用磁盘设备了. 一.什么是挂载,卸载 任何块设备都不能直接访问,需挂载在目录上访问 挂载: 将额外文件系统与根文件系统 ...
- 《TCP-IP详解卷2:实现》【PDF】下载
<TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...