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

实现方式
首先说明这种方式一般分为两种:
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' => 'yii\db\Connection',
 
    // 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',
        'password' => '',
        '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分别对应的是每个从库的地址。
     在这里需要注意的是通过yii\db\Command::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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值