|
本文介绍了 Discuz!X 所支持的数据库分布式部署,读写分离以及负载均衡特性以及配置方法,用户只需要通过修改配置文件即可实现上述功能,使得采用 Discuz!X 建站或者二次开发的应用在后期进行扩展都非常方便。
作为国内老牌的社区软件,Discuz!X 系统功能丰富,数据表多达200多个,在实际生产环境中对各种功能的深度使用各不一样,导致每个数据表都有可能承受高并发的访问压力,当出现这种情况时,需要将负载大的数据表及其相关数据表单独部署,以增强系统的负载能力。
从 2.5 版本开始支持分布式部署,并且理论上支持以表为单位的数据库分布式部署,部分无法独立部署的表将与其相关表被合并为最小单位部署。以下图为例:
Server1 中为所有未分布部署的表,其中每一个表都可以再部署为独立的服务器,例如:common_session 表;
Server2~Server19 均为最小分布部署单位,不可再拆分;
可以将多个 Server 合并为一个 Server,也可以并入 Server1 中,例如: Server11~19 可以合并为一个 Server;
每一个独立插件均可以采用独立 Server 部署或和上述任意 Server 合并;
注意:
1、以上所述 Server 均为逻辑服务器,更进一步可以理解成仅仅是独立的逻辑数据库而已。换言之以上所述的 Server1 ~ Server19 仅仅是不同的数据库,这些数据库可以是运行在同一个 MySQL 服务器实例下,也可以是多个 MySQL 服务器实例下的多个数据库。
2、虽然 Discuz!X 支持分布式以及主从读写分离,但是作为社区软件的中枢组件 UCenter 却不支持分布式部署和主从读写分离,如需支持必须修改 UCenter 底层源码,后续将另开帖子详述。
下面将以 Discuz!X3.2 为例详细讲解分布式部署策略,本例将实现上述 Server9 中的四张表单独部署,其他表不变。
Discuz!X 正常安装完成后在配置文件中关于数据库的配置内容如下:
- $_config['db']['1']['dbhost'] = 's1.db.bacysoft.cn';
- $_config['db']['1']['dbuser'] = 'bacysoft';
- $_config['db']['1']['dbpw'] = '73yGbsPfTAxf3';
- $_config['db']['1']['dbcharset'] = 'utf8';
- $_config['db']['1']['pconnect'] = '0';
- $_config['db']['1']['dbname'] = 'bacysoft_s1';
- $_config['db']['1']['tablepre'] = 'pre_';
- $_config['db']['slave'] = '';
- $_config['db']['common']['slave_except_table'] = '';
复制代码 相关说明如下:
1、$_config 为 Discuz!X 内置变量,内核实例化时会加载整个 $_config 数组;其中 ['db'] 表示与数据库相关的配置项,紧随其后的数字下标表示对应的数据库编号,即 ['1'] 表示数据库1;
2、['db']['slave'] 表示是否开启从数据库,相关内容后文介绍主从负载均衡时再说;
3、['common']['slave_except_table'] 中设置的值表示无需实现主从负载均衡的数据表,即读写都仅只访问主数据库,细节见后文相关内容;
4、数据库参数字段介绍
dbhost:数据库主机名,可以是域名形式的主机名,也可以直接是IP地址;
dnname:数据库名;
dbuser:访问数据库的用户名;
dbpw:访问数据库的密码;
pconnect:设置是否使用长连接,0 表示不使用;
dhcharset:数据库字符编码格式;
tablepre:表前缀;
现在要实现将 Server9 中的四张数据表,即:forum_post,forum_post_tableid,forum_post_moderate,forum_debatepost 分库到新数据库,需增加如下配置:
- $_config['db']['map']['forum_post'] = '2';
- $_config['db']['map']['forum_post_tableid'] = '2';
- $_config['db']['map']['forum_post_moderate'] = '2';
- $_config['db']['map']['forum_debatepost'] = '2';
- $_config['db']['2']['dbhost'] = 's2.db.bacysoft.cn';
- $_config['db']['2']['dbuser'] = 'bacysoft';
- $_config['db']['2']['dbpw'] = 'xeq5LxUYLM7by';
- $_config['db']['2']['dbcharset'] = 'utf8';
- $_config['db']['2']['pconnect'] = '0';
- $_config['db']['2']['dbname'] = 'bacysoft_s2';
- $_config['db']['2']['tablepre'] = 'pre_';
复制代码 配置中 ['map'] 的部分将上述四张表映射到了数据库2,然后紧接着添加 数据库2 的相关配置,可以看到,数据库2 的配置和 数据库1 基本类似,需要指出的是,如果 数据库1 和 数据库2 的 dbhost 值相同,则表示数据库 1 和 2 其实是同一个 MySQL 服务器下的不同数据库而已。
完成以上配置后,Discuz!X 应用代码访问 forum_post,forum_post_tableid,forum_post_moderate,forum_debatepost 四张表的时候就会使用 数据库2 的配置,而访问其他表时,则继续使用默认的 数据库1,从而实现数据库的分布式部署。以下是完整的数据库配置:
- $_config['db']['1']['dbhost'] = 's1.db.bacysoft.cn';
- $_config['db']['1']['dbuser'] = 'bacysoft';
- $_config['db']['1']['dbpw'] = '73yGbsPfTAxf3';
- $_config['db']['1']['dbcharset'] = 'utf8';
- $_config['db']['1']['pconnect'] = '0';
- $_config['db']['1']['dbname'] = 'bacysoft_s1';
- $_config['db']['1']['tablepre'] = 'pre_';
- $_config['db']['slave'] = '';
- $_config['db']['common']['slave_except_table'] = '';
- $_config['db']['map']['forum_post'] = '2';
- $_config['db']['map']['forum_post_tableid'] = '2';
- $_config['db']['map']['forum_post_moderate'] = '2';
- $_config['db']['map']['forum_debatepost'] = '2';
- $_config['db']['2']['dbhost'] = 's2.db.bacysoft.cn';
- $_config['db']['2']['dbuser'] = 'bacysoft';
- $_config['db']['2']['dbpw'] = 'xeq5LxUYLM7by';
- $_config['db']['2']['dbcharset'] = 'utf8';
- $_config['db']['2']['pconnect'] = '0';
- $_config['db']['2']['dbname'] = 'bacysoft_s2';
- $_config['db']['2']['tablepre'] = 'pre_';
复制代码
以上是 Discuz!X 数据库分布式部署的配置案例,下文将继续介绍如何实现读写分离以及负载均衡。
在配置 Discuz!X 的读写分离前必须确保 MySQL 已经配置好主从同步。简单说就是开启主MySQL服务器的二进制日志功能,然后从MySQL自动从主MySQL同步数据,具体配置方法参见 MySQL 手册以及网上其他资料。
上文提过过正常安装的 Discuz!X 配置文件中有两个选项分别是:
- $_config['db']['slave'] = '';
- $_config['db']['common']['slave_except_table'] = '';
复制代码 $_config['db']['slave'] 是主从模式的开关,设置为 1 即可开启主从模式。
$_config['db']['common']['slave_except_table'] 是用于设置指定的数据表不需要进行读写分离,即该选项所描述的表无论读写都始终在主MySQL服务器上进行。例如:$_config['db']['common']['slave_except_table'] = “common_session",如果有多张表,请使用 ',' 分隔。
接下来,针对需要设置读写分离的数据库配置与其对应的从数据库。上文中,数据库2 中包含了 forum_post,forum_post_tableid,forum_post_moderate,forum_debatepost 四张表,现针对 数据库2 配置两台从服务器,参考配置如下:
- $_config['db']['2']['slave']['1']['dbhost'] = 's2-1.db.bacysoft.cn';
- $_config['db']['2']['slave']['1']['dbuser'] = 'rep_s2';
- $_config['db']['2']['slave']['1']['dbpw'] = 'rSPDfPbmhxHdbKvD';
- $_config['db']['2']['slave']['1']['dbcharset'] = 'utf8';
- $_config['db']['2']['slave']['1']['pconnect'] = '0';
- $_config['db']['2']['slave']['1']['dbname'] = 'rep_s2';
- $_config['db']['2']['slave']['1']['tablepre'] = 'pre_';
- $_config['db']['2']['slave']['2']['dbhost'] = 's2-2.db.bacysoft.cn';
- $_config['db']['2']['slave']['2']['dbuser'] = 'rep_s2';
- $_config['db']['2']['slave']['2']['dbpw'] = 'qyMf7572j53SR8QY';
- $_config['db']['2']['slave']['2']['dbcharset'] = 'utf8';
- $_config['db']['2']['slave']['2']['pconnect'] = '0';
- $_config['db']['2']['slave']['2']['dbname'] = 'rep_s2';
- $_config['db']['2']['slave']['2']['tablepre'] = 'pre_';
复制代码 ['slave'] 字段前的数字表示主数据库的编号,字段后的数字表示从数据库编号,然后其他配置如 dbhost dbuser dbname 等等均为描述一个数据库的必要参数,与上文所述意义一致。
配置完成后所有 SELECT 查询均会路由到 从数据库1 或者 从数据库2 上执行,而其他的操作则会继续在主数据库上完成,从而实现读写分离,且读操作的负载均衡。也就是写操作会在主数据库执行,读操作将在这两台从数据库执行,默认情况,Discuz!X 将随机选择两台从数据库中的一个,如果实际生产环境中两台从数据库服务器的性能不一致,则可通过增加 weight 配置来实现加权负载均衡,配置如下:
- $_config['db']['2']['slave']['1']['weight'] = 30;
- $_config['db']['2']['slave']['2']['weight'] = 70;
复制代码 添加如上配置后,Discuz!X 将会按照 30:70 这样的比例将 SELECT 查询路由到对应的数据库。
总结,Discuz!X 的分布式部署 和 读写分离 可以分别独立部署,也可以混合部署。分布式的关键在于 map 参数的配置,通过 map 参数将需要分布式的数据表映射到不同的数据库;读写分离则是针对指定的主数据库,配置其从数据库,然后读操作会根据 weight 值分摊到不同的从数据库以实现负载均衡。
|
|