返回列表 发新帖
查看: 2823|回复: 1

Discuz x3.3 x3.2论坛实现数据库实现读写分离的方法

[复制链接]

6671

热度

1万

元宝

262

贡献

管理员

DZ专员

发表于 2015-8-3 13:50:47 | 显示全部楼层 |阅读模式
最近一直都在处理一些大数据库的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
1.jpg
2. 打开my.ini,在[mysqld]下面添加以下参数
2.jpg
3. 在主服务器A中添加一个用于主从复制的帐号:
登陆mysql命令行,执行
GRANT REPLICATION SLAVE ON *.* TO ‘帐号’@’从服务器IP’ IDENTIFIED BY ‘密码';
3.jpg
4. 重启MySQL ,让配置生效

5. 可以通过show master status\G;查看主从数据库是否配置成功。
4.jpg
第二步: MySQL主从设置之主数据库和从数据库数据一致。
1.  关闭论坛访问,停止更新数据

2. 在主服务器中加入只读锁
5.jpg
3. 导出数据库
通过命令导出数据库 mysqldump -u root -p 数据库名 > 导出来的位置
6.jpg
4. 将主服务器的数据库导入到从服务器的数据库
7.jpg
5. 将主数据库服务器解除只读锁
8.jpg
6.  开启论坛访问。

第三步:MySQL主从设置之从服务器B设置
1. 找到从服务器mysql配置文件my.cnf (主服务器是windows,从服务器是Linux。所以配置文件的后缀不一致)
9.jpg
2. 打开my.cnf,在[mysqld]下面添加以下参数
10.jpg
3. 重启从数据库
11.jpg
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的值没有单引号,其他的值要单引号
12.jpg
5. 启动从库连接
start slave; //启动从库连接
13.jpg
6、查看从库状态:
show slave status\G; //查看连接情况
14.jpg
7、编辑从MYSQL服务器的MySQL配置文件my.cnf,在[mysqld]下面添加以下参数:
15.jpg
8. 测试,可以在主服务器上添加数据或者删除数据,从服务器会对应更新过来。
返回列表 发新帖
 懒得打字嘛,点击右侧快捷回复【最新发布】   【赞助草根吧享更多权益】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

收藏帖子 返回列表 搜索

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

小黑屋|手机版|草根吧