介绍
在本教程中,我们将教你如何使用主奴的数据库复制和HyperDB插件来扩展您的WordPressMySQL数据库服务器设置,以这种方式将更多的数据库服务器添加到您的环境中,使您的WordPress应用程序能够从多个数据库服务器中读取,提高读取性能。
MySQL 复制收集了处理频繁阅读和不频繁写作的系统的性能优势,就像大多数 WordPress 安装一样。 通过使用一个单主与多个奴隶设置,您可以添加更多的奴隶来扩展您的系统,直到您失去了网络带宽或您的主人无法处理更新负载。
我们假设您的安装包括两个负载均衡的WordPress应用程序服务器连接到单独的MySQL数据库服务器(请参阅有关如何设置此项教程的先决条件)。
前提条件
在继续使用本教程之前,您应该完成两个教程或具有类似的环境:
如何设置远程数据库以优化网站性能与MySQL
- 可选, [如何在Ubuntu 14.04上使用HAProxy作为WordPress应用程序服务器的4层负载平衡器
在遵循这些教程后,要设置WordPress有两个负载均衡的Web应用程序服务器和一个单独的数据库服务器,你应该有四个VPS。
- haproxy-www:您的HAProxy服务器为层 4负载平衡您的WordPressWeb应用服务器. 这是进入您的网站的入口点
- wordpress-1:您的第一个WordPressWeb应用服务器
- wordpress-2:您的第二个WordPressWeb应用服务器
- mysql-1:您的MySQL服务器为WordPress
也就是说,你的环境应该看起来像这样:
除了你的当前环境,我们还需要一个额外的VPS在本教程中。
- mysql-2:你的奴隶MySQL数据库服务器
我们的目标
当我们完成本教程时,您将有两个数据库服务器在主奴隶配置中复制。您的WordPress服务器将选择性地写给您的主人,并从您的主人和奴隶数据库中读取,使用HyperDB WordPress插件。
请记住,您不需要负载均衡的应用程序服务器(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)
注意 File 和 Position 的值,因为您在配置你的奴隶服务器时需要它们。
创建 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用户,所以我们会从每个服务器中撤销 insert、 update 和 delete 特权(这个例子中的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奴隶。