当前位置:首页 > CMS教程 > Discuz > 列表

Discuz X3 mysql数据库主从同步 读写分离

发布:smiling 来源: PHP粉丝网  添加日期:2014-03-31 21:07:05 浏览: 评论:0 

在 Discuz! X版本 程序里面内置了读写分离的功能,方便了一些负载比较大的站点使用来降低一定的负载.

Discuz! X 默认未开启此功能,需要在配置文件中做相应的修改此功能才会开启生效。

在配置开启读写分离的之前需要在服务器上先配置好 mysql 的主从下面介绍一下读写分离的配置:

读写分离只需要在 ./config/config_global.php 文件中加入,以下的内容即可:

  1. $_config['db']['slave'] = array(); 
  2. $_config['db']['slave']['1']['dbhost'] = '10.0.4.162';  //mysql 从库的host 
  3. $_config['db']['slave']['1']['dbuser'] = 'formaster';   //mysql 从库的数据库用户名 
  4. $_config['db']['slave']['1']['dbpw'] = '****';    //mysql 从库的数据库密码 
  5. $_config['db']['slave']['1']['dbcharset'] = 'gbk'
  6. $_config['db']['slave']['1']['pconnect'] = '0'
  7. $_config['db']['slave']['1']['dbname'] = 'ultrax'//mysql从库的数据库名 
  8. $_config['db']['slave']['1']['tablepre'] = 'pre_'
  9.  
  10.  
  11. //如果有多台从库可以继续添加 
  12. //$_config['db']['slave']['2']['dbhost'] = 'xxx';  
  13. //$_config['db']['slave']['2']['dbuser'] = 'xxxxxx';  
  14. //... 
  15.  
  16. $_config['db']['common']['slave_except_table'] = '';  //以逗句分离的表名,表示此处设置的表仅从主服务器读写, 不使用从服务器读取 

在程序中每个入口文件都会先执行 $discuz->init(); 在该方法里中调用的 内部方法 _init_db():

  1. function _init_db() { 
  2.                $class = 'db_mysql'
  3.                if(count(getglobal('config/db/slave'))) { 
  4.                        require_once libfile('class/mysql_slave'); 
  5.                        $class = 'db_mysql_slave'
  6.                } 
  7.                $this->db = & DB::object($class); 
  8.                $this->db->set_config($this->config['db']); 
  9.                $this->db->connect(); 

会先 count(getglobal('config/db/slave')) 判断 config_global.php 中是否配置了 slave 如果配置了则会调用 ./source/class/class_mysql_slave.php 文件中的 db_mysql的子类 db_mysql_slave 代替 db_mysql,当程序执行query时 调到 db_mysql_slave 的 query方法:

  1. function query($sql$type = '') { 
  2.                 if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == 'SELECT') { 
  3.                         $this->slave_connect(); 
  4.                 } 
  5.                 $this->slaveexcept = false; 
  6.                 return parent::query($sql$type); 

此方法中判断了 非 $_config['db']['common']['slave_except_table']  中设置的表及 为 SELECT 查询语句时使用从库的连接从从库查询数据,其他则用默认的使用主库.

如果在使用过程中有发现一些异常,或者想控制相关的 sql 语句读取的数据库,可以尝试在此方法中判断 $sql 的语句内容 来指定其需要读的主库还是从库.

Tags: Discuz X mysql数据库 主从同步

分享到: