最近一直都在处理一些大数据库的discuz
论坛,像每天PV达到千万级别,用户访问给数据库带来非常大的压力,导致在网站访问蜗牛一样(
推荐结合:
Discuz静态资源-远程附件、CSS和JS使用cdn加速的方法),那么我们就可以把Discuz x
论坛 数据库做读写分离,来减轻数据查询的压力,下面我们先来看看Discuz x
论坛 数据库提供的读写分离配置
参考配置文件config_global_default.php,
/**
* 数据库主
服务器设置, 支持多组
服务器设置, 当设置多组
服务器时, 则会根据分布式策略使用某个
服务器
* @example
* $_config['db']['1']['dbhost'] = 'localhost'; //
服务器地址
* $_config['db']['1']['dbuser'] = 'root'; // 用户
* $_config['db']['1']['dbpw'] = 'root';// 密码
* $_config['db']['1']['dbcharset'] = 'gbk';// 字符集
* $_config['db']['1']['pconnect'] = '0';// 是否持续连接
* $_config['db']['1']['dbname'] = 'x1';// 数据库
* $_config['db']['1']['tablepre'] = 'pre_';// 表名前缀
*
* $_config['db']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db'][1]['dbhost'] = 'localhost';
$_config['db'][1]['dbuser'] = 'root';
$_config['db'][1]['dbpw'] = 'root';
$_config['db'][1]['dbcharset'] = 'gbk';
$_config['db'][1]['pconnect'] = 0;
$_config['db'][1]['dbname'] = 'ultrax';
$_config['db'][1]['tablepre'] = 'pre_';
/**
* 数据库从
服务器设置( slave, 只读 ), 支持多组
服务器设置, 当设置多组
服务器时, 系统根据每次随机使用
* @example
* $_config['db']['1']['slave']['1']['dbhost'] = 'localhost';
* $_config['db']['1']['slave']['1']['dbuser'] = 'root';
* $_config['db']['1']['slave']['1']['dbpw'] = 'root';
* $_config['db']['1']['slave']['1']['dbcharset'] = 'gbk';
* $_config['db']['1']['slave']['1']['pconnect'] = '0';
* $_config['db']['1']['slave']['1']['dbname'] = 'x1';
* $_config['db']['1']['slave']['1']['tablepre'] = 'pre_';
* $_config['db']['1']['slave']['1']['weight'] = '0'; //权重:数据越大权重越高
*
* $_config['db']['1']['slave']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db']['1']['slave'] = array();
//启用从
服务器的开关
$_config['db']['slave'] = false;
/**
* 数据库 分布部署策略设置
*
* @example 将 common_member 部署到第二
服务器, common_session 部署在第三
服务器, 则设置为
* $_config['db']['map']['common_member'] = 2;
* $_config['db']['map']['common_session'] = 3;
*
* 对于没有明确声明
服务器的表, 则一律默认部署在第一
服务器上
*
*/
$_config['db']['map'] = array();
/**
* 数据库 公共设置, 此类设置通常对针对每个部署的
服务器
*/
$_config['db']['common'] = array();
/**
* 禁用从数据库的数据表, 表名字之间使用逗号分割
*
* @example common_session, common_member 这两个表仅从主
服务器读写, 不使用从
服务器
* $_config['db']['common']['slave_except_table'] = 'common_session, common_member';
*
*/
$_config['db']['common']['slave_except_table'] = '';
默认已经提供了分布式数据库的方法和主从数据库读写分离的方法,配置好数据库MySQL主从
服务器后根据上面进行相应配置即可。下面我们来看看MySQL主从
服务器的配置:
第一步: MySQL主从设置之主
服务器A设置
1. 找到主
服务器A的MySQL的配置文件my.ini
2. 打开my.ini,在[mysqld]下面添加以下参数
3. 在主
服务器A中添加一个用于主从复制的帐号:
登陆mysql命令行,执行
GRANT REPLICATION SLAVE ON *.* TO ‘帐号’@’从
服务器IP’ IDENTIFIED BY ‘密码';
4. 重启MySQL ,让配置生效
5. 可以通过show master status\G;查看主从数据库是否配置成功。
第二步: MySQL主从设置之主数据库和从数据库数据一致。
1. 关闭
论坛访问,停止更新数据
2. 在主
服务器中加入只读锁
3. 导出数据库
通过命令导出数据库 mysqldump -u root -p 数据库名 > 导出来的位置
4. 将主
服务器的数据库导入到从
服务器的数据库
5. 将主数据库
服务器解除只读锁
6. 开启
论坛访问。
第三步:MySQL主从设置之从
服务器B设置
1. 找到从
服务器mysql配置文件my.cnf (主
服务器是windows,从
服务器是Linux。所以配置文件的后缀不一致)
2. 打开my.cnf,在[mysqld]下面添加以下参数
3. 重启从数据库
4、登录从库的MySQL命令行,执行:
change master to master_host=’主
服务器IP’, master_user=’主
服务器账号’, master_password=’主
服务器密码’, master_log_file=’file的值’, master_log_pos=position的值;
//设置连接信息,file及position的值是之前记录下来(在主
服务器上通过show master status\G;),position的值没有单引号,其他的值要单引号
5. 启动从库连接
start slave; //启动从库连接
6、查看从库状态:
show slave status\G; //查看连接情况
7、编辑从MYSQL
服务器的MySQL配置文件my.cnf,在[mysqld]下面添加以下参数:
8. 测试,可以在主
服务器上添加数据或者删除数据,从
服务器会对应更新过来。