yii2 + mysql主从复制,多数据库配合
概述
传统使用mysqldump方式每天定时备份,一是备份的时候整个数据库锁表,二是数据不安全性,有可能导致数据备份不及时而丢失数据。
mysql主从复制,就为解决此2个问题,同时更多的是带来性能和开发模式的改变,
压力有效分解到从服务器,具体怎么安装mysql 主从或者主主这里不描述,讲一个php(yii2)实践。
yii2安装主从:
参考文档:http://www.yiiframework.com/doc-2.0/guide-db-dao.html#read-write-splitting
修改项目目录下的config/main-local.php,
会覆盖common/main-local.php 的 db配置
'db'=>[
'class' => 'yii\db\Connection',
'charset' => 'utf8',
// configuration for the master
'dsn' => 'mysql:host=dbhost;dbname=test',
'username' => '',
'password' => '',
// common configuration for slaves
'slaveConfig' => [
'username' => '',
'password' => '',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
'charset' => 'utf8',
],
// list of slave configurations
'slaves' => [
['dsn' => 'mysql:host=dbhost;dbname=test'],
],
],
更改dsn和username、password,默认数据库读在slave服务器,写在master。
事务性读写都在master。
存在的问题:
主从默认的读写方式有时候会造成脏数据,比如从服务器同步延迟,读从服务器没有数据,一直向主服务器写入数据。最好的办法是制定是读master 还是slave。
在不适用主从这种读写方式,可以使用多数据库。
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=;dbname=',
'username' => '',
'password' => '',
'charset' => 'utf8',
],
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=;dbname=',
'username' => '',
'password' => '',
'charset' => 'utf8',
],
这个方式更为灵活,配合主从数据库混合使用
$db = Yii::$app->db;
$db2 = Yii::$app->db2;