介绍
在本教程中,我们将教您如何使用主从数据库复制和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
也就是说,你的环境应该看起来像这样:
除了当前的环境,我们将在本教程中需要一个额外的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/ sudo chmod a-w /var/www/example.com/db.php
然后更新你的WordPress文件的所有权,以相应的值(在本教程中,我们一直在使用www-data
,为用户/组所有权):
sudo chown -R www-data:www-data /var/www/example.com/
现在,您的WordPress读取请求将由主数据库和从数据库提供,而更新将发送到您的主数据库(然后将被复制到您的从数据库)。
结论
现在您已经完成了MySQL复制和HyperDB设置,您的数据库环境将能够处理增加的读取流量,即更多的并发用户! 记住,如果你想扩展你的数据库服务能力,你可以添加更多的MySQL从属。