复制和读写分离
在本节中,我们将学习如何复制和读写分离。我们将会看到slave和master服务器如何帮助我们做到这些。
准备
- 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
- 设置数据库连接并创建一个名叫
post
的表:
DROP TABLE IF EXISTS 'blog_post';
CREATE TABLE IF NOT EXISTS 'blog_post' (
'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
'title' VARCHAR(255) NOT NULL,
'text' TEXT NOT NULL,
'created_at' INTEGER,
'modified_at'INTEGER,
PRIMARY KEY ('id')
);
- 为表
blog_post
创建BlogPost
模型。 - 按照文章https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-inmysql/中的描述,在你的数据库服务器之间,配置主从复制。
- 在
config/main.php
中配置db
组件,下面是个例子:
'components' => [
// ..
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=4.4.4.4;dbname=masterdb',
'username' => 'master',
'password' => 'pass',
'charset' => 'utf8',
'slaveConfig' => [
'username' => 'slave',
'password' => 'pass',
],
// list of slave configurations
'slaves' => [
['dsn' => 'mysql:host=5.5.5.5;dbname=slavedb']
]
],
//..
]
如何做…
- 创建
TestController.php
:
<?php
namespace app\controllers;
use app\models\BlogPost;
use Yii;
use yii\helpers\Html;
use yii\helpers\VarDumper;
use yii\web\Controller;
/**
* Class TestController
* @package app\controllers
*/
class TestController extends Controller
{
public function actionIndex(){
$masterModel = new BlogPost();
$masterModel->title = 'Awesome';
$masterModel->text = 'Something is going on..';
$masterModel->save();
$postId = $masterModel->id;
$replModel = BlogPost::findOne($postId);
return $this->renderContent(
Html::tag('h2', 'Master') .
Html::tag('pre', VarDumper::dumpAsString(
$masterModel
? $masterModel->attributes
: null
)) .
Html::tag('h2', 'Slave') .
Html::tag('pre', VarDumper::dumpAsString(
$replModel
? $replModel->attributes
: null
))
);
}
}
- 运行
test/index
,你将会得到如下输出:
工作原理…
slave服务器用于数据读取,master服务器用于数据写入。ActiveRecord模型保存到master服务器中,数据复制到slave服务器中,然后$replModel
在它上边找到。
更多…
\yii\db\Connection
组件支持负载均衡和slaves之间的失效转移。当首都执行一个读查询时,\yii\db\Connection
组件将会随机挑选一个slave并进行连接。如果这个slave死掉了,它将会尝试另外一个。如果所有的slaves都不可用,它将会连接到master。通过配置一个服务器状态缓存,死掉的服务器将会被记住,它将会在一段时间内不会被使用。
参考
欲了解更多信息,参考如下链接: