yii2 mysql in_yii2 mysql数据库读写分离配置

复制和读写分离(Replication and Read-Write Splitting)

许多数据库支持数据库复制来获得更好的数据库可用性, 以及更快的服务器响应时间。通过数据库复制功能, 数据从所谓的主服务器被复制到从服务器。所有的写和更新必须发生在主服务器上, 而读可以发生在从服务器上。

为了利用数据库复制并且完成读写分离, 你可以按照下面的方法来配置 yii\db\Connection 组件:

[

'class' => 'yii\db\Connection',

// 主库的配置

'dsn' => 'dsn for master server',

'username' => 'master',

'password' => '',

// 从库的通用配置

'slaveConfig' => [

'username' => 'slave',

'password' => '',

'attributes' => [

// 使用一个更小的连接超时

PDO::ATTR_TIMEOUT => 10,

],

],

// 从库的配置列表

'slaves' => [

['dsn' => 'dsn for slave server 1'],

['dsn' => 'dsn for slave server 2'],

['dsn' => 'dsn for slave server 3'],

['dsn' => 'dsn for slave server 4'],

],

]

上述的配置指定了一主多从的设置。 这些从库其中之一将被建立起连接并执行读操作,而主库将被用来执行写操作。 这样的读写分离将通过上述配置自动地完成。比如,

// 使用上述配置来创建一个 Connection 实例

Yii::$app->db = Yii::createObject($config);

// 在从库中的一个上执行语句

$rows = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

// 在主库上执行语句

Yii::$app->db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();

信息: 通过调用 yii\db\Command::execute() 来执行的语句都被视为写操作, 而其他所有通过调用 yii\db\Command 中任一 "query" 方法来执行的语句都被视为读操作。 你可以通过 Yii::$app->db->slave 来获取当前有效的从库连接。

Connection 组件支持从库间的负载均衡和失效备援, 当第一次执行读操作时,Connection 组件将随机地挑选出一个从库并尝试与之建立连接, 如果这个从库被发现为”挂掉的“,将尝试连接另一个从库。 如果没有一个从库是连接得上的,那么将试着连接到主库上。 通过配置 server status cache, 一个“挂掉的”服务器将会被记住,因此,在一个 yii\db\Connection::serverRetryInterval 内将不再试着连接该服务器。

信息: 在上面的配置中, 每个从库都共同地指定了 10 秒的连接超时时间,这意味着,如果一个从库在 10 秒内不能被连接上,它将被视为“挂掉的”。 你可以根据你的实际环境来调整该参数。

你也可以配置多主多从。例如,

[

'class' => 'yii\db\Connection',

// 主库通用的配置

'masterConfig' => [

'username' => 'master',

'password' => '',

'attributes' => [

// use a smaller connection timeout

PDO::ATTR_TIMEOUT => 10,

],

],

// 主库配置列表

'masters' => [

['dsn' => 'dsn for master server 1'],

['dsn' => 'dsn for master server 2'],

],

// 从库的通用配置

'slaveConfig' => [

'username' => 'slave',

'password' => '',

'attributes' => [

// use a smaller connection timeout

PDO::ATTR_TIMEOUT => 10,

],

],

// 从库配置列表

'slaves' => [

['dsn' => 'dsn for slave server 1'],

['dsn' => 'dsn for slave server 2'],

['dsn' => 'dsn for slave server 3'],

['dsn' => 'dsn for slave server 4'],

],

]

上述配置指定了两个主库和两个从库。 Connection 组件在主库之间,也支持如从库间般的负载均衡和失效备援。 唯一的差别是,如果没有主库可用,将抛出一个异常。

注意: 当你使用 masters 属性来配置一个或多个主库时, 所有其他指定数据库连接的属性 (例如 dsn, username, password) 与 Connection 对象本身将被忽略。

默认情况下,事务使用主库连接, 一个事务内,所有的数据库操作都将使用主库连接,例如,

$db = Yii::$app->db;

// 在主库上启动事务

$transaction = $db->beginTransaction();

try {

// 两个语句都是在主库上执行的

$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();

$transaction->commit();

} catch(\Exception $e) {

$transaction->rollBack();

throw $e;

} catch(\Throwable $e) {

$transaction->rollBack();

throw $e;

}

如果你想在从库上开启事务,你应该明确地像下面这样做:

$transaction = Yii::$app->db->slave->beginTransaction();

有时,你或许想要强制使用主库来执行读查询。 这可以通过 useMaster() 方法来完成:

$rows = Yii::$app->db->useMaster(function($db){

return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

});

你也可以明确地将 Yii::$app->db->enableSlaves 设置为 false 来将所有的读操作指向主库连接。

操纵数据库模式(Working with Database Schema)

Yii DAO 提供了一套完整的方法来让你操纵数据库模式, 如创建表、从表中删除一列,等等。这些方法罗列如下:

这些方法可以如下地使用:

// CREATE TABLE

Yii::$app->db->createCommand()->createTable('post', [

'id' => 'pk',

'title' => 'string',

'text' => 'text',

]);

上面的数组描述要创建的列的名称和类型。 对于列的类型, Yii 提供了一套抽象数据类型来允许你定义出数据库无关的模式。 这些将根据表所在数据库的种类,被转换为特定的类型定义。 请参考 createTable()-method 的 API 文档来获取更多信息。

除了改变数据库模式, 你也可以通过 DB Connection 的 getTableSchema() 方法来检索某张表的定义信息。例如,

$table = Yii::$app->db->getTableSchema('post');

该方法返回一个 yii\db\TableSchema 对象, 它包含了表中的列、主键、外键,等等的信息。 所有的这些信息主要被 query builder 和 active record 所使用,来帮助你写出数据库无关的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想提升微服务容错性?试试这5种模式

作者 | Igor Perikov译者 | 陆离责编 | 徐威龙出品 | CSDN云计算(ID:CSDNcloud) 在本文中,我将介绍微服务中的几种容错机制及其实现的方法。如果你在维基百科上查找“容错性”,你将会发现有如下的定义:“容…

21世纪了还愚公移山?数据库这么迁移更稳定!

背景 在系统的快速迭代过程中,业务系统往往部署在同一个物理库,没有做核心数据和非核心数据的物理隔离。随着数据量的扩大这种情况会带来稳定性的风险,如库的慢sql,磁盘,IO等等都会相互整体影响,从而影响核…

Oracle 创建表空间、用户、权限_(plsql)

背景:企业内部oracle数据库日常oracle表空间、用户、权限操作 文章目录1. 使用dba用户登录plsql2. 创建表空间3. 创建用户4. 赋予用户权限5. 验证6. 完整脚本1. 使用dba用户登录plsql 2. 创建表空间 -- 创建表空间设置表空间大小 CREATE TABLESPACE fisknow DATAFI…

mysql union left join_Case:MySQL使用left join的时候or改写成union可以提高效率

(1)优化前:使用or的时候,SQL执行时间1.47smysql> select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_nod.emp_no where e.emp_no32000 or d.from_date1996-11-24;58 rows in set (1.47 …

2019五个最棒的机器学习课程

凭借强大的统计学基础,机器学习正在成为最有趣,节奏最快的计算机科学领域之一,目前已经有无穷无尽的行业和应用正在使用机器学习使它们更高效和智能。 聊天机器人、垃圾邮件过滤、广告投放、搜索引擎和欺诈检测是机器学习模型正在实际应用于…

“天河二号”总工程师杜云飞谈星光超算应用平台设计

整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】12 月 21-22 日,OpenI/O 启智开发者大会在深圳召开。在大会上, 国家超级计算广州中心总工程师、“天河二号”总工程师杜云飞发表了题为《星光超算应用平台》的主题报告&…

蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库

什么是 SOFAJRaft? SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。 使用 SOFAJRaft 你可以专注于自己的业务领域,由 SOFAJRaft 负责处理所有与 Raft 相关的技…

如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...

如果需要在查询语句返回的列中包括一列以指示整个结果集中记录的行号,则ISO SQL: 2003标准建议的方法是提供ROW_NUMBER()/ RANK()函数. Oracle可以使用标准方法(版本8i或更高版本)或非标准ROWNUM. MS SQL Server在2005版中提供了ROW_NUMBER()函数. 但是在MySQL中似乎…

Sublime Text 3 快捷键总结(简洁版本)

文章目录选择类快捷键说明CtrlAlt↑向上添加多行光标,可同时编辑多行CtrlAlt↓向下添加多行光标,可同时编辑多行CtrlD向下添加多行光标,可同时编辑多行选中光标所占的文本,继续操作则会选中下一个相同的文本AltF3选中文本按下快捷…

开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!

2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 活动核心亮点:…

疫情严重,潜伏期也有传染性?科技公司在行动

整理 | 阿司匹林出品 | CSDN云计算新型冠状病毒的感染人数仍在不断增加。根据1月26日的最新数据,全国新型冠状病毒感染的肺炎确诊2005例,疑似2684例,死亡56例。据央视报道,国家卫生健康委员会主任马晓伟在国新办新闻发布会上表示&…

Sublime Text 3 快捷键总结(详细版本)

选择类CtrlD 选中光标所占的文本,继续操作则会选中下一个相同的文本。AltF3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。CtrlL 选中整行,继续操作则继续…

python方法定义..._解析Python类中的方法定义

最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客、文章研究到底是怎么一回事。因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论。对于Python类中,方法的定义…

阿里巴巴复杂搜索系统的可靠性优化之路

背景 搜索引擎是电商平台成交链路的核心环节,搜索引擎的高可用直接影响成交效率。闲鱼搜索引擎作为闲鱼关键系统,复杂度和系统体量都非常高,再加上闲鱼所有导购场景都依靠搜索赋能,搜索服务的稳定可靠成为了闲鱼大部分业务场景可…

Kubernetes 将何去何从?

戳蓝字“CSDN云计算”关注我们哦!作者 | Kevin Casey译者 | 弯月责编 | 唐小引封图 | CSDN 付费自图虫创意出品 | CSDN 云计算(ID:CSDNcloud)【导读】随着越来越多的人开始使用 Kubernetes,IT 领导者对新的一年有哪些期…

活体检测很复杂?仅使用opencv就能实现!(附源码)

什么是活体检测,为什么需要它? 随着时代的发展,人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等,人脸识别系统正在各行各业得到应用。然而,人脸识别系…

SQL中where 1 = 1的用处

文章目录1. where 1 <> 12. where 1 13. 不用where 11 在多条件查询中的困扰1. where 1 <> 1 where 1 1;--永远为真 where 1 <> 1&#xff0c;--永远为假他俩的作用主要是一个条件永远为真&#xff0c;一个永远为假&#xff0c;所以这里只是说 1 1的情况&…

stm32g474教程_杜洋老师:STM32教程,STM32视频教程

单片机也叫做单片微型计算机&#xff0c;简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件&#xff0c;是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器…

Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS&#xff0c;这种部署方式的目的是可以让一个应用的多个pod&#xff08;至少两个&#xff09;能够分布在不同的可用区&#xff0c;起码不能分布在同一个可用区&#xff0c;已达到高可用或者同…

揭秘:蚂蚁金服bPaaS究竟是什么?

去年9月&#xff0c;蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS&#xff08; Business Platform As a Service &#xff09;&#xff0c;对外开放自身沉淀的“产品合约”、“资产交换”、“资产核心”、“会计核算”、“计价” 等金融核心组件&#xff0c;而这款号称…