*************************************************
** 本教程基于版本:Discuz! X 2.0 **
*************************************************
在站点运营中,站长们遇到的最揪心问题莫过于站点不稳定,速度慢,甚至宕机。Discuz! X 2.0 为站长们想到了这一点,提供了多个负载均衡以及缓存加速的功能。站长们不需要修改代码,只需要在配置文件里面修改修改就能启用和配置相关功能。
一、数据库分布式部署
该功能可以把数据库表分开部署到多个数据库上,比如把读写频繁的 session 表部署到第二台服务器,避免影响主数据库运行。
涉及的文件:config\global_config.php
配置教程:
在 $_config = array(); 下默认已经有以下主数据库配置,不需要做改动- $_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_';
复制代码 在主数据库配置下加入第二个数据库的配置- $_config['db'][2]['dbhost'] = '192.168.0.2';
- $_config['db'][2]['dbuser'] = 'root';
- $_config['db'][2]['dbpw'] = 'root';
- $_config['db'][2]['dbcharset'] = 'gbk';
- $_config['db'][2]['pconnect'] = 0;
- $_config['db'][2]['dbname'] = 'ultrax';
- $_config['db'][2]['tablepre'] = 'pre_';
复制代码 再到 $_config['db']['map'] = array(); 下面添加部署策略- $_config['db']['map']['common_session'] = 2;
复制代码 这样,可以把 ession 给部署到第二个数据库上了。同理,需要把会员表 common_member 也拿出来到独立的一台服务器上的话,只需要在主数据库配置下面添加第三个数据库配置,然后在 $_config['db']['map'] = array(); 下添加部署策略 $_config['db']['map']['common_member'] = 3; 就可以了。
二、读写分离,多从库只读
对于访问量巨大的论坛,数据库在负担大量读取操作的同时,还要负担大量更新和新写入操作。MySQL数据库在这样的运行条件下很容易产生锁表现象,运行速度大大降低,严重的时候还会把数据库卡死。通过设置读写分离,把读取操作平衡的摊到多个从库上,保证主库在频繁写入的同时,论坛访问依然正常。
1、在MySQL数据库上设置主从备份,可以多个从库,也可以只要1个从库,这里的例子使用1个从库。
MySQL主从复制操作步骤:(例如:A 是主库 IP 是192.168.1.2,B 是从库 IP 是 192.168.1.3,实际情况以实际为准)
1)A、B 两台服务器版本必须差不多,比如都是 5.0 或者都是 5.1 最好,切记不要用MySQL4和MySQL5混用。
2)编辑 A 服务器的MySQL配置文件my.cnf:
在[mysqld]下添加- log-bin=mysql-bin //开启MYSQL二进制日志
- server-id=1 //服务器ID不能重复
- binlog-do-db=dzx2 //需要做主从备份的数据库
- expire-logs-days = 7 //只保留7天的二进制日志,以防磁盘被日志占满
复制代码 3)在 A 服务器添加一个用于主从复制的帐号:
登陆mysql命令行,执行- GRANT REPLICATION SLAVE ON *.* TO '帐号'@'从服务器IP' IDENTIFIED BY '密码';
复制代码 例如:帐号是 rep,密码是 123,IP 是 192.168.1.3,则执行代码为- GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.1.3' IDENTIFIED BY '123';
复制代码 4)编辑 B 服务器的MySQL配置文件my.cnf:
[mysqld]下添加- server-id=2 //服务器ID不能重复
- master-host=192.168.1.2 //主库A的IP
- master-user=rep //刚才创建的帐号
- master-password=123 //密码
- master-port=3306 //主库的端口
- replicate-do-db=dzx2 //需要做复制的数据库名
- replicate-ignore-table=dzx2.pre_common_session //自动跳过的表,session表没必要做复制
- slave-skip-errors = 1032,1062,126,1114,1146,1048,1396 //自动跳过的错误代码,以防复制出错被中断
复制代码 5)停止 A、B 两个数据库,把 A 的 Discuz! X 2.0 的数据库数据复制一份到 B 服务器的数据库目录,可以直接复制数据,也可以SQL导出导入,需要注意MySQL权限。
6)复制好了后,先启动 A 数据库,再启动 B 数据库。查看是不是正常同步的办法:登录 B 数据库,执行看是不是有两个一上一下的YES,任何一个是NO都不行。
2、设置配置 Discuz! X 的 config\gloabl_config.php 文件:
在 $_config['db']['slave'] = array(); 下添加从库配置:- $_config['db']['slave']['1']['dbhost'] = '192.168.1.2';
- $_config['db']['slave']['1']['dbuser'] = 'root';
- $_config['db']['slave']['1']['dbpw'] = 'comsenz';
- $_config['db']['slave']['1']['dbcharset'] = 'gbk';
- $_config['db']['slave']['1']['pconnect'] = '0';
- $_config['db']['slave']['1']['dbname'] = 'dzx2';
- $_config['db']['slave']['1']['tablepre'] = 'pre_';
复制代码 上面是从库的例子,如果有多个还可以加多个从库,比如:- $_config['db']['slave']['2']['dbhost'] = '192.168.1.3;
- $_config['db']['slave']['2']['dbuser'] = 'root';
- $_config['db']['slave']['2']['dbpw'] = 'comsenz';
- $_config['db']['slave']['2']['dbcharset'] = 'gbk';
- $_config['db']['slave']['2']['pconnect'] = '0';
- $_config['db']['slave']['2']['dbname'] = 'dzx2';
- $_config['db']['slave']['2']['tablepre'] = 'pre_';
复制代码 在 $_config['db']['common'] = array(); 下添加- $_config['db']['common']['slave_except_table'] = 'common_session, common_member';
复制代码 设置 session 和 member 表不去从库读,这两个表也没必要去从库读。特别是 session 表更新非常快,会对从库造成一定压力。
|