2016-04-05 15:08:31 3372次浏览 3条回答 1 悬赏 20 金钱

多个数据库 读写分离怎么配置呢?

  • 回答于 2016-04-05 16:07 举报

    首先,你得配置多个db

    
    return [
        // ...
        'components' => [
            // 配置主库
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=mydatabase', 
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
            //可以配置多个从库,只要负责读
            'dbread' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=mydatabase2', 
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
        ],
        // ...
    ];
    
    

    接下来,如果你的业务处理是读取的,你就获取读取的实例:

    $connection2 = \Yii::$app->dbread;
    

    如果是需要写的业务,你就获取可读写的实例

    $connection2 = \Yii::$app->db;
    
    2 条回复
    回复于 2016-04-05 16:21 回复

    我明白您的思路 关键是我项目里 基本都用的是AR操作的数据库列如: Member::model()->findByPk($id); 这样的操作怎么去区分呢?

    回复于 2016-07-27 10:00 回复

    看你这配置是 配置多个数据库实例呀,但是我看文档是 一个实例配置多个DSN呀?

  • 回答于 2016-04-05 16:35 举报

    ActiveRecord有个getDb方法,你可以重写他

    public static function getDb()
    {
        return Yii::$app->getDb();
    }
    

    其他它最终调用的是Application的getDb方法

    public function getDb()
    {
            return $this->get('db');
    }
    

    所以,你可以根据你自己的业务,然后重写这个方法,返回你想要的db。
    最好自己写个类,比如:

    class BackBaseActiveRecord extends ActiveRecord{
    
    }
    

    然后让你所有的model都继承BackBaseActiveRecord,这样你在BackBaseActiveRecord中重写getDb方法

    你试试看行不行

    6 条回复
    回复于 2016-04-05 16:44 回复

    我用的是yii1.1版本 我先按照您这个方法试试

    回复于 2016-04-06 17:33 回复

    javalzbin 我想问下,在同一个mysql服务器中,两个数据库的数据同步是怎么实现的?

    回复于 2016-04-06 17:59 回复

    一个mysql服务器,两个数据库,一般不会这么做,测试可以,但是也是一台服务器两个myslq服务。
    集群也是两台机器,两个mysql服务,然后可以配置主从,当你在主库上进行写操作的时候,主会自动同步到从库中,从而实现读写分离。搭建集群的教程网上很多,集群的方式也很多,根据自身的业务,选择一个合适自己的集群方案,最后提一点,无论哪种集群,为了避免节点出现脑裂而破坏数据,最好是奇数台服务器,也就是至少3台服务器做集群

    回复于 2016-04-06 18:06 回复

    两个mysql服务我明白一点,主要是各方面限制,想一台服务器做个主从的、、、

    回复于 2016-04-06 18:09 回复

    可以,端口区分就行

    回复于 2016-04-06 18:45 回复

    在我自己这个类BackBaseActiveRecord 里面怎么去区分请求过来的是写操作 还是读操作呢 我要在这个类里面去区分读操作让他执行从库 写操作执行主库

  • 回答于 2016-04-13 14:02 举报

    ..框架自己会区分读和写的,读都是从库,写是主库。要是所有sql都让你自己去决定是读还是写,你还不得累死。

您需要登录后才可以回答。登录 | 立即注册
yg
职场新人

yg

注册时间:2016-04-01
最后登录:2016-04-12
在线时长:1小时30分
  • 粉丝2
  • 金钱40
  • 威望0
  • 积分50

热门问题