为什么要读写分离?

一般的系统都是读多写少,利用读写分离,可以提升mysql的效率

读写分离后,从库可以水平扩展

下面我们开始代码之旅吧

配置先改造:

$config = [ 'host'=> '127.0.0.1', //数据库ip'port'=> 3306, //数据库端口'user'=> 'root', //数据库用户名'password'=> '123456', //数据库密码'database'=> 'test', //默认数据库名'timeout'=> 0.5, //数据库连接超时时间'charset'=> 'utf8mb4', //默认字符集'strict_type'=> true, //ture,会自动表数字转为int类型'pool_size'=> '3', //连接池大小'pool_get_timeout'=> 0.5, //当在此时间内未获得到一个连接,会立即返回。(表示所以的连接都已在使用中)];

改成:

$config = [ 'pool_size'=> '3', //连接池大小'pool_get_timeout'=> 0.5, //当在此时间内未获得到一个连接,会立即返回。(表示所以的连接都已在使用中)'master'=> [ 'host'=> '127.0.0.1', //数据库ip'port'=> 3306, //数据库端口'user'=> 'root', //数据库用户名'password'=> '123456', //数据库密码'database'=> 'test', //默认数据库名'timeout'=> 0.5, //数据库连接超时时间'charset'=> 'utf8mb4', //默认字符集'strict_type'=> true, //ture,会自动表数字转为int类型], 'slave'=> [

[ 'host'=> '127.0.0.1', //从数据库1ip'port'=> 3306, //从数据库1端口'user'=> 'root', //从数据库1用户名'password'=> '123456', //从数据库1密码'database'=> 'test', //默认数据库名'timeout'=> 0.5, //数据库连接超时时间'charset'=> 'utf8mb4', //默认字符集'strict_type'=> true, //ture,会自动表数字转为int类型],

[ 'host'=> '127.0.0.1', //从数据库2ip'port'=> 3306, //从数据库2端口'user'=> 'root', //从数据库2用户名'password'=> '123456', //数据库密码'database'=> 'test', //默认数据库名'timeout'=> 0.5, //数据库连接超时时间'charset'=> 'utf8mb4', //默认字符集'strict_type'=> true, //ture,会自动表数字转为int类型]

],

];

上面模拟的一主两从,由于我本机没有搭建mysql的主从,所以这里主从配置一样

由于我们要做到对上层业务无感知,所以我们只需要改动mydb.php这一层就行了

{ //创建主数据连接$master = newMySQL();

$res = $master->connect($config['master']); if($res === false) { //连接失败,抛弃常throw newRuntimeException($master->connect_error, $master->errno);

} else{ //存入master资源$this->master= $master;

} //创建从数据库连接foreach($config['slave'] as$conf) {

$slave = newMySQL();

$res = $slave->connect($conf); if($res === false) { //连接失败,抛弃常throw newRuntimeException($slave->connect_error, $slave->errno);

} else{ //存入slave资源$this->slave[] = $slave;

}

}

$this->config= $config; return$res;

} /***@param$type*@param$index*@returnMySQL*@desc单个数据库重连*/public functionreconnect($type, $index)

{ //通过type判断是主还是从if('master'== $type) { //创建主数据连接$master = newMySQL();

$res = $master->connect($this->config['master']); if($res === false) { //连接失败,抛弃常throw newRuntimeException($master->connect_error, $master->errno);

} else{ //更新主库连接$this->master= $master;

} return$this->master;

} //创建从数据连接$slave = newMySQL();

$res = $slave->connect($this->config['slave'][$index]); if($res === false) { //连接失败,抛弃常throw newRuntimeException($slave->connect_error, $slave->errno);

} else{ //更新对应的重库连接$this->slave[$index] = $slave;

} return$slave;

} /***@param$name*@param$arguments*@returnmixed*@desc利用__call,实现操作mysql,并能做断线重连等相关检测*/public function__call($name, $arguments)

{

$sql = $arguments[0];

$res = $this->chooseDb($sql); print_r($res);

$db = $res['db'];

$result = call_user_func_array([$db, $name], $arguments); if(false=== $result) { if(!$db->connected) { //断线重连echo"mysql reconnect". PHP_EOL;

$db = $this->reconnect($res['type'], $res['index']);

$result = call_user_func_array([$db, $name], $arguments); return$this->parseResult($result, $db);

} if(!empty($db->errno)) { //有错误码,则抛出弃常throw newRuntimeException($db->error, $db->errno);

}

} return$this->parseResult($result, $db);

} /***@param$result*@param$db MySQL*@returnarray*@desc格式化返回结果:查询:返回结果集,插入:返回新增id, 更新删除等操作:返回影响行数*/public functionparseResult($result, $db)

{ if($result === true) { return[ 'affected_rows'=> $db->affected_rows, 'insert_id'=> $db->insert_id,

];

} return$result;

} /***@param$sql*@desc根据sql语句,选择主还是从* @ 判断有select 则选择从库, insert, update, delete等选择主库*@returnarray*/protected functionchooseDb($sql)

{ //查询语句,随机选择一个从库if('select'== strtolower(substr($sql, 0, 6))) { if(1== count($this->slave)) {

$index = 0;

} else{

$index = array_rand($this->slave);

} return[ 'type'=> 'slave', 'index'=> $index, 'db'=> $this->slave[$index],

];

} return[ 'type'=> 'master', 'index'=> 0, 'db'=> $this->master];

}

}

connect的时候,我们自动把主,从所有的连接都建立好

执行sql的时候,我们跟据sql语句是否有select关键词,来判断选择主库还是从库

重连操作,只重连有问题的连接,不重连所有的连接

一个支持读写分离的mysql数据库接连池就OK了,是不是很简单的,大家完全可以在此基础上封装自己的CRUD等相关操作

我们在http server里增加 Insert的逻辑:

if($request->server['path_info'] == '/add') {

go(function() use($request, $response) { //从池子中获取一个实例try{

$pool = MysqlPool::getInstance(); echo"当前可用连接数:". $pool->getLength() . PHP_EOL;

$mysql = $pool->get(); echo"当前可用连接数:". $pool->getLength() . PHP_EOL;

defer(function() use($mysql) { //协程执行完成,归还$mysql到连接池MysqlPool::getInstance()->put($mysql); echo"当前可用连接数:". MysqlPool::getInstance()->getLength() . PHP_EOL;

});

$ct = time();

$title = $request->get['title'];

$result = $mysql->query("insert into test values(NULL, '{$title}', '{$ct}')");

$response->end(json_encode($result));

} catch(\Exception $e) {

$response->end($e->getMessage());

}

}); return;

}

访问:http://127.0.0.1:9501/add?title=测试

再访问: http://127.0.0.1:9501/list, 看看是否有最新的

抛个问题:

主从分离后,如果写入之后马上读,大概率会读不到?为什么?有什么方案解决?

swoole 连接mysql_swoole教程:用swoole4操作mysql连接池之读写分离相关推荐

  1. ipad怎样和计算机连接网络,ipad怎么连接电脑教程 ipad怎么和电脑连接【详细步骤】...

    在现下,苹果设备已经成了人人都喜欢的产品之一,然而ipad的问世更是对平板电脑的市场进行了一个完全大规模的开辟.对于已经玩了很久的果粉们来说,ipad的使用时一点问题都没有的,但是对于刚刚结束苹果设备 ...

  2. mysql主从复制中间件_linux下mysql主从复制(第二篇读写分离) mycat 中间件

    linux下mysql主从复制(第二篇读写分离) mycat 中间件 接着上篇文档补全,mysql 读写分离,在上篇文章案例下准备好Mycat-server-1.4-release-201510192 ...

  3. 数据库应用——Atlas代理MySQL集群实现读写分离

    Atlas代理MySQL集群实现读写分离 一.Atlas简介和架构 1.1 环境准备 1.2 配置时间服务器 二.主服务器配置 2.1 master节点1的配置 2.2 master节点2的配置 2. ...

  4. MySQL之——MSS主从复制(读写分离)实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52746393 前面,在博文<MySQL之--MS主从复制(读写分离)实现&g ...

  5. (含PPT)MySQL托管服务架构及读写分离的优化

    关注我们获得更多内容 内容来源:2017 年 08 月 24 日,微软中国首席产品经理宋青见在"ODF 2017开源数据库论坛(北京)"进行<云原生的MySQL托管服务架构及 ...

  6. mysql主从和mycat读写分离的安装及验证

    目录 一.背景介绍 二.安装mysql数据库(主从机器都需要先这样安装) 三.主从机配置 1.主服务器进行如下操作 2.从服务器进行如下操作 四.代理服务器安装和配置mycat读写分离 五.主从复制. ...

  7. MySQL 案例实战--MySQL 基于Mycat实现读写分离

    MySQL 基于Mycat实现读写分离 前言 一.什么是读写分离? 二.MySQL 读写分离解决方案 三.MySQL 基于Mycat实现读写分离 四.Mycat-web 管理部署 前言 本环境是基于 ...

  8. 【MySql】mysql之主从复制和读写分离搭建

    [MySql]mysql之主从复制和读写分离搭建 文章目录 [MySql]mysql之主从复制和读写分离搭建 1主从复制 1.1MySql支持从复制类型 1.2主从复制的原理 1.3主从复制的工作过程 ...

  9. MySQL数据库主从复制与读写分离(图文详解!)

    目录 前言 一:MySQL数据库主从复制与读写分离 1.什么是读写分离? 2.为什么要读写分离呢? 3.什么时候要读写分离? 4.主从复制与读写分离 5.mysql支持的复制类型 (1)STATEME ...

最新文章

  1. 《强化学习周刊》第40期:PMIC多智能体强化学习、Lazy-MDPs、CTDS
  2. 一个基于webrick 的简单web服务器
  3. android:clipToPadding和android:clipChildren
  4. 你知道CSS实现水平垂直居中的第10种方式吗?
  5. Eclipse安装SVN插件方式简明介绍
  6. 2005级计算机系本二班专业知识大赛
  7. body区域怎么传一个数组_自己轻松写一个jQuery库
  8. 空间说说秒赞java_人生靠反省,Java靠泛型
  9. 敏捷开发-srcum
  10. AI总监Karpathy亲自揭秘特斯拉纯视觉系统,还有自动驾驶超算Dojo原型
  11. python 获取内存使用率_获取一个python实例的总内存和cpu使用率
  12. 熊猫压缩怎么使用_记录随时间变化的PagerDuty事件(使用熊猫)
  13. 语句摘抄——第22周
  14. [1108]小米5S TWRP刷面具、EdXposed
  15. 计算机电脑照片大小,电脑上怎么调整照片kb
  16. python决策树案例_决策树案例:基于python的商品购买能力预测系统
  17. kindeditor4.1.10图片上传配置及使用说明
  18. MOJITO 发布一周,爬一波弹幕分析下
  19. Oracle的基本练习:登陆、查看连接、管理登陆用户、修改进程数
  20. AMOLED 显示面板 Mura 缺陷

热门文章

  1. 搞懂质数,质因子,互质,最大公约数,最小公倍数.
  2. html怎么下划波浪线,CSS3如何实现文字波浪线效果
  3. 企业wms系统安装在云服务器,wms 云服务器 还是本地
  4. spark常用RDD算子 - take(),takeOrdered(),top(),first()
  5. Python 十进制到六进制
  6. 以过来人经验---分享从学生--工程师之--怎么写好一份从事技术工作的简历及面试技巧(以嵌入式为例)(中)
  7. GIS定位和自定义图标
  8. AUTOSAR OS和OSEK OS
  9. 算法快学笔记(十三):狄克斯特拉(Dijkstra)算法原理与实现
  10. 新款 iMac2021上手体验,这次你心动了吗