实现方式
首先说明这种方式一般分为两种:
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这一节。如果有什么意见或者建议欢迎提出。