规模化 WordPress 站点 1:使用 MySQL 异步复制和 HyperDB

我们在使用 WordPress 的过程中,或多或少都会考虑到一个问题。那就是如何让自己的站点承载更大的访问量。或者说,在用户对您的站点进行访问的时候,页面的访问既完整又快速。

对于小型站点,我们通常的做法是使用 Cache 来提高服务器响应速度。不可否认,像 WordPress Super Cache 一类的缓存插件,在提高网站访问速度,降低服务器负担方面做的非常好。它可以将站点内很多相对变动不是很频繁的内容生成静态化的页面,可以有效降低数据库 查询次数。无形中,提高了页面返回速度。给用户带来更好的体验。

但世事无绝对,缓存类的插件有时也无法胜任所有的服务器优化工作。总有些方面是缓存插件无法做到的。这个时候,我们就需要考虑换一种方式来加快网站 访问速度了。

对于 MySQL 数据库的查询,有时是无法避免的。例如相对比较活跃的站点,页面变更比较频繁的站点。以及要求事实行非常强的网站。这个时候,就需要考虑 MySQL 的查询能力了。

而单一的服务器或单独一个 MySQL 数据库,在很多方面都无法完成大型网站的要求。这个时候,我们可以考虑使用集群数据库或者类似的数据库架构来保障网站的响应速度。

本文主要讨论的内容是使用 MySQL 异步复制(Replication)结合由 WordPress 开发的 HyperDB 来实现基于 WordPress 的大型网站部分服务器功能的架设。

一、配置 MySQL Replication 部分:

本文将以把 exampledb 这个数据库,从主(Master)服务器复制到从(Slave)服务器为例进行讲解。Master 服务器 IP 地址为:192.168.0.100,两台服务器系统都为 Debian。不过,在其他发行版 Linux 下的配置方法类似,各位可以自行尝试。

两台服务器的 MySQL 服务均已安装完毕,示例数据库 exampledb 以及数据表和数据已在 Master 服务器中创建。

MySQL Replication 可以通过很多种方式架设完成,本文只是抛砖引玉给大家一个思路。

1. 配置 Master 服务器

首先,我们需要编辑 /etc/mysql/my.cnf 文件,允许 MySQL 接入网络,并且允许它监听所有 IP 地址。因此,我们在配置文件中注释掉以下内容(如果存在的话):


1#skip-networking
2#bind-address            = 127.0.0.1

其次,我们需要让 MySQL 哪个数据库要记录到日志中(Slave 服务器需要根据日志文件来了解 Master 服务器中相应的数据库都有哪些改变),以及写入到哪个日志文件。这样,该服务器我们便称其为主(Master)服务器。我们希望对 exampledb 数据库进行复制,因此,需要将以下代码加入到 /etc/mysql/my.cnf 文件中:


1log-bin = /var/log/mysql/mysql-bin.log
2binlog-do-db=exampledb
3server-id=1

保存并退出编辑器后,重新启动 MySQL 服务:


1/etc/init.d/mysql restart

然后我们以 root 身份登录到 MySQL 中创建一个用户,该用户拥有复制的权限:


1mysql -u root -p
2Enter password:

登录 MySQL 后,执行:


1GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY '<some_password>';
2FLUSH PRIVILEGES;
3(修改 <some_password> 为您的密码)

然后执行:

1USE exampledb;
2FLUSH TABLES WITH READ LOCK;
3SHOW MASTER STATUS;

最后一条命令,会在屏幕上显示类似以下的内容:


1+---------------+----------+--------------+------------------+
2| File          | Position | Binlog_do_db | Binlog_ignore_db |
3+---------------+----------+--------------+------------------+
4| mysql-bin.006 | 183      | exampledb    |                  |
5+---------------+----------+--------------+------------------+
61 row in set (0.00 sec)

记录下这些信息,我们将在 Slave 服务器上用到!

然后,可以离开 MySQL 控制界面:


1quit;

涉及到数据传输方面,现在有两种方式可以将 Master 服务器上 exampledb 数据库中的表和文件传输到 Slave 服务器上。

第一种方式是转存(Dump)数据库,第二中则是在 Slave 服务器上使用 LOAD DATA FROM MASTER; 命令。第二中方式存在一定的弊端,就是进行操作时,数据库会处于锁定状态,所以当您的网站访问量非常大的时候,不建议使用第二种方式,而希望各位使用第一 种方式。

不过,第二种方式也是最快的一种,所以,在这里会对两种方式都做一下介绍。
如果您想使用第一种方式,可以这样进行操作:


1mysqldump -u root -p<password> --opt exampledb > exampledb.sql
2(将 <password> 修改为您的 MySQL 中 root 的密码!注意一下:-p 和 <password> 之间没有空格!)

这将会创建一个 exampledb 数据库的转存 exampledb.sql 文件。将该文件上传到 Slave 服务器上!

如果您想使用 LOAD DATA FROM MASTER; 方式,那么现在您不需要再做什么了。
最后,我们还要解除 exampledb 数据表的锁定:

1mysql -u root -p
2Enter password:
3UNLOCK TABLES;
4quit;

到此,Master 服务器的配置就完成了,接下来是 Slave 服务器的配置……

2. 配置 Slave 服务器

在 Slave 服务器上,我们首先要创建一个 exampledb 数据库:


1mysql -u root -p
2Enter password:
3CREATE DATABASE exampledb;
4quit;

如果您已经在 Master 服务器上对 exampledb 数据库进行了转存,并将备份文件上传到了 Slave 服务器上,那么现在就可以将数据导入到 Slave 服务器上新创建的 exampledb 数据库中了:

1mysql -u root -p<password> exampledb < /path/to/exampledb.sql
2(将 <password> 修改为您的 MySQL 中 root 的密码!注意一下:-p 和 <password> 之间没有空格!)

如果您想使用 LOAD DATA FROM MASTER; 方式,那么现在您不需要再做什么了。
现在,我们要在 Slave 服务器上进行设置,让其知道它自身为 Slave 服务器、Master 服务器的 IP 为 192.168.0.100、Master 服务器的数据库监视着 exampledb 数据库。因此,我们在 /etc/mysql/my.cnf 文件中添加以下内容:


1server-id=2
2master-host=192.168.0.100
3master-user=slave_user
4master-password=secret
5master-connect-retry=60
6replicate-do-db=exampledb

然后重启 MySQL 服务:


1/etc/init.d/mysql restart

如果您没有导入 Master 服务器 exampledb 数据库的内容,而是想使用直接读取数据(LOAD DATA FROM MASTER;)的方式,那么现在您可以使用以下命令从 Master 服务器获取 exampledb 数据库的信息了:


1mysql -u root -p
2Enter password:
3LOAD DATA FROM MASTER;
4quit;

如果您在 Slave 服务器上安装了 phpMyAdmin,那么您可以使用该程序查看一下 Slave 服务器上的数据表和数据是否可用了。

最后,我们必须执行以下一下操作:


1mysql -u root -p
2Enter password:
3SLAVE STOP;

下一条命令您需要适当替换掉部分参数:


1CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='<some_password>', MASTER_LOG_FILE='mysql-bin.006', MASTER_LOG_POS=183;
  • MASTER_HOST 是 Master 服务器的 IP 地址或主机名(本例中为 192.168.0.100)。
  • MASTER_USER 是 Master 服务器上被我们赋予了复制权限的用户。
  • MASTER_PASSWORD 是 Master 服务器上 MASTER_USER 的密码。
  • MASTER_LOG_FILE 是 Master 服务器在执行 SHOW MASTER STATUS; 命令时 MySQL 返回的文件。
  • MASTER_LOG_POS 是 Master 服务器在执行 SHOW MASTER STATUS; 命令时 MySQL 返回的文件的位置。

现在,剩下的工作就是启用 Slave。我们可以运行:


1START SLAVE;
2quit;

好了!现在无论 Master 服务器上的 exampledb 数据库做出任何变动,都会复制到 Slave 服务器上的 exampledb 数据库中啦!

数据库服务器的设置告一段落,接下来便是 WordPress 方面针对数据库进行的设置了。其中使用到了由 WordPress 官方开发的一个数据库类。被其做成了插件的形式,命名为 HyperDB。

二、配置 WordPress 和 HyperDB 部分:

HyperDB 和常规的 WordPress 插件有一定区别,而且需要使用在 WordPress MU 系统中,不过等 WordPress 3.0 成熟后,应该可以在激活了多站点功能的 WordPress 3.0 中使用。安装方法可以参考插件的安装说明。在以后的文章中,争取着重对该类插件进行介绍。

本文不同程度参考或翻译了相关文章,并加入了自身理解的内容。希望能够让您的站点可以承受更大的访问压力。欢迎各位讨论。文中的错误在所难免,希望 各位能够指出,谢谢。

本文也许会以系列文章形式发布,请随时关注本站。本文首发 Dreamcolor's Cote

参与评论

游客评论不支持回复他人评论内容,如需回复他人评论内容请