开发框架 \ Yii \ MySQL主从复制读写分离与Yii2实现

MySQL主从复制读写分离与Yii2实现

总点击59
简介:实现方式 首先说明这种方式一般分为两种: 1.采用代码形式,就是在代码中判断我是否要进行查询还是更新或增加,对应的去不同服务器的从库或主库进行操作

实现方式

首先说明这种方式一般分为两种:

1.采用代码形式,就是在代码中判断我是否要进行查询还是更新或增加,对应的去不同服务器的从库或主库进行操作

2.使用MySQL proxy 来进行这样可以不用从代码来直接区分是增删改查的语句,直接去MySQL proxy去执行操作,然后MySQL proxy回去对应的主库或者从库执行操作。一般称这样的方式为中间件,除了有MySQL proxy之外还有HAproxy(付费)等。


这两种方式各有其适用的场景,不能片面的指出那种方式比较好,只能是根据自己的业务需求去决定。


关于 MySQL的主从复制的配置以及MySQL proxy的配置

在以下这篇文章当中会详细讲到:

http://www.cnblogs.com/DavidYan/articles/2531181.html

或者可以参考这个

http://www.jianshu.com/p/8528072cba9a 

接下来我们要说的是在Yii2中是如何实现这个代码层级的读写分离.


Yii2中主从复制和读写分离

这里主要围绕最新的Yii2英文文档中的一小节“主从复制与读写分离”展开进行介绍。为什么是英文文档?目前中文翻译的文档不是最新的。

首先我们需要在 web.php中配置一下在component(组件)数组中按照下文进行配置,或者是直接覆盖到config文件夹当中的db.php文件。

[

'class' => 'yiidbConnection',

// configuration for the master

//dsn=>’mysql:host=localhost;dbname=xxx’

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

'username' => 'master',

'password' => '',

// common configuration for slaves

'slaveConfig' => [

'username' => 'slave',

'attributes' => [

// use a smaller connection timeout

PDO::ATTR_TIMEOUT => 10,

],

// list of slave configurations

'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'],

]


这个配置项都比较清楚,没有太难的点去解释slaves 的每个dsn分别对应的是每个从库的地址。

     在这里需要注意的是通过yiidbCommand::execute()都会被当做写操作,也就意味着这样的命令会在主库中执行。你也许会createCommand(’select * from users’)->excute(),这样执行但是这样的语句都会在主库中执行。在其他所有的情况下,包含查询的语句会在从库中进行查询。Yii2在支持负载均衡以及故障转移。当第一次执行查询时,连接组件随机选取一个从库去连接它,如果失败则连接下一个从库,直到没有一个从库可用才会去连接主库。在上述的配置文件中的一项PDO::ATTR_TIMEOUT的值对于每一个从库都生效。

其他:

我们有可能需要从主库读取数据:

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


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


});

我们也可以通过Yii::$app->db->slave获取当前连接并可用的从库。


结语

本文总结了一下MySQL的读写分离以及如何在Yii2中的实现,Yii2也提供了多主多从的配置方案,在这里不做赘述有兴趣的可以http://www.yiiframework.com/doc-2.0/guide-db-dao.html 查照Replication and Read-Write Splitting这一节。如果有什么意见或者建议欢迎提出。


0人推荐

推荐文章

热门标签

意见反馈 常见问题 官方微信 返回顶部