介绍
如果您在单个 VPS 上运行 Web 应用程序和数据库(例如 LAMP 堆栈),您可能会遇到需要扩展环境以处理更多流量的情况。 开始扩展环境的一个好方法是将数据库服务器迁移到同一数据中心中的另一个单独的 VPS。
在本指南中,我们将讨论如何将现有的 MySQL 数据库从应用程序服务器中迁移出来。 因为每个应用程序都有自己的配置怪癖,关于数据库连接和交互,我们将演示使用 WordPress 的迁移过程,但您可以将本指南调整到使用 MySQL 作为其数据库的任何其他应用程序。
注意: 如果您想使用单独的数据库服务器对应用程序进行初始设置,因此没有要保存的现有数据,您应该阅读以下链接教程而不是这个:如何使用 MySQL 设置远程数据库以优化站点性能。
先决条件
本教程假设您有一些 Web 应用程序和数据库驻留在同一台服务器上,如下图所示:
此类设置的一个示例是:如何在 Ubuntu 14.04 上安装 Wordpress
从现在开始,我们将您现有的服务器称为 lamp-1。
您将需要创建一个额外的具有专用网络的 VPS,它将作为您单独的 MySQL 服务器。 出于参考目的,我们将此服务器称为 mysql-1。
我们的目标
完成本教程后,我们想要使用我们原来的 lamp-1 服务器并将其数据库迁移到新服务器 mysql-1。
实现目标的任务
为了实现我们的目标,我们需要完成两项主要任务:
- 将现有数据库迁移到新服务器
- 重新配置应用程序以连接到新数据库
让我们开始迁移现有数据库吧!
将现有数据库迁移到新服务器
创建新的 MySQL VPS
您将需要创建新的 VPS 作为您的新 MySQL 数据库服务器——再次,为了参考目的,我们将此服务器称为 mysql-1。 立即创建新的 VPS。 如果您没有在服务器上进行的标准设置,您可能需要按照此链接的步骤 1-4 进行操作:使用 Ubuntu 14.04 进行初始服务器设置
安装和配置 MySQL 服务器
创建新数据库 VPS 后,连接到它并安装 MySQL 服务器。
在 mysql-1 上,使用以下命令更新 apt:
sudo apt-get update
然后运行以下 apt 命令来安装 MySQL 服务器:
sudo apt-get install mysql-server
输入 MySQL 安装的 root 密码(您可以使用与原始 MySQL 服务器相同的密码)。 然后运行以下命令创建默认的 MySQL 数据库表:
sudo mysql_install_db
接下来,运行以下命令完成 MySQL 安装:
sudo mysql_secure_installation
您可以对重置 root 密码(您刚刚设置的密码)回复“否”,对其他所有内容回复“是”。
目前,您的新 MySQL 数据库配置为仅侦听 localhost 或 127.0.0.1。 我们需要配置您的数据库服务器以侦听其私有 IP 地址,以便您的应用程序服务器 lamp-1 可以连接到它。 打开您的 MySQL 配置进行编辑:
sudo vi /etc/mysql/my.cnf
在 MySQL 配置文件中找到以下行:
bind-address = 127.0.0.1
将 127.0.0.1
替换为您的数据库服务器的私有 IP 地址:
绑定地址 = mysql_1_private_IP
如果您有任何其他 MySQL 配置更改要进行(例如在 lamp-1 VPS 上配置的非默认设置),请立即进行,然后保存并退出。 要使这些更改生效,请使用以下命令重新启动 mysql:
sudo service mysql restart
现在您的新服务器 mysql-1 正在其私有 IP 地址上侦听 MySQL 流量。 接下来,我们将致力于导出您的原始数据库。
原始数据库的导出备份
(可选),您可以停止应用程序服务器,以防止在迁移过程中尝试更新现有数据库。 无论如何,数据库都会被锁定,但这是您可能需要考虑的事情。
接下来,我们将要导出原始 MySQL 数据库的备份,该备份将用于迁移到我们的新数据库。 我们需要锁定数据库,以便进行数据转储。 注意: 锁定您的数据库将阻止对其进行更新,因此您的应用程序将只能执行只读操作,直到您完成本教程的其余部分。
在lamp-1上,进入MySQL控制台:
mysql -u root -p
要将数据库锁定在 lamp-1 上,请从 MySQL 控制台运行:
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON; EXIT
现在,从您的命令 shell 中,运行以下命令,将原始 MySQL 服务器上的数据库备份导出到名为 dump.sql
的文件中:
mysqldump --lock-all-tables -u root -p --all-databases > dump.sql
使用 scp 将 dump.sql 文件复制到新的数据库服务器 mysql-1:
scp dump.sql用户@ mysql_1_private_IP :/tmp
由于我们将不再在您的原始服务器上使用 MySQL,因此我们可以将其锁定。 如果要解锁,在MySQL控制台中运行以下命令:
SET GLOBAL read_only = OFF; UNLOCK TABLES;
将原始数据库导入新服务器
现在我们要将您的原始数据库导入 mysql-1,以便保留所有现有数据。
在mysql-1上,运行以下命令导入dump.sql
文件:
mysql -u root -p < /tmp/dump.sql
此时,您所有的原始数据库数据和用户都已复制到您的新数据库服务器 mysql-1。 下一步是创建与原始用户具有相同权限的新数据库用户。
创建用户以允许来自 Web 应用程序服务器的连接
由于 MySQL 管理其用户的方式(它们被标识为用户名和源主机对),您必须使用与应用程序服务器的私有 IP 地址匹配的“主机”值创建新用户。
进入 MySQL 控制台:
mysql -u root -p
输入以下语句以列出所有数据库用户和主机:
从 mysql.user 中选择用户、主机;
示例输出:±-----------------±----------+ | 用户 | 主持人 | ±-----------------±----------+ | 根 | 127.0.0.1 | | 根 | ::1 | | debian 系统维护 | 本地主机 | | 根 | 本地主机 | | wordpress 用户| 本地主机| ±-----------------±---------+ 5 行(0.00 秒)
在我们的示例输出中,我们看到有一个名为 wordpressuser
的用户,其源主机是 localhost
。 假设“wordpressuser”是我们的应用程序用户。 因为应用程序和数据库现在位于不同的服务器上,所以应用程序将不再从“localhost”连接。 我们需要创建一个名为 wordpressuser
的新用户,并将其 host 值设置为应用程序服务器 lamp-1 的私有 IP 地址,以允许应用程序连接.
创建一个具有相同名称的新用户,但将其主机更改为您的应用程序服务器的私有 IP 地址,lamp-1。 此外,请确保您的密码与用户的原始密码匹配(用您自己的替换所有突出显示的项目):
创建用户' wordpressuser '@' lamp_1_private_IP'IDENTIFIED BY'密码';
对于您要重新创建的每个用户,在我们的例子中是 wordpressuser,运行以下语句以输出其权限(我们需要稍后分配):
显示wordpressuser的授权 @localhost ;
示例输出:
记下 GRANT USAGE ON *.*
之后的行,因为您将使用它的修改版本向您刚刚创建的用户授予权限。 例如,根据原始用户的授权,我们将运行以下语句来为我们的新用户分配相同的授权(在本例中,wordpress
是数据库名称)。 它是上面输出的副本,但是 localhost
已更改为我们的 lamp-1 的私有 IP 地址:
授予所有权限<span class="highlight">wordpress</span> .* TO'wordpressuser '@' lamp_1_private_IP ';
现在显示新用户的权限:
为wordpressuser @ lamp_1_private_IP显示授权;
示例输出:
为适当的数据库用户更新主机值后,运行以下语句以使这些更改生效并退出 MySQL 控制台:
FLUSH PRIVILEGES; EXIT
现在新的数据库服务器已经迁移和配置好了,您必须更新应用程序配置才能连接到新的数据库服务器!
更新应用程序配置
最后一步是更新您的应用程序配置以指向您的新数据库服务器 mysql-1。 您的配置位置将根据您的应用程序和安装位置而有所不同,因此我们将使用 WordPress 作为示例。
WordPress 示例配置
WordPress 将其数据库连接配置存储在其安装目录中名为 wp-config.php 的文件中(例如 /var/www/html/
)。
打开 WordPress 配置:
sudo vi /var/www/html/wp-config.php
查找以下行:
/** MySQL hostname */ define('DB_HOST', 'localhost');
将 localhost
替换为新数据库服务器的私有 IP 地址 mysql-1。 它应该看起来像这样(替换突出显示的):
定义('DB_HOST',' mysql_1_private_IP ');
保存并退出。 现在像平常一样访问您的应用程序(lamp-1 的公共 IP 地址或域名)。 它应该看起来和以前完全一样,但现在它正在连接到新服务器上的 MySQL 数据库,mysql-1!
其他应用
如果您正在运行不同的应用程序,只需更新应用程序的数据库连接配置以使用私有 IP 地址或名称,而不是“localhost”或“127.0.0.1”。 根据您的应用程序处理其数据库连接的方式,您可能需要重新启动应用程序以连接到新数据库。
在原始服务器上停止 MySQL
在您确认您的应用程序可以在新的独立数据库服务器上正常工作后,您将需要清理原始 MySQL 数据库服务器。 最低限度,您会想要停止 MySQL 服务,因此它会停止使用资源。
On lamp-1:运行以下命令停止 MySQL 并将其设置为 NOT start on boot:
sudo service mysql stop sudo sh -c "echo 'manual' > /etc/init/mysql.override"
结论
现在您的数据库服务器已与应用程序服务器分离,您的环境应该能够处理更多流量,因为更多资源专用于每个组件。 此外,您的环境现在可以更好地为其他改进做好准备,例如负载平衡和数据库复制。
以下是一些关于可扩展性主题的教程: