介绍
在本教程中,我们将教您如何使用主从数据库复制和适用于 WordPress 的 HyperDB 插件来扩展您的 WordPress MySQL 数据库服务器设置。 以这种方式向您的环境添加更多数据库服务器允许您的 WordPress 应用程序从多个数据库服务器读取,从而提高读取性能。
对于处理频繁读取和不频繁写入的系统(如大多数 WordPress 安装),MySQL 复制可以获得最大的性能优势。 通过使用具有多从设置的单主服务器,您可以添加更多从服务器来扩展您的系统,直到您耗尽网络带宽或您的主服务器无法处理更新负载。 如果您愿意,您可以通过重复本教程复制部分的“从属”部分来添加多个从属。
我们假设您的设置包括两个负载平衡的 WordPress 应用程序服务器,它们连接到单独的 MySQL 数据库服务器(有关如何设置的教程,请参阅先决条件)。 遵循本教程并不一定需要负载平衡的应用程序服务器,但您的 MySQL 数据库服务器应该与应用程序服务器分开。
先决条件
在继续本教程之前,您应该已经完成了两个教程或具有类似的环境:
遵循这些教程后,要使用两个负载平衡的 Web 应用程序服务器和一个单独的数据库服务器设置 WordPress,您应该有四个 VPS。 因为我们将处理几个 VPS,出于参考目的,我们将您现有的四个 VPS 称为以下内容:
- haproxy-www:您的 HAProxy 服务器,用于第 4 层负载平衡您的 WordPress Web 应用程序服务器。 这是您网站的入口点
- wordpress-1:你的第一个 WordPress Web 应用服务器
- wordpress-2:您的第二个 WordPress Web 应用服务器
- mysql-1:你的 WordPress MySQL 服务器
也就是说,您的环境应如下所示:
除了您当前的环境,在本教程中我们还需要一个额外的 VPS。 我们称之为:
- mysql-2:你的从 MySQL 数据库服务器
我们的目标
当我们完成本教程后,您将有两个数据库服务器将在主从配置中进行复制。 通过使用 HyperDB WordPress 插件,您的 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 安装的 root 密码。 接下来,我们将在我们的 MySQL 主服务器上进行配置。
将现有 MySQL 服务器配置为主服务器
第一步是使用复制主配置设置现有的 MySQL 数据库服务器 mysql-1。
在mysql-1上,编辑MySQL配置文件:
sudo vi /etc/mysql/my.cnf
搜索以下三行:
绑定地址 = 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 地址):
绑定地址 = mysql_1_private_IP服务器 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 可以是任何东西,但您可以将 %
替换为从 MySQL 服务器的私有 IP 地址 mysql-2 , 将与该用户的连接限制到该特定服务器:
CREATE USER 'repl'@' % ' IDENTIFIED BY ' repl_password '; 授予复制奴隶 . TO 'repl'@'%';
不要退出 MySQL 控制台!
导出 MySQL Master 的备份
接下来,我们将要导出 MySQL 主数据库的备份,以导入我们的从数据库,以便在开始复制之前它是相同的。 我们需要锁定数据库,以便进行数据转储。 在 mysql-1 上的 MySQL 控制台中,运行以下命令:
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON; EXIT
现在,从您的命令 shell 运行以下命令,将您的 MySQL 主服务器上的数据库备份导出到一个名为 masterdump.sql
的文件中:
mysqldump --lock-all-tables -u root -p --all-databases > masterdump.sql
使用 scp 将 masterdump.sql 文件复制到从属服务器 mysql-2:
scp masterdump.sql用户@ mysql_2_private_IP :/tmp
再次进入 mysql-1 的 MySQL 控制台:
mysql -u root -p
在 MySQL 提示符下,解锁您的数据库:
SET GLOBAL read_only = OFF; UNLOCK TABLES;
现在运行此语句以打印出配置 MySQL 从站所需的信息:
显示主状态;
输出:±-----------------±------------±----------------±----- ------------+ | 文件 | 职位 | Binlog_Do_DB | Binlog_Ignore_DB | ±-----------------±---------±----------------±-------- ----------+ | mysql-bin.000001 | 408 | | | ±-----------------±---------±----------------±-------- ----------+ 1 行(0.00 秒)
记下 File 和 Position 的值,因为在配置从服务器时需要它们。 现在让我们切换到 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
搜索以下两行:
绑定地址 = 127.0.0.1 #server-id = 1
- bind-address:MySQL 将监听的 IP 地址。 设置为mysql-2的私有IP地址
- server-id:唯一的服务器ID。 由于这是主服务器,因此将此值更改为
2
并取消注释此行
这两行应该如下所示(确保将突出显示的部分替换为数据库服务器的私有 IP 地址):
绑定地址 = mysql_2_private_IP服务器 ID = 2
保存并退出。 重新启动 MySQL 以使更改生效:
sudo service mysql restart
进入 MySQL 控制台:
mysql -u root -p
接下来,我们将把从站连接到主站。 需要以下五个值:
- MASTER_HOST:设置为mysql-1的私有IP
- MASTER_USER:设置为我们在master上创建的复制用户,repl
- MASTER_PASSWORD:设置为repl的密码,用自己的密码代替
- MASTER_LOG_FILE:设置为您在 MySQL 主服务器上运行
SHOW MASTER STATUS;
时列出的“文件” - MASTER_LOG_POS:设置为您在主 MySQL 服务器上运行
SHOW MASTER STATUS;
时列出的“位置”
以下语句将您的从服务器连接到您的主服务器,它要求您将所有突出显示的字段替换为适当的值:
将 MASTER 更改为 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 服务器现在应该作为从服务器连接了! 运行以下命令以检查复制是否正常:
SHOW SLAVE STATUS\G
撤销从属用户的写权限
这是可选的,因为 HyperDB 插件可以配置为仅从您的从数据库服务器读取,但您可能希望撤销从数据库上 wordpressuser 数据库用户的写入权限(因为更新您的从数据库不会如果您不小心以某种方式更新了您的奴隶,请复制到您的主人)。
在 mysql-2 上,从您的 MySQL 控制台运行以下语句以列出您的数据库用户:
从 mysql.user 中选择用户、主机;
输出:±-----------------±-------------+ | 用户 | 主持人 | ±-----------------±---------------+ | 回复 | % | | wordpress 用户 | wordpress_1_IP | | wordpress 用户 | wordpress_2_IP | …
您应该会看到类似于上述代码块的输出。 您可以使用以下命令查看每个用户的权限:
为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 '; 同花顺特权;
现在您的 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
的 第二次出现 ,它应该直接在一些描述设置从站的注释之后,它应该看起来完全像下面这样:
$wpdb->add_database(array( 'host' => DB_HOST , // 如果端口不是 3306,则使用 host:port。 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 0, 'read' => 1, 'dataset' => 'global', 'timeout' => 0.2 , ));
第一次出现的 DB_HOST 定义主数据库服务器,第二次出现定义从数据库服务器(由 'write' => 0,
表示)。 将第二次出现的 DB_HOST
替换为 DB_SLAVE_1
:
'host' => DB_SLAVE_1 , // 如果端口不是 3306,则使用 host:port。
保存并退出。 接下来,您需要在 wp-config.php 中定义 DB_SLAVE_1
,HyperDB 将使用它作为从数据库主机。 打开 wp-config.php 进行编辑:
vi /var/www/example.com /wp-config.php
找到定义 DB_HOST
的行并在其下添加以下行,替换您从属设备的私有 IP 地址 (mysql-2):
定义('DB_SLAVE_1',' mysql_2_private_IP ');
然后保存退出。
通过将 db.php
文件复制到 WordPress 安装中的 wp-content
目录来完成 HyperDB 安装,然后禁用对其的写访问:
cp ~/hyperdb/db.php /var/www/example.com /wp-content/ sudo chmod aw /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 从属服务器。