phalapi-进阶篇5(数据库读写分离以及多库使用)

前言

先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架.

读写分离是我们常用的一种解决方案,它可以解决大量读操作的时候数据库瓶颈的问题,我们在真正开发一个项目的过程中可能会遇一个接口或者一个操作中需要用到多个数据库操作的时候怎么办,今天的教程就从这个两个问题出来,来聊聊使用phalapi怎么解决这个问题.

附上:

1. 读写分离

在我们的生活中无时无刻不面临着并发的问题,比如下班高峰交通问题,人们用了红绿灯来解决的一部分问题(但是很痛苦这个就和查询的时候阻塞一样的,10秒做update操作,10秒做select操作一样的),那么人们有想到了一个方法高架,高架的路线是和正常的路线一致的(数据相同) ,高架分两条路而且一条路上的车不能到另外一条路上(读写分离) 这样就解决了我们这类常规并发的问题

其实看起来上面这种解决方案是比较好的其实并不是这样的,有两条路但是其实它的宽度是不一样的,我们这里把一个叫做写路,一个叫做读路,我们如果要做一个读路并且把他成倍的变宽是一件很简单的事情(也就是多从库),但是我们要建立一条写路可以,但是我们要把这条写路变宽是比较困难的,我们一般不这样做.

1.1 mysql主从配置

我是使用了阿里云的多读库服务,这里引用一下百度经验的mysql主从处理

----------------------------------------------------------------------------------------------------

MYSQL【一台主机多个实例的主从配置】

1、建立账号

进入mysql数据库,创建一个用于从库备份的账号

mysql>GRANT REPLICATION SLAVE ON *.* TO 'slave_test'@'10.19.194.57' IDENTIFIED BY 'Password@123456';

mysql>FLUSH PRIVILEGES; ---刷新

该命令详情参考grant创建用户命令

2、如果已经有一个实例在运行(因为开始已经安装了mysql,所以有一个默认的),那么再启动一个实例,方法如下:

(1)shell>cd /usr/local/mysql/

(2)shell>mkdir -pv /data/mysql2

(3)shell>chown -R mysql.mysql /data/mysql2

(4)shell>./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2 这个为另外一个目录,该步骤意味初始化目录,并创建一个实例

3、配置/etc/my.cnf,配置方法如下

[mysqld_multi]

mysqld = /usr/local/mysql/bin/mysqld_safe

mysqladmin = /usr/local/mysql/bin/mysqladmin

user = root

[mysqld] ## 本来mysql配置

server-id = 1

port = 3306

socket = /data/mysql/mysql.sock

datadir = /data/mysql

pid-file = /data/mysql/wzj.pid

log-error = /data/mysql/wzj.err

log-bin = /data/mysql/log/bin-log

log-bin-index = /data/mysql/log/mysql-bin.index

user = mysql

[mysqld2] ##创建实例配置

server-id = 2

port = 3307

socket = /tmp/mysql2.sock

datadir = /data/mysql2/ //mysql2存储数据库的地方,也就是实例

pid-file = /data/mysql2/mysql2.pid //mysql2的pid文件记录

log-error = /data/mysql2/mysql2.err //为错误日记文件的地方

user = mysql

#master-host =10.19.194.57

#master-user ='wzj_slave_test'

#master-pass ='Password@123456'

#master-port =3306

#master_connect_retry=60

#replicate-do-db =mysql_wzj

#replicate-ignore-db=mysql--------该段已注释,因为新版本中,需要用CHANGE MASTER TO 命令去设置

【注意】:以上文件的目录,皆为系统创建,并非手动去创建,设置配置文件后,重启mysql,文件就会自动创建

4、重启,然后可以使用msyql_multi命令启动实例,再查看一下master主库的状态,其中Binlog_Do_DB表示要备份的数据库,Binlog_Ignore_DB表示不备份的数据库

shell>/etc/rc.d/init.d/mysqld start/stop/restart

shell>/usr/local/mysql/bin/mysqld_multi start 1-2 启动实例 (1-2表示启动1、2两个实例)

shell>mysql master: mysql -P 3306 -u root -p -S /data/mysql/mysql.sock (密码:1)

mysql>show master status; or show master status \G; 显示主库的状态,其中File 和Position 数值要记住,下面的mysql语句要用到,用于设置从库

5、进入从库,并设置从库的一些参数

shell>slave:mysql -P 3307 -u root -p -S /tmp/mysql2.sock (密码:回车) ---另外开个远程

mysql>CHANGE MASTER TO

mysql> MASTER_HOST='10.19.194.57', ---主库的地址

mysql>MASTER_USER='wzj_slave_test', ---主库用户

mysql>MASTER_PASSWORD='Password@123456', ---主库的密码

mysql>MASTER_LOG_FILE='bin-log.000013' , ---此参数为master status中的File值

mysql>MASTER_LOG_POS=120; ---此数值为Position数值

6、设置好后,运行start slave,如果下图红线地方是YES,则成功,否则,查看配置文件是否有错或有误。

slave_io_running :yes

slave_sql_running :yes

7、可以查看从库下mysql进程信息

mysql>show processlist;

8、测试

在主库上面建新的数据库,然后在从库中查看是否有同步~

----------------------------------------------------------------------------------------------------

1.2 开始实现

思想我们已经讲完了相信大家已经多多少少的理解了,但是我们要如何在phalapi去实现读写分离的操作

1.首先我们要在初始化一个数据库连接,我们需要建立一个配置文件read.php和dbs.php一样只是连接这读库的配置项,并且注册

//读库

DI()->read = function (){

$debug = !empty($_GET['__sql__']) ? true : false;

return new PhalApi_DB_NotORM(DI()->config->get('read'), $debug);

};

2.对PhalApi_Model_NotORM文件中的getORM进行修改

/**

* 快速获取ORM实例,注意每次获取都是新的实例

*/

protected function getORM($id = NULL){

$table = $this->getTableName($id);

if($id == 'read'){

return DI()->read->$table;

}

return DI()->notorm->$table;

}

3.当我们在model层使用$this->getORM('read') 的时候就会使用读库,使用$this->getORM() 会默认使用写库

//select操作

$this->getORM('read')->select('*')->where('aId', $aId)->fetchAll();

//insert,update,delete操作

$this->getORM()->insert();

2. 多库处理

有些人会问,为什么需要进行多库处理,所有的表放到一个库不就好了吗?

在原来重构别人外包项目是遇到过一个库100来张表,没有备注没有文档,几乎没法看,在我自己做一个比较大的项目的时候我也是做了一些考虑把库根据业务分解成一个一个子库,可以很好的避免表太多结构混乱的问题,而且我们可以随时把任何一个子库移植出去,当我一个mysql承载了很多压力,我可以把这个mysql上面的子库分解到多个mysql上面来实现压力分流.

看了上面的这一段介绍相信大家不言而喻的了解了这样做的好处,但是如何实现呢,聪明的大家可能在想不久和上面一样在多注册一个数据库连接嘛,其实大家说对了一半,我们是需要注册一个连接,但是我们需要一种统一的规范来使用这类操作

1.初始化数据库连接,一样的复制一份dbs.php为developers.php配置连接开发者库

//开发者库

DI()->developers = function (){

$debug = !empty($_GET['__sql__']) ? true : false;

return new PhalApi_DB_NotORM(DI()->config->get('developers'), $debug);

};

2.对PhalApi_Model_NotORM文件中的getORM进行修改

/**

* 快速获取ORM实例,注意每次获取都是新的实例

*/

protected function getORM($id = NULL){

$table = $this->getTableName($id);

if($id == 'developers'){

return DI()->developers->$table;

}

return DI()->notorm->$table;

}

3.在之前我们不是建立了我们的公用General文件我们在构建这样的结构

--General //公用目录

--developers //通用项目库目录

--Domain //项目库Domain层

--Model //项目库Model层

然后我们在这里的Model进行的操作都是使用$this->getORM('developers')进行操作

这样规范的好处就是在与共享和模块化 让正常的一个Model层不会使用到任何不同库的操作,我们多个项目用到其他的一个库可以进行代码复用,

3. 总结

其实实现今天介绍的两种解决问题的方案还有很多很多,不同的业务可能需求不同实现也就不一样希望今天的介绍对大家有帮助,后面两篇教程将基于我写的两个拓展分别介绍分表分库操作和redis实际的使用,希望大家进一步关注!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

官网QQ交流群:421032344 欢迎大家的加入!

phalapi 数据库锁_[7.11]-phalapi-进阶篇5(数据库读写分离) | PhalApi(π框架) - PHP轻量级开源接口框架...相关推荐

  1. php调用好单库api视频教程,[8.1]-PhalApi视频教程 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    [8.1] PhalApi视频教程 先在这里感谢以下录制小组的同学,是你们让世界看到PhalApi的视频教程! A西瓜妹子.听风不语.彩色的雨.Catch.喵了个咪.dogstar PhalApi教程 ...

  2. phalapi可以依赖注入么_[7.8]-phalapi-进阶篇2(DI依赖注入和单例模式) | PhalApi(π框架) - PHP轻量级开源接口框架...

    phalapi-进阶篇2(DI依赖注入和单例模式) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 离上一次更新过去了快两周,在其中编写了一个关于DB ...

  3. php api 无符号整数基数为16的整数参数的字符串表示形式,[1.12]-参数规则:接口参数规则配置 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    "播下一种思想,收获一种行为:播下一种行为,收获一种习惯:播下一种习惯,收获一种性格:播下一种性格,收获一种命运." --<成君忆:水煮三国> 1.12.1 参数解析 ...

  4. php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    1.23.1 请求 把我们后台的API想象成一个函数,那么请求的参数就是我们的参数列表:而接口响应的数据则对应函数返回的结果. 对于请求,正如前面所看到的,我们可以使用$_GET,也可以使用$_POS ...

  5. php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    3.3.1 扩展类库:基于PHPMailer的邮件发送 此扩展可用于发送邮件. 3.3.2 安装和配置 从 PhalApi-Library 扩展库中下载获取 PHPMailer 包,如使用: $ gi ...

  6. 轻量级PHP接口框架PhalApi开源接口框架 v2.17.1源码

    简介: PhalApi简称π框架(派框架),一个轻量级PHP开源接口框架,配套运营管理平台,专注于接口服务开发,支持HTTP/SOAP/RPC协议,拥有自动生成的在线文档.多种开发语言的客户端SDK包 ...

  7. 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表

    如何最大限度的使用数据库性能,全网最细节讲解缓存方案 视频讲解如下,点击观看: 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表|c/c ...

  8. mysql降低数据库版本_三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQ...

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 前思后想仍觉得实战数据库版本的降迁一文中的方式不仅老土而且低效,故有了下文三步搞定数据库从MSSQL2008R2 高版 ...

  9. python展示数据库视图_在Django的视图中使用数据库查询的方法

    在视图中也有笨方法可以从数据库中获取数据. 很简单: 用现有的任何 Python 类库执行一条 SQL 查询并对结果进行一些处理. 在本例的视图中,我们使用了 MySQLdb 类库(可以从 http: ...

最新文章

  1. 最新!NLG顶会INLG2021最佳长论文出炉!一作华人学生代表出席今晚INLG
  2. leangoo scrum看板工具轻量协作OKR目标管理
  3. 全球30篇最热门的计算机视觉和深度学习论文
  4. 太白教你学python---博客分类目录
  5. 从外包月薪5K到阿里月薪15K,原理+实战+视频+源码
  6. Windows下SVN回滚到旧版本(TortoiseSVN)
  7. 给自己的网址加上https,添加ssl证书(springboot项目)
  8. 【Java并发编程】之十一:线程间通信中notify通知的遗漏
  9. 当SEO/SEM与良知正面碰撞
  10. DP之石子堆合并问题
  11. 自然科学与军事技术史
  12. Linux C聊天室的实现
  13. matlab中matconvnet,MATLAB2017a编译MatConvNet过程中出现的各种问题
  14. 第一个node.js应用
  15. 关于BGA芯片布局时要注意的要点
  16. chrome最新版总是自动清掉保存的密码
  17. java输出美国的时间_java显示当前美国洛杉矶时间
  18. 吴恩达 tensorflow
  19. 正在踏上正轨--新手菜鸟的前进之路
  20. 热成像测温的原理是什么呢?你知道吗?

热门文章

  1. Jenkins 流水线 获取git 分支列表_持续集成工具Jenkins看这篇就够啦!
  2. linux异构内存,Linux内核添加异构内存管理(HMM)将带来加速GPU的新方式,还有可能带来其他类型的机器学习硬件。...
  3. interop.cdo 发送邮件乱码_手把手教你用 Java 发送邮件,不用框架
  4. 蓝桥杯每日真题之货物摆放
  5. keras系列︱keras是如何指定显卡且限制显存用量(GPU/CPU使用)
  6. BookCorpus数据集爬虫
  7. 11月22日云栖精选夜读 | 送你一份Spring Boot 知识清单
  8. 人人都会设计模式---代理模式--Proxy
  9. ssh开发所需要的架包
  10. 活着,总有你看不惯的人,也有看不惯你的人.