如何在 Ubuntu 14.04 上通过 MySQL 复制优化 WordPress 性能

介绍

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

MySQL 复制收集了处理频繁阅读和不频繁写作的系统的性能优势,就像大多数 WordPress 安装一样。 通过使用一个单主与多个奴隶设置,您可以添加更多的奴隶来扩展您的系统,直到您失去了网络带宽或您的主人无法处理更新负载。

我们假设您的安装包括两个负载均衡的WordPress应用程序服务器连接到单独的MySQL数据库服务器(请参阅有关如何设置此项教程的先决条件)。

前提条件

在继续使用本教程之前,您应该完成两个教程或具有类似的环境:

如何设置远程数据库以优化网站性能与MySQL

](https://www.digitalocean.com/community/articles/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql)

  • 可选, [如何在Ubuntu 14.04上使用HAProxy作为WordPress应用程序服务器的4层负载平衡器

](https://www.digitalocean.com/community/articles/how-to-use-haproxy-as-a-layer-4-load-balancer-for-wordpress-application-servers-on-ubuntu-14-04)

在遵循这些教程后,要设置WordPress有两个负载均衡的Web应用程序服务器和一个单独的数据库服务器,你应该有四个VPS。

  • haproxy-www:您的HAProxy服务器为层 4负载平衡您的WordPressWeb应用服务器. 这是进入您的网站的入口点
  • wordpress-1:您的第一个WordPressWeb应用服务器
  • wordpress-2:您的第二个WordPressWeb应用服务器
  • mysql-1:您的MySQL服务器为WordPress

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

WordPress and Separate MySQL Database Server

除了你的当前环境,我们还需要一个额外的VPS在本教程中。

  • mysql-2:你的奴隶MySQL数据库服务器

我们的目标

当我们完成本教程时,您将有两个数据库服务器在主奴隶配置中复制。您的WordPress服务器将选择性地写给您的主人,并从您的主人和奴隶数据库中读取,使用HyperDB WordPress插件。

Master-Slave Database Replication

请记住,您不需要负载均衡的应用程序服务器(wordpress-1/wordpress-2)来遵循本教程,如果您想要的话,您可以添加更多的奴隶数据库。

设置 MySQL 主奴隶复制

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

创建 MySQL 奴隶 VPS, mysql-2

您将想要创建一个新的VPS,它将作为MySQL奴隶服务器 - 为参考目的,我们将把这个服务器称为 mysql-2

在 mysql-2 上,安装 MySQL 软件:

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

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

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

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

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

1sudo vi /etc/mysql/my.cnf

搜索以下三条线:

bind-address            = mysql_1_private_IP
# server-id              = 1
# log_bin                = /var/log/mysql/mysql-bin.log
  • bind-address:MySQL会收听的IP地址.这应该已经设置为 _mysql-1_的私人IP地址从您的原始设置
  • server-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:

1sudo service mysql restart

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

1mysql -u root -p

创建一个用户,将被我们的奴隶MySQL服务器用于复制目的. 我们将这个用户称为 repl. 请确保用自己的强有力的密码代替repl_password。 该%规定这个用户的源IP可以是任何东西,但你可以用你的奴隶MySQL服务器的私人IP地址代替%, mysql-2,以限制与这个用户连接到那个特定服务器:

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

不要离开MySQL控制台!

导出 MySQL Master 备份

接下来,我们将想要导出 MySQL 主数据库的备份,导入到我们的奴隶数据库,以便在我们开始复制之前保持相同。

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

现在,从您的命令壳运行以下命令,将主MySQL服务器上的数据库备份导出到名为masterdump.sql的文件:

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

将你的 masterdump.sql 文件复制到你的奴隶服务器 mysql-2,使用 scp:

scp masterdump.sql user@mysql_2_private_IP:/tmp

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

1mysql -u root -p

在 MySQL 提示下,解锁您的数据库:

1SET GLOBAL read_only = OFF;
2UNLOCK 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)

注意 FilePosition 的值,因为您在配置你的奴隶服务器时需要它们。

创建 MySQL 奴隶

现在我们将要将主数据库导入我们的奴隶,以便在准备复制时同步它们。

** 在 mysql-2**上,运行此命令来导入 masterdump.sql 文件:

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

接下来,我们将设置 mysql-2 作为复制奴隶。 ** 在 mysql-2** 上,编辑 MySQL 配置文件:

1sudo vi /etc/mysql/my.cnf

搜索以下两条线:

bind-address            = 127.0.0.1
# server-id              = 1
  • bind-address:MySQL会收听的IP地址. 设置为 _mysql-2_的私人IP地址
  • server-id:独特的服务器ID。

两个行应该是这样的(请确保用数据库服务器的私人IP地址取代所突出的地址):

bind-address           = mysql_2_private_IP
server-id              = 2

保存和停止. 重新启动 MySQL 以使更改生效:

1sudo service mysql restart

输入 MySQL 控制台:

1mysql -u root -p

接下来,我们将将奴隶连接到主人,需要以下五个值:

  • MASTER_HOST:设置为 mysql-1的私人IP
  • MASTER_USER:设置为我们在主机上创建的复制用户, repl
  • MASTER_PASSWORD:设置为 _repl_的密码,应该用自己的密码取代
  • MASTER_LOG_FILE:设置为运行SHOW MASTER STATUS时列出的文件;在您的主机MySQL服务器
  • MASTER_LOG_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;

如果该语句运行正确,请运行此命令来启动奴隶连接:

1START SLAVE;

您的 mysql-2 服务器现在应该作为一个奴隶连接! 运行以下命令来检查复制是否正在工作:

1SHOW SLAVE STATUS\G

取消从奴隶用户的写作特权

这是可选的,因为 HyperDB 插件可以配置为仅从你的奴隶数据库服务器读取,但你可能想要撤销你的 wordpressuser 数据库用户的写权限在你的奴隶数据库(因为更新到你的奴隶不会复制到你的主人,如果你意外地更新你的奴隶以某种方式)。

** 在 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服务器都有一个WordPress用户,所以我们会从每个服务器中撤销 insertupdatedelete 特权(这个例子中的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来确定发送更新的地方(您的主数据库)和阅读请求(您的主人和奴隶)。

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

它应该被未存档到名为hyperdb的目录中,在您的主目录中。 将样本配置文件复制到您的WordPress安装(以WordPress安装路径取代突出的文件),然后打开以进行编辑:

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

寻找DB_HOST的 **第二次发生,这应该是在描述设置一个奴隶的评论后直接出现的,它应该看起来完全如下:

$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_HOST 的第一個出現定義了主資料庫伺服器,第二個出現定義了奴隸資料庫伺服器(用 `'write' => 0,' 表示)。

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

接下来,您将在您的 wp-config.php 中定义DB_SLAVE_1,将 HyperDB 用作奴隶数据库主机。

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

找到定义DB_HOST的行,并在其下方添加下列行,取代你的奴隶的私人IP地址(mysql-2):

define('DB_SLAVE_1', 'mysql_2_private_IP');

然后保存和退出。

完成 HyperDB 安装,将 db.php 文件复制到 WordPress 安装中的 wp-content 目录中,然后禁用写入:

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奴隶。

By Mitchell Anicas
Published At
Categories with 技术
comments powered by Disqus