复制和读写分离

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

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. 设置数据库连接并创建一个名叫post的表:
  1. DROP TABLE IF EXISTS 'blog_post';
  2. CREATE TABLE IF NOT EXISTS 'blog_post' (
  3. 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. 'title' VARCHAR(255) NOT NULL,
  5. 'text' TEXT NOT NULL,
  6. 'created_at' INTEGER,
  7. 'modified_at'INTEGER,
  8. PRIMARY KEY ('id')
  9. );
  1. 为表blog_post创建BlogPost模型。
  2. 按照文章https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-inmysql/中的描述,在你的数据库服务器之间,配置主从复制。
  3. config/main.php中配置db组件,下面是个例子:
  1. 'components' => [
  2. // ..
  3. 'db' => [
  4. 'class' => 'yii\db\Connection',
  5. 'dsn' => 'mysql:host=4.4.4.4;dbname=masterdb',
  6. 'username' => 'master',
  7. 'password' => 'pass',
  8. 'charset' => 'utf8',
  9. 'slaveConfig' => [
  10. 'username' => 'slave',
  11. 'password' => 'pass',
  12. ],
  13. // list of slave configurations
  14. 'slaves' => [
  15. ['dsn' => 'mysql:host=5.5.5.5;dbname=slavedb']
  16. ]
  17. ],
  18. //..
  19. ]

如何做…

  1. 创建TestController.php
  1. <?php
  2. namespace app\controllers;
  3. use app\models\BlogPost;
  4. use Yii;
  5. use yii\helpers\Html;
  6. use yii\helpers\VarDumper;
  7. use yii\web\Controller;
  8. /**
  9. * Class TestController
  10. * @package app\controllers
  11. */
  12. class TestController extends Controller
  13. {
  14. public function actionIndex(){
  15. $masterModel = new BlogPost();
  16. $masterModel->title = 'Awesome';
  17. $masterModel->text = 'Something is going on..';
  18. $masterModel->save();
  19. $postId = $masterModel->id;
  20. $replModel = BlogPost::findOne($postId);
  21. return $this->renderContent(
  22. Html::tag('h2', 'Master') .
  23. Html::tag('pre', VarDumper::dumpAsString(
  24. $masterModel
  25. ? $masterModel->attributes
  26. : null
  27. )) .
  28. Html::tag('h2', 'Slave') .
  29. Html::tag('pre', VarDumper::dumpAsString(
  30. $replModel
  31. ? $replModel->attributes
  32. : null
  33. ))
  34. );
  35. }
  36. }
  1. 运行test/index,你将会得到如下输出:

复制和读写分离 - 图1

工作原理…

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

更多…

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

参考

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