介绍
如果您正在运行 Web 应用程序和数据库,比如 LAMP 堆栈,在单个 VPS 上,您可能会遇到想要扩展环境以处理更多的流量的情况。
在本指南中,我们将讨论如何将现有的MySQL数据库迁移到应用程序服务器之外,因为每个应用程序都有其自己的配置奇点,就数据库连接和互动而言,我们将展示WordPress的迁移过程,但您可以将此指南适应任何使用MySQL作为其数据库的其他应用程序。
** 注意:** 如果您想使用单独的数据库服务器进行应用程序的初始设置,因此没有现有数据可保存,您应该阅读以下链接的教程,而不是这个: 如何设置远程数据库以优化网站性能与MySQL。
前提条件
本教程假定您有某些Web应用程序和数据库,它们位于同一个服务器上,如下图所示:
此类设置的例子是: 如何在Ubuntu 14.04上安装Wordpress
从现在开始,我们将将您的现有服务器称为 lamp-1。
您需要创建一个额外的VPS,具有私人网络,它将作为您的单独的MySQL服务器。
我们的目标
当我们完成本教程时,我们想要采取我们的原始 lamp-1 服务器并将其数据库迁移到新的服务器 mysql-1。
任务来实现我们的目标
有两个主要任务,我们需要完成实现我们的目标:
- 将现有数据库迁移到新服务器
- 重新配置应用程序以连接到新数据库
让我们开始迁移现有数据库!
将现有数据库迁移到新服务器
创建新的MySQL VPS
您将想要创建新的VPS,这将是您的新的MySQL数据库服务器 - 再次,为参考目的,我们将这个服务器称为 mysql-1. 现在创建新的VPS。
安装和配置MySQL服务器
创建新数据库 VPS 后,连接到它并安装 MySQL Server。
在 mysql-1 上,用以下命令更新 apt:
1sudo apt-get update
然后运行以下 apt 命令来安装 MySQL Server:
1sudo apt-get install mysql-server
输入您的MySQL安装的根密码(您可以使用与原始MySQL服务器相同的密码),然后运行以下命令创建默认MySQL数据库表:
1sudo mysql_install_db
接下来,运行以下命令来完成MySQL安装:
1sudo mysql_secure_installation
您可以回答不
重置根密码(您刚刚设置的密码),并对其他所有事情说是
。
目前,您的新 MySQL 数据库已配置为只收听 localhost,或 127.0.0.1,我们需要配置您的数据库服务器以收听其私有 IP 地址,以便您的应用程序服务器 lamp-1 可以连接到它。
1sudo vi /etc/mysql/my.cnf
在您的 MySQL 配置文件中找到以下行:
1bind-address = 127.0.0.1
用您的数据库服务器的私人 IP 地址取代127.0.0.1
:
bind-address = mysql_1_private_IP
如果您需要进行其他 MySQL 配置更改(例如在您的 lamp-1 VPS 上配置的非默认设置),请现在保存并停止操作。
1sudo service mysql restart
现在你的新服务器 mysql-1 正在收听其私人 IP 地址上的 MySQL 流量。
出口原始数据库备份
可选,您可以停止应用程序服务器,以防止在迁移过程中尝试更新现有数据库。
接下来,我们将想要导出您的原始MySQL数据库的备份,这将被用来迁移到我们的新数据库. 我们需要锁定数据库,以便我们可以进行数据卸载。 ** 注意:**锁定您的数据库将阻止更新,所以您的应用程序只能够执行只读操作,直到您完成本教程的其余部分。
** 在 lamp-1** 上,输入 MySQL 控制台:
1mysql -u root -p
要在 lamp-1 上锁定您的数据库,请从 MySQL 控制台运行此操作:
1FLUSH TABLES WITH READ LOCK;
2SET GLOBAL read_only = ON;
3EXIT
现在,从您的命令壳运行以下命令,将原始MySQL服务器上的数据库备份导出到名为dump.sql
的文件:
1mysqldump --lock-all-tables -u root -p --all-databases > dump.sql
将您的 dump.sql 文件复制到您的新数据库服务器 mysql-1,使用 scp:
scp dump.sql user@mysql_1_private_IP:/tmp
由于我们将不再在您的原始服务器上使用MySQL,我们可以将其锁定。 _ 如果您想解锁它_,请在MySQL控制台中运行以下命令:
1SET GLOBAL read_only = OFF;
2UNLOCK TABLES;
将原始数据库导入新服务器
现在我们将想将您的原始数据库导入 mysql-1 以便保存所有现有数据。
** 在 mysql-1** 上,运行此命令来导入 dump.sql
文件:
1mysql -u root -p < /tmp/dump.sql
在此时,您的所有原始数据库数据和用户都已被复制到您的新数据库服务器 mysql-1。
创建用户允许从 Web 应用程序服务器连接
由于MySQL管理用户的方式(它们被识别为用户名和源主机对),您将需要创建具有匹配应用程序服务器私人IP地址的主机
值的新用户。
输入 MySQL 控制台:
1mysql -u root -p
输入以下语句列出所有数据库用户和主机:
SELECT user,host FROM mysql.user;
Example Output: +------------------+-----------+ | user | host | +------------------+-----------+ | root | 127.0.0.1 | | root | ::1 | | debian-sys-maint | localhost | | root | localhost | | wordpressuser | localhost | +------------------+-----------+ 5 rows in set (0.00 sec)
在我们的示例输出中,我们看到有一个名为wordpressuser
的用户,其源主机是localhost
。假设wordpressuser
是我们的应用程序用户. 由于应用程序和数据库现在在单独的服务器上,应用程序将不再连接到localhost
。 我们需要创建一个名为wordpressuser
的新用户,其 host 值设置为应用程序服务器 lamp-1 的私人 IP 地址,以允许应用程序连接。
创建一个具有相同名称的新用户,但将其主机更改为应用程序服务器的私人IP地址 lamp-1。
CREATE USER 'wordpressuser'@'lamp_1_private_IP' IDENTIFIED BY 'password';
对于您想要重建的每个用户,在我们的情况下,运行以下声明来输出其特权(我们需要在一瞬间分配):
SHOW GRANTS FOR wordpressuser@localhost;
Example Output:
在GRANT USAGE ON *.*
之后,请记住一行(s),因为您将使用修改后的版本来授予您刚刚创建的用户权限,例如,基于原始用户的赠款,我们将运行以下声明,将相同的赠款分配给我们的新用户(在本例中,WordPress
是数据库名称)。
GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'lamp_1_private_IP';
现在向您的新用户显示权限:
SHOW GRANTS FOR wordpressuser@lamp_1_private_IP;
Example Output:
完成对相应数据库用户的主机值的更新后,运行下列语句来执行这些更改,然后退出 MySQL 控制台:
1FLUSH PRIVILEGES;
2EXIT
现在,新数据库服务器已迁移和配置,您必须更新应用程序配置以连接到新数据库服务器!
更新应用程序配置
最后一步是更新您的应用程序配置,以指向您的新数据库服务器 mysql-1. 您的配置位置将取决于您的应用程序和您安装的位置,所以我们将使用WordPress作为一个例子。
WordPress 配置示例
WordPress 将其数据库连接配置存储在其安装目录中的一个名为 wp-config.php 的文件中(例如 /var/www/html/
)。
打开WordPress配置:
1sudo vi /var/www/html/wp-config.php
寻找下列线条:
1/** MySQL hostname */
2define('DB_HOST', 'localhost');
用您新数据库服务器的私人 IP 地址代替本地托管
mysql-1。
define('DB_HOST', 'mysql_1_private_IP');
现在可以像你平常一样访问你的应用程序(_lamp-1_的公共IP地址或域名)。它应该看起来和以前完全相同,但现在它正在连接到你的新服务器上的MySQL数据库, mysql-1!
其他应用
如果您正在运行不同的应用程序,只需更新应用程序的数据库连接配置以使用私有 IP 地址或名称而不是本地主机
或127.0.0.1
。
停止 MySQL 在您的原始服务器上
一旦您确认您的应用程序与新的独立的数据库服务器正常工作,您将想要清理原始的MySQL数据库服务器,至少,您将想要停止MySQL服务,以便它停止使用资源。
** 在 lamp-1** 上:运行以下命令以停止 MySQL,并将其设置为 NOT start on boot:
1sudo service mysql stop
2sudo sh -c "echo 'manual' > /etc/init/mysql.override"
结论
现在您的数据库服务器已与应用程序服务器分离,您的环境应该能够处理更多的流量,因为更多的资源被分配给每个组件。
以下是关于可扩展性主题的一些教程: