如何迁移Linux服务器第2部分-传输核心数据

来自菜鸟教程
跳转至:导航、​搜索

介绍


在许多情况下,您可能必须将数据和操作要求从一台服务器移动到另一台服务器。 您可能需要在新的数据中心实施您的解决方案,升级到更大的机器,或者过渡到新硬件或新的 VPS 提供商。

无论您出于何种原因,在从一个系统迁移到另一个系统时都应该考虑许多不同的因素。 如果您不使用 Chef、Puppet 或 Ansible 等配置管理解决方案,则可能很难获得功能等效的配置。 您不仅需要传输数据,还需要配置您的服务以在新机器上以相同的方式运行。

在上一篇文章中,我们 为我们的服务器准备了数据迁移 。 此时,您的目标系统和源系统应该能够通信(目标系统应该具有对源系统的 SSH 访问权限)。 您还应该有一份需要传输的软件和服务的列表,并附上最重要组件的版本号。

在本指南中,我们将继续我们离开的地方并开始实际迁移到我们的新服务器。

总体战略


在开始之前,我们应该概述将数据从源系统迁移到目标系统的一般策略。

总体思路是传输所有相关信息,同时让目标系统尽可能干净。

一些迁移策略只是将 rsync 指向源机器的根目录,然后传入一些排除行来告诉进程不要包含我们知道会导致冲突的文件。 我们不会采用这种方法。 将大量系统数据迁移到实时操作系统可能会导致不可预测的结果,我们希望最终得到一个稳定的系统。

不仅如此,我们还不想让我们的新系统出现不必要的混乱,其中包含不再与我们的操作要求相关的文件。 这将需要更多的努力,但当我们完成时,它会导致更有用和更友好的配置。

因此,如果每个可能的非冲突文件与我们希望实现的目标无关,我们不会只是将其迁移到新系统。 相反,我们将准确地决定需要移动哪些数据作为我们的目的的功能要求。 这包括数据和配置详细信息、用户、作业等。

创建迁移脚本


我们将在进行过程中做出这些决定,并将它们添加到迁移脚本中。

这将为您带来许多重要的优势。 如果出现问题,或者为了在第一次运行后捕获源系统上的数据更改,它将允许您轻松地再次运行命令。 它将自行记录您用于传输数据的命令。 它还将允许您的源服务器在没有用户交互的情况下继续进行下一项数据传输。

在编写脚本时,您应该能够多次运行它,并随时对其进行改进。 大多数文件将通过rsync传输,它只会传输文件更改。 如果其他数据传输部分需要很长时间,您可以放心地将它们注释掉,直到您相当确定您的脚本处于其最终状态。

本文将主要介绍如何向迁移脚本添加内容以使迁移成功。 它将更频繁地提供一般指导而不是具体指导。

我们可以在目标系统的根用户主目录中创建一个简单的迁移脚本。 我们将使用它来自动化大部分数据迁移操作:

nano /root/sync.sh

在文件中,以标准脚本标题开头(我们将使用“sh”来使其更便携,但如果您想使用它提供的扩展功能并在两个系统上都可用,则可以使用“bash”):

#!/bin/sh

随着我们的继续,我们将对此进行补充。 不过现在,让我们快速退出文件,以便我们可以使其可执行。

返回命令行,通过键入以下命令使脚本可执行:

chmod 700 /root/sync.sh

要随时运行脚本,您现在可以使用其绝对路径调用它:

/root/sync.sh

或者它的相对路径:

cd /root
./sync.sh

您应该定期测试脚本以查看是否出现问题。

安装所需的程序和服务


在自动化之前,我们需要采取的第一步是获取启动和运行这些服务所需的包。 我们也可以将它添加到脚本中,但是手动完成这部分并将其记录在我们的脚本中会更容易。

配置详细信息将在稍后提供。 现在,我们需要安装这些应用程序并配置基本访问权限,以便我们可以开始工作。 您应该从源计算机获得所需软件包和版本的列表。

如有必要,添加其他存储库


在我们尝试从我们的包管理器中获取这些版本之前,我们应该检查我们的源系统以查看是否添加了任何其他存储库。

在 Ubuntu/Debian 机器上,您可以通过调查几个位置来查看您的源系统上是否存在替代软件源:

nano /etc/apt/sources.list

这是主要来源列表。 sources.list.d 目录中可以包含其他源列表:

ls /etc/apt/sources.list.d

如果需要,将相同的源添加到目标计算机以提供相同的包版本。

在基于 RHEL 的系统上,您可以使用 yum 列出为服务器配置的存储库:

yum repolist enabled

然后,您可以通过键入以下内容将其他存储库添加到目标系统:

yum-config-manager --add-repo repo_url

如果您对源列表进行任何更改,请将它们作为注释添加到迁移脚本的顶部。 这样,如果您必须从全新安装开始,您将知道在尝试新迁移之前需要执行哪些过程。

nano /root/sync.sh
#!/bin/sh

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

保存并关闭文件。

指定版本约束并安装


您现在已更新存储库以匹配您的源计算机。

在 Ubuntu/Debian 机器上,您现在可以尝试通过键入以下命令在目标机器上安装所需的软件版本:

apt-get update
apt-get install package_name=version_number

很多时候,如果软件包的版本较旧,它就会从官方存储库中删除。 在这种情况下,您可能必须手动查找旧版本的 .deb 文件及其依赖项,并使用以下命令手动安装它们:

dpkg -i package.deb

如果匹配软件版本对您的应用程序很重要,这是必要的。 否则,您可以使用包管理器定期安装。

对于基于 RHEL 的系统,您可以通过键入以下命令安装特定版本的软件:

yum install package_name-version_number

如果您需要查找已从存储库中删除的 rpm 文件以支持较新的版本,您可以在找到它们后使用 yum 安装它们,如下所示:

yum install package_name.rpm

将包管理器提供的任何相关软件安装到新系统中。 如果您需要的软件无法通过存储库或其他简单方式获得,并且已通过源代码安装或作为二进制文件从项目网站拉入,则您必须在目标系统上复制此过程。

再次,跟踪您在此处执行的操作。 我们会将它们作为注释包含在我们正在创建的脚本中:

nano /root/sync.sh
#!/bin/sh

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1

再次保存并关闭文件。

开始传输数据


数据的实际传输很容易成为迁移中最耗时的部分。 如果您正在迁移具有大量数据的服务器,那么尽早开始传输数据可能是个好主意。 您可以稍后改进您的命令,并且 rsync 只传输文件之间的差异,所以这应该不是问题。

我们可以从启动需要传输的任何大块用户数据的 rsync 开始。 在这种情况下,我们使用“用户”数据来指代您的服务器所需的任何重要数据,但数据库数据除外。 这包括站点数据、用户主目录、配置文件等。

安装和使用屏幕


为了有效地做到这一点,我们将要在我们的目标系统上启动一个 screen 会话,您可以在继续工作的同时保持运行。

您可以使用发行版的包管理器安装 screen。 在 Ubuntu 或 Debian 上,您可以输入:

apt-get update
apt-get install screen

您可以通过查看此链接了解如何操作屏幕

基本上,您需要在目标服务器上像这样启动一个新的屏幕会话:

screen

屏幕会话将启动,并将您带回命令行。 它可能看起来好像什么都没发生,但您现在正在操作一个包含在屏幕程序中的终端。

我们在迁移期间所做的所有工作都将在屏幕会话中进行。 这使我们能够轻松地在多个终端会话之间跳转,并允许我们在必须离开本地终端或断开连接时从中断的地方继续。

您可以在此处发出命令,然后断开终端,使其继续运行。 您可以随时通过键入以下内容断开连接:

CTRL-a d

您可以稍后通过键入以下内容重新连接:

screen -r

如果您需要在屏幕会话中创建另一个终端窗口,请键入:

CTRL-a c

要在窗口之间切换,请键入以下两个以在任一方向循环窗口:

CTRL-a n
CTRL-a p

通过键入以下内容来销毁窗口:

CTRL-a k

尽早开始文件传输


在您的屏幕会话中,启动您预计需要很长时间才能完成的任何 rsync 任务。 此处的时间尺度取决于您必须传输的重要(非数据库)数据量。

您要使用的一般命令是:

rsync -avz --progress source_server:/path/to/directory/to/transfer /path/to/local/directory

你可以通过阅读这篇文章来了解更多关于如何创建合适的rsync命令。 您可能必须创建通向目标的目录才能正确执行命令。

当您运行 rsync 会话时,创建一个新的屏幕窗口并通过键入以下内容切换到它:

CTRL-a c

定期检查以查看同步是否完成,并可能通过键入以下内容开始后续同步:

CTRL-a p

调整脚本以同步数据和文件


现在,您应该将刚刚执行的相同 rsync 命令添加到您正在创建的脚本中。 添加您需要的任何其他 rsync 命令,以便将所有重要的用户和应用程序数据放到目标服务器上。

此时我们不会担心数据库文件,因为有更好的方法来传输这些文件。 我们将在后面的部分讨论这些。

#!/bin/sh

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1

#############
# File Transfer
#############


# Rsync web root
rsync -avz --progress 111.222.333.444:/var/www/site1 /var/www/

# Rsync the apache configuration files
rsync -avz --progress 111.222.333.444:/etc/apache2/* /etc/apache2/

# Rsync php configuration
rsync -avz --progress 111.222.333.444:/etc/php5/* /etc/php5/

# Rsync mysql config files
rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/

# Rsync home directories
. . .

您应该添加从源系统传输数据和配置所需的任何 rsync 命令。

这不需要完美,因为我们总是可以回去调整它,所以尽你所能。 如果您不确定现在是否需要某些东西,请暂时将其保留,只需添加评论即可。

我们将多次运行该脚本,如果您最终需要它们,您可以修改它以获取其他文件。 对传输的内容保持保守将使您的目标系统清除不必要的文件。

我们正在尝试复制原始系统的功能和数据,而不一定是一团糟。

修改配置文件


尽管许多软件在从原始服务器传输相关配置详细信息和数据后会完全一样地工作,但可能需要修改一些配置。

这给我们的同步脚本带来了一个小问题。 如果我们运行脚本来同步我们的数据,然后修改值以反映其新家的正确信息,那么下次我们再次运行脚本时,这些更改将被清除。

请记住,我们可能会多次运行 rsync 脚本以赶上自我们开始迁移以来源系统上发生的更改。 在迁移和测试新服务器的过程中,源系统可能会发生显着变化。

我们可以采取两条一般路径来避免消除我们的更改。 首先,我将讨论简单的方法,然后跟进我认为更强大的解决方案。

快速而肮脏的方式


解决此问题的简单方法是在第一次同步操作后根据需要在目标系统上修改文件。 之后,您可以修改脚本中的 rsync 命令以排除您调整的文件。

这将导致 rsync 在后续运行时 not 同步这些文件,这将再次用原始文件覆盖您的更改。

这可以通过注释掉之前的同步命令并添加一个带有一些排除语句的新命令来完成,如下所示:

# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/

您应该为已修改的 rsync 目录规范下的任何文件添加排除行。 为文件中的修改添加注释也是一个好主意,以防您确实需要在任何时候重新创建它。

# Adding exclude rule.  Changed socket to '/mysqld/mysqld.sock'
# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/

稳健且推荐的方式


虽然上述方法在某些方面解决了问题,但实际上只是在避免问题而不是解决问题。 我们可以做得更好。

Linux 系统包括各种对脚本非常有用的文本操纵器。 事实上,这些程序中的大多数都是专门为允许在脚本环境中使用而设计的。

此任务最有用的两个实用程序是 sedawk。 您可以单击此处 了解如何使用 sed 流编辑器 ,并查看此链接以查看 如何使用 awk 操作文本

基本思想是我们可以编写任何手动更改的脚本,以便脚本本身执行任何必要的修改。

因此,在前面的示例中,我们可以保留该 rsync 命令并使用 sed 命令自动进行更改,而不是为我们事后修改的文件添加排除项:

rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/

# Change socket to '/mysqld/mysqld.sock'
sed -i 's_/var/run/mysqld/mysqld.sock_/mysqld/mysqld.sock_g' /etc/mysql/my.cnf

这将在每次传输文件时更改文件的每个实例中的套接字位置。 确保文本操作行出现在 之后 同步它们操作的文件的行。

以类似的方式,我们可以轻松地使用 awk 对表格数据文件进行脚本更改。 例如,/etc/shadow 文件被分成由冒号 (:) 字符分隔的制表符。 我们可以使用 awk 从第二列中删除散列的 root 密码,如下所示:

awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow && rm shadow.tmp

该命令告诉 awk 原始分隔符和输出分隔符都应该是“:”而不是默认空格。 然后我们指定如果第 1 列等于“root”,那么第 2 列应该设置为空字符串。

直到相当新的 awk 版本,都没有就地编辑的选项,所以这里我们将此文件写入临时文件,覆盖原始文件,然后删除临时文件。

我们应该尽最大努力编写文件中所需的所有更改。 这样,可以很容易地将我们迁移脚本中的一些行重用于其他迁移,并且进行一些简单的修改。

一种简单的方法是浏览您的脚本并为每个需要修改的文件添加注释到您的脚本中。 了解您的要求后,返回并添加将执行必要操作的命令。

将这些更改添加到您的脚本中,让我们继续。

转储和传输您的数据库文件


如果您的系统正在使用数据库管理系统,您将希望使用系统可用的方法转储数据库。 这取决于您使用的 DBMS(MySQL、MariaDB、PostgreSQL 等)。

对于常规的 MySQL 系统,您可以使用以下方式导出数据库:

mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db

MySQL 转储选项高度依赖于上下文,因此您必须在决定之前探索哪些选项适合您的系统。 这超出了本文的范围。

让我们回顾一下这些选项对数据库转储的作用。

  • -Q:此选项默认启用,但为了额外的安全性在此处添加。 它将数据库名称等标识符放在引号内以避免误解。
  • -q:这代表快速,可以帮助加速大型表转储。 实际上,它告诉 MySQL 逐行操作,而不是尝试一次处理整个表。
  • -e:这通过将插入语句组合在一起而不是在加载转储文件时单独处理它们来创建更小的转储文件。
  • -R:这允许 MySQL 也可以将存储的例程与其余数据一起转储。
  • –add-drop-table:这个选项指定MySQL应该在每个CREATE TABLE之前发出一个DROP TABLE命令,以避免在表已经存在的情况下遇到错误。
  • -A:此选项指定 MySQL 应转储所有数据库。
  • -u:详细说明用于连接的 MySQL 用户。 这应该是根。
  • -p:这是 MySQL root 帐户所需的密码。

这将在原始系统上创建源系统 MySQL 数据的 MySQL 转储。 我们可以将其包装在 SSH 命令中以使其远程执行:

ssh root@111.222.333.444 'mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db'

然后我们可以在文件完成后使用普通的 rsync 命令来检索文件:

rsync -avz --progress 111.222.333.444:/root/database_name.db /root/

之后,我们可以将转储导入目标系统的 MySQL 实例:

mysql -u root -proot_password < /root/database_name.db

另一种选择是在原始数据库和目标系统的数据库之间配置复制设置。 这可以让您在完成后简单地交换主从服务器,以完成数据库迁移。

这也超出了本文的范围,但是您可以在此处找到有关如何配置主从复制的详细信息。

如果您走这条路线,请确保在脚本中添加注释以指定您的配置。 如果有一个大问题,您希望能够获得有关您所做的事情的良好信息,以便您可以在第二次尝试时避免它。

下一步


您现在应该在目标系统上拥有大部分数据,或者正在传输过程中。 这将完成大部分实际数据传输,但我们仍然需要在系统上进行大量配置以匹配我们以前的机器。