View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

复制和读写分离

在本节中,我们将学习如何复制和读写分离。我们将会看到slave和master服务器如何帮助我们做到这些。

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. 设置数据库连接并创建一个名叫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')
);
  1. 为表blog_post创建BlogPost模型。
  2. 按照文章https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-inmysql/中的描述,在你的数据库服务器之间,配置主从复制。
  3. 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']
        ]
    ],
    //..
]

如何做…

  1. 创建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
            ))
        );
    }
}
  1. 运行test/index,你将会得到如下输出:

工作原理…

slave服务器用于数据读取,master服务器用于数据写入。ActiveRecord模型保存到master服务器中,数据复制到slave服务器中,然后$replModel在它上边找到。

更多…

\yii\db\Connection组件支持负载均衡和slaves之间的失效转移。当首都执行一个读查询时,\yii\db\Connection组件将会随机挑选一个slave并进行连接。如果这个slave死掉了,它将会尝试另外一个。如果所有的slaves都不可用,它将会连接到master。通过配置一个服务器状态缓存,死掉的服务器将会被记住,它将会在一段时间内不会被使用。

参考

欲了解更多信息,参考如下链接: