介绍
在许多情况下,您可能必须将数据和操作需求从一个服务器移动到另一个服务器。 您可能需要在新的数据中心中实施解决方案,升级到更大的计算机,或转换到新的硬件或新的VPS提供程序。
无论你的原因,当从一个系统迁移到另一个系统时,你应该做许多不同的考虑。 如果您不使用配置管理解决方案(如Chef,Puppet或Ansible)运行,获取功能等效的配置可能会很困难。 您不仅需要传输数据,还需要配置服务以在新计算机上以相同的方式运行。
在上一篇文章中,我们坦然我们的服务器进行数据迁移 。 此时,您的目标和源系统应该能够进行通信(目标系统应该具有SSH访问源系统)。 您还应该有一个需要传输的软件和服务的列表,以及最重要组件的版本号。
在本指南中,我们将继续我们离开的地方,并开始实际迁移到我们的新服务器。
总战略
在开始之前,我们应该概述我们将数据从源迁移到目标系统的一般策略。
一般的想法是转移所有相关的信息,同时使目标系统尽可能干净。
一些迁移策略只是将rsync指向源计算机的根目录,然后传递一些排除行,告诉进程不包括我们知道会导致冲突的文件。 我们不会采取这种方法。 将大型系统数据迁移到实时操作系统可能会导致不可预测的结果,我们希望得到一个稳定的系统。
不仅如此,我们不想不必要地将我们的新系统与不再与我们的操作需求相关的文件混在一起。 这将需要更多的努力,但它会导致一个更可用和更友好的配置,当我们完成。
因此,如果与我们希望实现的目标不相关,我们不会将每个可能的非冲突文件迁移到新系统。 相反,我们将决定哪些数据需要移动作为我们目的的功能需求。 这包括数据和配置详细信息,用户,作业等。
创建迁移脚本
我们将在我们去做这些决定,并将它们添加到迁移脚本。
这将给你一些重要的优势。 它将允许您轻松地重新运行命令,如果有问题或为了捕获在第一次运行后源系统上的数据更改。 它将自我记录您用于传输数据的命令。 它还将允许源服务器继续到下一项数据传输,而无需用户交互。
当你编写脚本时,你应该能够多次运行它,在你走的时候精炼。 大多数的文件将通过转移rsync
,它只能将文件更改。 如果其他数据传输部分需要很长时间,您可以安全地注释它们,直到您确定您的脚本处于其最终状态。
本文主要是关于如何添加到迁移脚本以使迁移成功的指南。 它将提供比细节更多的一般准则。
我们可以在目标系统上的root用户的主目录中创建一个简单的迁移脚本。 我们将使用它来自动化大部分的数据迁移操作:
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的不同步在随后的运行,这将再次改写原始文件的更改这些文件。
这可以通过注释掉以前的同步命令并添加一个包含一些排除语句,如下所示:
# 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系统包括对脚本非常有用的各种文本操纵器。 事实上,这些程序大多是专门为了在脚本环境中使用而设计的。
此任务的两个最有用的工具是sed
和awk
。 您可以点击这里了解如何使用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:这一分组INSERT语句一起,而不是装载转储文件时逐个处理它们产生较小的转储文件。
- -R:这让MySQL来也转储存储程序和数据的其余一起。
- --add-drop-table在 :此选项指定MySQL应该发出DROP TABLE命令之前每个CREATE TABLE以避免运行到一个错误,如果表已经存在。
- -A:此选项指定的MySQL应该转储所有的数据库。
- -u:此详细说明了MySQL用户要使用的连接。 这应该是root。
- -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
另一个选项是在原始数据库和目标系统的数据库之间配置复制设置。 这可以允许您在完成后简单地交换主服务器和从服务器,以便完成数据库迁移。
这也超出了本文的范围,但你可以找到有关的详细信息如何配置主从复制在这里。
如果你走这条路线,请确保添加注释到您的脚本指定您的配置。 如果有一个大问题,你想要能够有你所做的,你可以避免它的第二次尝试的好信息。
下一步
您现在应该在目标系统上拥有大部分数据,或者正在进行传输。 这将完成大量的实际数据传输,但我们仍然需要在我们的系统上做相当多的配置,以匹配我们以前的机器。
在接下来的文章中,我们将继续前进传输其他信息和用户设置。