WordPress插件:HyperDB 分布式数据库

2015年2月4日 | 分类: 【源码】

HyperDB

目前由Matt团队维护中。

参考:https://codex.wordpress.org/HyperDB
下载:https://wordpress.org/plugins/hyperdb/

Multi-DB

目前已经停止更新。

参考:https://premium.wpmudev.org/retiring-our-legacy-plugins/
下载:https://github.com/wpmudev/multi-db

shardb

目前已几年没更新了。

介绍:http://blog.donews.com/jossef/?p=89
下载:https://wordpress.org/plugins/shardb/

对于Blog服务商或者个人搭建的为了多个人使用的版本WordPressMU,在用户数量日渐增长后,会导致一个数据库之内存有大量用户表,不便于管理和维护,在这个时候就需要使用到数据库散列,将用户表散列保存在多个数据库中,甚至于多个服务器中。眼下最容易找到的插件就是SharDB,在WordPress网站上就有下载。下载地址在此:http://wordpress.org/extend/plugins/shardb/,对于它的使用,很少找到中文的使用介绍一类的,经过一些研究总结了些经验,写出来给大家分享下。目前测试过WordPressMU2.9.2的版本,早期的版本也可以使用,对于最新的3.0没有做过测试,待测试后再将结果发上来。

SharDB是将用户的表Hash散列到多个数据库中,这样基本保证每个库中的用户表数量基本一致,首先要确定要是用多少个数据库,用户的数量是在增长的,但是数据库的总量是不变的,根据估算的支持规模可以决定使用多少个库,SharDB支持16库、256库、4096库,万级以下的规模使用16库基本可以了,如果对于增长量的估计比较乐观的话,也可以考虑256库,对于大型应用就可以使用4096库了。对于建立的多库,使用统一的前缀名是一定的。

可以使用以下PHP代码建立多库:

//下面这行根据自己的服务器配置设置
//mysql_connect(DB_HOST,DB_USER,DB_PWD) or die("DB connect ERROR!);
$shardb_prefix = "db_blog_";//数据库前缀
$shardb_hash_length = "";//散列16进制长度(如果建立16库就是1,256库就是2,4096库就是3)
$fmt = "{$shardb_prefix}%0{$shardb_hash_length}x";
$shardb_num_db = 1 << ($shardb_hash_length*4);
for($d=0;$d<$shardb_num_db;$d++){
    $dbname = sprintf($fmt,$d);
    $sql = "create database $dbname";
    mysql_query($sql);
}

建立好多库后先配置db-settings.php文件

将//$shardb_hash_length = 2;这一行的注释去掉,数值根据要建立库的数量设定

//$shardb_prefix = ‘acct_wpmu’;的注释去掉,acct_wpmu替换成自己的数据库前缀

//$shardb_dataset = ‘abc’;注释去掉,abc设定为自己的dataset值

如果想将主blog放入主库中则去掉$enable_home_db = true;这一行的注释。

对于VIP库和主从库的设置暂时不涉及。

这一行的注释去掉add_db_server(‘global’, 0, ”, 1, 1, DB_HOST, DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);

保存后上传至WordPress所在目录

然后修改wp-config.php文件,在define(‘DB_CHARSET’, ‘utf8′);这一行后添加

require(‘db-settings.php’);
define(‘WPMU’, true);

将db.php上传至wp-content目录下,shardb-admin.php上传至mu-plugins目录下,多库搭建就完成了,所有新建blog都会散列到建立的多个数据库中。

WordPress MU和Lyceum的数据库差异

WordPress MU(http://codex.wordpress.org/Create_A_Network)(WordPress MU目前已不再作为独立项目存在,它目前以MS(MultiSite)的名字作为WordPress主程序的一个分支而存在。

Lyceum(http://lyceum.ibiblio.org)是由WordPress派生出来的一个多用户博客系统。与WordPress主要的不同在于数据库的组织上;同时Lyceum还进行了一些安全方面的修改。

WordPress MU在默认安装条件下为每个用户建立8个数据表,结构相对清晰,各个用户的数据可以方便地分别进行管理。但是无法便捷地实现全站的索引与检索,也牺牲了可扩展性。如果用户数量达到数千人,数据库内将存在数万张表,这给管理、备份以及升级带来极大不便。

Lyceum则是将不同用户的数据都存在单张数据表内。而单库的数据表总存在物理极限,因此必须切分数据库。

HyperDB和Multi-DB在数据表处理方式上的差异

WordPress.com 的用户数非常庞大,他们使用了多个数据中心同时建立了自己的负载均衡手段。同时在数据库结构层面上开发了HyperDB ,用来划分数据库。

HyperDB具体有大致三种功能实现:

  1. Partitioning,数据在不同层级上的迁移。
  2. Replication,主/从数据库的读写规则,Master写,Slave只读不写,这是典型的负载均衡手段。
  3. Failover,故障转移机制。

WPMU DEV在这个思路与成果的基础上开发了简化版的Multi-DB(https://premium.wpmudev.org/project/multi-db/)。

Multi-DB插件允许建立16/256/4096个数据库,用户建立时数据会被散列纳入相应的数据库中,这样就实现了用户数量级的跃升。譬如原先心理接受极限是在单库数万张表/几千用户,那么使用Multi-DB之后承载能力在形式上获得了×16、×256、×4096的倍率。当然这不是简单的乘数效应,因为系统的短板会在不同时期出现在不同的环节,比如blogs.dir的文件数理论极限,比如单一WEB服务器不做负载均衡时单机的负载能力上限,比如静态文件请求产生的资源消耗等等。但是通过这个插件可以轻松跨越单数据库海量表对站长心理上的考验。这取决于你对自身站点规划的需要。一个小型博客无需计较这个问题,但是BSP必须正视这个问题。 现在你看到的 CN.am 及其绑定的站群,是建立在4096+2的定制上的。为什么要+2?因为我们倾向于把重要博客的数据单列以方便管理,同时对于博客的插件系统,有时需要一个global的数据库进行设置。此外,对于有特殊需求的用户,从数据稳定性考虑也可以为他们单独建库。因为不同的数据库可以存在于不同的数据中心,这一切都是可设置的。

以下介绍安装过程,我们的平台是CentOS,管理工具使用PHPMyAdmin。

1. 首先使用工具构造建立数据库的代码:

http://db-tools.wpmudev.org/db_sql.php

推荐使用256库设置,因为16库不会带来本质上承载能力的提升,而4096仅限于中型以上的规划。

你获得的代码是:

CREATE DATABASE `wp_00` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
......
CREATE DATABASE `wp_ff` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

wp_00~wp_ff就是数据库的标号,你可以使用root身份在PhpMyAdmin里运行并创建。 16库:0000-ffff 。

2. 建立用户赋予wildcard的数据库使用权限:

你需要对应地建立用户,然后为该用户赋权,确保它可以使用上述数据库。这是PhpMyAdmin的基本操作。

3. 使用工具完善db-config.php:

http://db-tools.wpmudev.org/db_servers.php

你获得的代码类似于:

add_db_server(’00′, ‘dc1′, 1, 1,’38.×.×.×’,'localhost’, ‘wp_00′, ‘admin’, ‘password’); 
......
add_db_server(’ff’, ‘dc1′, 1, 1,’38.×.×.×’,'localhost’, ‘wp_00′, ‘admin’, ‘password’); 

然后完善这个到db-config.php文件。另外它需要数据中心的IP(DC IPs)那里只需要填写前三位IP位址,还要声明计划的数据库数目。

之后的安装每个人方法不同,我讲我的处理。 现在需要单独建立一个global的数据库,一个home库。因为我需要一个单独的global库给插件,同时一个独立的库给主博客。然后也给user赋权,注意数据库命名的规则与前面的数据库阵列统一!然后令 add_global_table(’global’); 这句可用,global是你的那个总库名称。 我们先不上传这个插件,使用global库默认安装MU,这是基本操作。 然后上传插件,填写好db-config.php的每一个环节,这里可能容易出错,但是调试几次就好。需要声明建库总数,是否设定global,主要的是那个数据库阵列的配置。还有下面的 add_vip_blog(1, ‘home’); 也就是声明主博客单独使用的数据库。

4. 手动将主博客的8个表迁移到home数据库。完工!

数据库的scale一定要从长计议,在一开始就认真规划。一旦完成了配置,今后注册的新用户都会被散列到各自的合适位置。对应关系服从hash的计算: http://cn.am/wp-content/scripts/list-hashes.php 所以第2个用户的数据库标号是c8,第100个ID的数据库标号是f8,以此类推,在需要修改他们的时候可以分别进行整理。 完工后的数据库非常整洁,很有逻辑性,符合数据库洁癖人士的喜好。因为总库和主博客的home库都是很清爽的。当然这最主要的目的就是实现用户负载数目的跃升。假定10000个注册用户,散列到256个数据库,每个数据库不到40人,管理起来很容易。如果按照单库接近1000注册用户的情况,使用4096个数据库,那就是超过400万用户。

参考资料: