实现方式


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


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


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


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



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

可以参考这个


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分别对应的是每个从库的地址。


去连接主库。在上述的配置文件中的一项 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这一节。如果有什么意见或者建议欢迎提出。