如何优化WordPress的性能有了MySQL复制在Ubuntu 14.04

在本教程中,我们将教你如何使用主从数据库复制和HyperDB WordPress插件来扩展你的WordPress的MySQL数据库服务器设置。以这种方式添加多个数据库服务器在您的环境允许你的WordPress应用从多个数据库服务器来读取,提高读取性能。

介绍

在本教程中,我们将教您如何使用主从数据库复制和WordPress的HyperDB插件扩展您的WordPress MySQL数据库服务器设置。 以这种方式将更多的数据库服务器添加到您的环境中,允许您的WordPress应用程序从多个数据库服务器读取,提高读取性能。

MySQL复制对于处理频繁读取和不频繁写入的系统(如大多数WordPress安装)而言,收获最大的性能优势。 通过使用单主机与多从机设置,您可以添加更多从机来扩展系统,直到您的网络带宽不足或您的主机无法处理更新负载。 如果您愿意,可以通过重复本教程复制部分的“从属”部分来添加多个从属。

我们假设您的设置包括连接到单独的MySQL数据库服务器的两个负载平衡的WordPress应用程序服务器(请参阅有关如何设置它的教程的先决条件)。 遵循本教程的负载平衡应用程序服务器不是绝对必要的,但是您的MySQL数据库服务器应该与应用程序服务器分离。

先决条件

继续本教程之前,您应该已经完成​​了两个教程或具有类似的环境:

遵循这些教程后,要设置具有两个负载平衡Web应用程序服务器和单独的数据库服务器的WordPress,您应该有四个VPS。 因为我们将处理几个VPS,为参考目的,我们将称为您现有的四个VPS如下:

  • HAProxy的www的 :您的第4层负载均衡您的WordPress Web应用程序服务器HAProxy的服务器。 这是进入您的网站的入口点
  • WordPress的-1:你的第一个WordPress的Web应用程序服务器
  • WordPress的-2:你的第二个WordPress的Web应用程序服务器
  • 的mysql-1:您的MySQL服务器为WordPress

也就是说,你的环境应该看起来像这样:

WordPress和单独的MySQL数据库服务器

除了当前的环境,我们将在本教程中需要一个额外的VPS。 我们称之为:

  • 的mysql-2:您从MySQL数据库服务器

我们的目标

当我们完成本教程后,您将有两个数据库服务器将在主从配置中进行复制。 您的WordPress服务器将通过使用HyperDB WordPress插件选择性地写入您的主控并从主数据库和从属数据库读取。 你的最终环境应该是这样的:

主从数据库复制

请记住,您不需要有负载平衡的应用程序服务器(wordpress-1 / wordpress-2)来遵循本教程,并且您可以根据需要添加更多的从数据库。

设置MySQL主从复制

在我们可以将我们的WordPress应用程序配置为从多个数据库服务器读取之前,我们需要设置我们的MySQL复制。

创建MySQL Slave VPS,mysql-2

您将要创建一个新的VPS,将作为MySQL的从服务器-参考的目的,我们称这台服务器的mysql-2。 从属服务器将被配置为复制主MySQL服务器的所有数据库,包括您的WordPress数据库。

在MySQL-2,安装MySQL软件:

sudo apt-get update
sudo apt-get install mysql-server

输入MySQL安装的根密码。 接下来我们将在我们的MySQL主服务器上配置。

将现有MySQL服务器配置为主服务器

第一步是设置您现有的MySQL数据库服务器,MySQL-1,具有复制主配置。

在MySQL-1,编辑MySQL的配置文件:

sudo vi /etc/mysql/my.cnf

搜索以下三行:

bind-address            = mysql_1_private_IP
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
  • 绑定地址 :即MySQL将监听的IP地址。 这应该已经从原来的设置设定为的mysql-1的私有IP地址
  • 服务器ID:唯一的服务器ID。 由于这是主服务器,我们希望将值保留为“1”,并取消注释此行
  • log_bin:二进制日志文件的位置。 二进制日志用于将数据更改从主机发送到其从机以进行复制。 取消注释此行

这三行应该看起来像这样(请务必使用数据库服务器的私有IP地址替代):

bind-address           = mysql_1_private_IP
server-id              = 1
log_bin                = /var/log/mysql/mysql-bin.log

或者 ,如果你想复制限制到WordPress数据库,具体来说,以下行添加到您的配置(代替突出显示您所需的数据库名):

binlog_do_db           = wordpress

保存并退出。 为了使这些更改生效,请使用以下命令重新启动mysql:

sudo service mysql restart

使用以下命令连接到MySQL控制台,然后在提示时输入密码:

mysql -u root -p

创建一个将被我们的从属MySQL服务器用于复制目的的用户。 我们称这个用户REPL。 一定要更换repl_password用自己的强密码。 %指定该用户的源IP可以是任何东西,但你可以替代%用你的MinionMySQL服务器的私有IP地址, 的mysql-2,此用户特定的服务器限制的连接:

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

不要退出MySQL控制台!

导出MySQL Master的备份

接下来,我们将导出一个MySQL主数据库的备份,导入到我们的从数据库,所以在我们开始复制之前,它将是相同的。 我们需要锁定数据库,这样我们可以做一个数据转储。 在关于MySQL-1你的MySQL控制台,运行如下命令:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

现在,从你的命令外壳,运行下面的命令到主MySQL服务器上导出数据库备份到一个名为masterdump.sql

mysqldump --lock-all-tables -u root -p --all-databases > masterdump.sql

您masterdump.sql文件复制到你的Minion服务器,MySQL-2,使用scp:

scp masterdump.sql user@mysql_2_private_IP:/tmp

再次进入mysql-1的MySQL控制台:

mysql -u root -p

在MySQL提示符处,解锁数据库:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

现在运行此语句以打印出您需要配置MySQL从属的信息:

SHOW MASTER STATUS;
Output:
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      408 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

请记文件位置的值,因为配置从属服务器的时候,你会需要它们。 让我们切换到MySQL-2现在。

配置MySQL从设备

现在,我们将要将主数据库导入我们的从数据库,以便同步它们,为复制做好准备。

在MySQL-2,运行此命令导入masterdump.sql文件:

mysql -u root -p < /tmp/masterdump.sql

接下来,我们将设置MySQL-2作为复制从服务器在MySQL-2,编辑MySQL配置文件:

sudo vi /etc/mysql/my.cnf

搜索以下两行:

bind-address            = 127.0.0.1
#server-id              = 1
  • 绑定地址 :即MySQL将监听的IP地址。 设置到MySQL-2的私有IP地址
  • 服务器ID:唯一的服务器ID。 由于这是主服务器,此值更改为2并取消这条线

这两行应该看起来像这样(请务必使用数据库服务器的私有IP地址替代):

bind-address           = mysql_2_private_IP
server-id              = 2

保存并退出。 重新启动MySQL以使更改生效:

sudo service mysql restart

进入MySQL控制台:

mysql -u root -p

接下来,我们将从机连接到主机。 需要以下五个值:

  • MASTER_HOST:设置到mysql-1的私有IP
  • MASTER_USER:设置为我们的高手,REPL创建复制用户
  • MASTER_PASSWORD:设置的密码REPL,应该用自己的密码被取代
  • MASTER 日志文件 :设置为当您运行列出的“文件” SHOW MASTER STATUS;你的主MySQL服务器上
  • 日志 POS:设置为当您运行列出的“位置” SHOW MASTER STATUS;你的主MySQL服务器上

以下语句将您的从服务器连接到主服务器,并且需要使用适当的值替换所有高亮显示的字段:

CHANGE MASTER TO
MASTER_HOST='mysql_1_private_IP',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=408;

如果该语句运行正常,请运行此命令以启动从连接:

START SLAVE;

你的mysql-2服务器现在应该连接为Minion! 运行以下命令检查复制是否正常:

SHOW SLAVE STATUS\G

撤消从用户的写权限

这是可选的,因为HyperDB插件可以被配置为从你的Minion数据库服务器只读的,但你可能要撤消对你的Minion数据库从wordpressuser数据库用户的写权限(因为更新你的Minion不会被复制到你的主人,如果你不小心更新你的slave不知何故)。

在MySQL-2,从你的MySQL控制台运行下面的语句列出你的数据库用户:

SELECT user,host FROM mysql.user;
Output:
+------------------+----------------+
| user             | host           |
+------------------+----------------+
| repl             | %              |
| wordpressuser    | wordpress_1_IP |
| wordpressuser    | wordpress_2_IP |
...

您应该看到类似于上面的代码块的输出。 您可以使用以下命令查看每个用户的权限:

SHOW GRANTS FOR wordpressuser@wordpress_1_IP;

在这个例子中,我们为每个WordPress的服务器都有一个wordpressuser,所以我们将撤销插入更新 ,并从他们每个人的删除权限(“WordPress的”是我们在这个例子中数据库的名称):

REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_1_private_IP';
REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_2_private_IP';
FLUSH PRIVILEGES;

现在您的MySQL复制设置完成。 让我们继续设置WordPress正确使用两个数据库服务器。

安装和配置HyperDB

我们将使用HyperDB确定在何处发送更新(您的主数据库)和读请求(您的主和从)。 让我们从WordPress插件目录下载到你的主目录(也安装zip / unzip来取消存档):

cd ~; wget http://downloads.wordpress.org/plugin/hyperdb.zip
sudo apt-get install zip
unzip hyperdb.zip

它应该被解包到你的主目录中名为“hyperdb”的目录。 将示例配置文件复制到WordPress安装(用您的WordPress安装路径突出显示),然后将其打开以进行编辑:

cp ~/hyperdb/db-config.php /var/www/example.com/
vi /var/www/example.com/db-config.php

寻找第二次出现 DB_HOST ,一些评论描述建立一个Minion,它应该看起来就像下面后应直接:

$wpdb->add_database(array(
        'host'     => DB_HOST,     // If port is other than 3306, use host:port.
        'user'     => DB_USER,
        'password' => DB_PASSWORD,
        'name'     => DB_NAME,
        'write'    => 0,
        'read'     => 1,
        'dataset'  => 'global',
        'timeout'  => 0.2,
));

DB 主机第一次出现的定义主数据库服务器,并且第二次出现限定从属数据库服务器(由表示'write' => 0, 更换的`DB HOST 第二次出现 with DB SLAVE 1`:

        'host'     => DB_SLAVE_1,     // If port is other than 3306, use host:port.

保存并退出。 接下来,您将要定义DB_SLAVE_1您在wp-config.php文件,这将HyperDB作为从数据库主机使用。 打开wp-config.php进行编辑:

vi /var/www/example.com/wp-config.php

查找定义行DB_HOST并添加下它下面的行,替换你的Minion的私有IP地址( 的mysql-2):

define('DB_SLAVE_1', 'mysql_2_private_IP');

然后保存并退出。

通过复制完成HyperDB安装db.php文件到wp-content目录在你的WordPress安装,然后再禁用它的写访问:

cp ~/hyperdb/db.php /var/www/example.com/wp-content/
sudo chmod a-w /var/www/example.com/wp-content/db.php

然后更新你的WordPress文件的所有权,以相应的值(在本教程中,我们一直在使用www-data ,为用户/组所有权):

sudo chown -R www-data:www-data /var/www/example.com/

现在,您的WordPress读取请求将由主数据库和从数据库提供,而更新将发送到您的主数据库(然后将被复制到您的从数据库)。

结论

现在您已经完成了MySQL复制和HyperDB设置,您的数据库环境将能够处理增加的读取流量,即更多的并发用户! 记住,如果你想扩展你的数据库服务能力,你可以添加更多的MySQL从属。

作者:Mitchell Anicas