介绍
有许多情况下,您可能需要将数据和操作需求从一个服务器迁移到另一个服务器,您可能需要在新的数据中心实现解决方案,升级到更大的机器,或过渡到新的硬件或新的VPS提供商。
无论你的原因是什么,在从一个系统迁移到另一个系统时,你应该考虑很多不同的因素。如果你不使用 Chef、Puppet 或 Ansible 等配置管理解决方案,就很难获得功能相同的配置。
在最后一篇文章中,您 准备您的服务器进行数据迁移 在此时,您的目标和源系统应该能够进行通信 - 目标系统应该有SSH访问源系统. 您还应该有一个需要转移的软件和服务列表,包括版本号。
<$>[注] 注: 这里的总体想法是传输所有相关信息,同时让目标系统尽可能清洁。 一些迁移策略可能会直接克隆根分区,或在源机根部启动复制操作,同时仅手动排除一些你知道的文件会导致冲突。 然而,将大型系统数据迁移到一个活跃的操作系统可能会导致不可预测的结果,或无需将你的新系统混淆到不再与你的操作需求相关的文件。
步骤 1 – 创建一个迁移脚本
您将使用一些低水平的Linux工具,而不是尝试互动地运行它们,您的目标应该是最终完成一组可重复的步骤,可以捕捉您服务器配置的相关部分。
当你编写这个脚本时,你应该能够以反复的方式运行它,当你继续下去. 在本教程中使用的大多数工具,如rsync
,只会传输数据,如果它自上一次运行以来被更改,所以你可以安全地重复命令,而无需担心使它们多余。
您可以在您的主目录中创建此脚本,使用nano
或您最喜欢的文本编辑器:
1nano ~/sync.sh
在文件的第一行中,添加一个脚本标题,也称为shebang
。这告诉脚本默认运行哪个解释器。 #!/bin/bash’意味着脚本将默认运行到
bash`壳,这是大多数系统中最强大和广泛支持的壳。
1[label ~/sync.sh]
2#!/bin/bash
如果您正在使用nano
,请按Ctrl+X
,然后在提示时按Y
,然后按Enter
。
回到命令行,使用chmod
来执行脚本:
1chmod 700 ~/sync.sh
有关chmod
和Linux权限的深入概述,请参阅 Linux Permissions Introduction。
完成脚本可执行并添加 shebang 后,您可以通过直接调用它来运行它:
1~/sync.sh
它还不会产生任何输出,因为脚本是空的. 您应该根据需要在本教程的其余部分定期测试脚本. 与本系列的以前的教程一样,您可能需要使用sudo
权限运行它,取决于您添加到脚本的步骤。
步骤2:安装所需的程序和服务
您将添加到迁移脚本的第一个步骤是恢复您在上一个教程中标记为迁移的包。
添加更多库存
在此之前,您需要在单独的终端中再次连接到您的 original (源) 服务器,以检查您是否已从任何第三方存储库安装了软件。
在Ubuntu和Debian环境中,您可以通过研究几个位置来确定原始系统中是否存在替代性存储库:
1[environment second]
2cat /etc/apt/sources.list
1[secondary_label Output]
2…
3## Uncomment the following two lines to add software from Canonical's
4## 'partner' repository.
5## This software is not part of Ubuntu, but is offered by Canonical and the
6## respective vendors as a service to Ubuntu users.
7# deb http://archive.canonical.com/ubuntu impish partner
8# deb-src http://archive.canonical.com/ubuntu impish partner
9
10deb http://security.ubuntu.com/ubuntu impish-security main restricted
11# deb-src http://security.ubuntu.com/ubuntu impish-security main restricted
12deb http://security.ubuntu.com/ubuntu impish-security universe
13# deb-src http://security.ubuntu.com/ubuntu impish-security universe
14deb http://security.ubuntu.com/ubuntu impish-security multiverse
15# deb-src http://security.ubuntu.com/ubuntu impish-security multiverse
这是主要的包源列表 - 因为它是一个单一的文件,你可以使用cat
来输出其内容. 如果文件的最后一行包含一个ubuntu.com
地址,那么你可能没有添加任何第三方存储库到这个文件。
1[environment second]
2ls /etc/apt/sources.list.d
1[secondary_label Output]
2droplet-agent.list elastic-7.x.list nodesource.list
如果这个目录不是空的,你可以‘cat’个别文件来检查每个存储库:
1[environment second]
2cat /etc/apt/sources.list.d/elastic-7.x.list
1[secondary_label Output]
2deb https://artifacts.elastic.co/packages/7.x/apt stable main
这会告诉您您需要重新添加到目标机器的存储库的URL,在大多数情况下,您可以使用add-apt-repository
命令这样做:
1sudo add-apt-repository repo_url
在 RHEL、Rocky 或 Fedora Linux 上,您可以使用dnf
列出为服务器配置的存储库:
1[environment second]
2dnf repolist enabled
然后,您可以通过使用dnf config-manager
将额外的存储库添加到目标系统:
1sudo dnf config-manager --add-repo repo_url
如果您对源列表进行任何更改,请将其添加为您目标系统的迁移脚本顶部的评论。
1nano ~/sync.sh
1[label ~/sync.sh]
2#!/bin/bash
3
4#############
5# Prep Steps
6#############
7
8# Add additional repositories to /etc/apt/source.list
9# deb http://example.repo.com/linux/deb stable main non-free
然后保存并关闭文件。
指定版本限制和安装
您现在在目标机器上更新了您的包源,以匹配您的源机器。
在 Ubuntu 或 Debian 机器上,您现在可以通过键入在目标机器上安装所需的软件版本:
1sudo apt update
2sudo apt install package_name=version_number
如果你试图匹配的软件包的版本超过几个月,它可能已从官方存储库中删除,在这种情况下,你可以尝试追踪旧版本的 .deb
软件包(例如,通过浏览旧的上游存储库或第三方 PPA)及其依赖,并通过:
1sudo dpkg -i package.deb
但是,你应该非常小心,以避免创建一个情况,你有太多的软件包与版本不匹配. 如果旧版本的软件不容易可用,先测试最新的可用版本,看看它们是否仍然满足你的需求,以避免强加过时的要求。
对于 RHEL、Rocky 或 Fedora Linux,您可以通过键入以下方式安装特定版本的软件:
1Sudo dnf install package_name-version_number
如果您需要追踪已从存储库中删除的 rpm 文件,以有利于更新的版本,您可以使用dnf
来安装它们:
1dnf install package_name.rpm
再次,跟踪您在这里执行的操作,您可以将它们列入您正在创建的脚本中的评论:
1nano ~/sync.sh
1[label ~/sync.sh]
2#!/bin/bash
3
4#############
5# Prep Steps
6#############
7
8# Add additional repositories to /etc/apt/source.list
9# deb http://example.repo.com/linux/deb stable main non-free
10
11# Install necessary software and versions
12# apt-get update
13# 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
再次,保存并关闭文件。
步骤3 - 开始数据传输
实际数据传输通常不是迁移中最耗费劳动的部分,但它可能是最耗费时间的部分。
Rsync 是一个强大的工具,提供各种选项来复制各种不同的环境中的文件和目录,具有内置的计数验证和其他功能。 识别您想要传输数据的任何目录,并将rsync
命令添加到迁移脚本中。
一个样本rsync
命令看起来像这样:
1rsync -azvP --progress source_server:/path/to/directory/to/transfer /path/to/local/directory
-azvP
是典型的 Rsync 选项组合,作为每个选项的分解:
a
允许此副本操作的档案模式
,这节省了文件修改时间、所有者等。 它也相当于单独提供每个rlptgoD
选项(确实是)。 值得注意的是,-r
选项告诉 Rsync 要转入子目录来复制嵌入的文件和文件夹。 这种选项与许多其他副本操作相似,例如cp
和scp
。z
在传输过程中压缩数据,如果可能的话。 这对于任何缓慢连接的传输是有用的,特别是当传输数据非常有效地压缩,如日志和其他文本时。v
允许 verbose 模式,因此您可以在传输过程中阅读您的传输的更多细节。 _
您可以通过阅读 本文来了解有关如何创建适当的rsync
命令的更多信息。在某些情况下,在运行rsync
之前,您可能需要创建导致目标目标的母目录。
随着rsync
命令的添加,您的同步脚本现在可能看起来像这样:
1[label ~/sync.sh]
2#!/bin/bash
3
4#############
5# Prep Steps
6#############
7
8# Add additional repositories to /etc/apt/source.list
9# deb http://example.repo.com/linux/deb stable main non-free
10
11# Install necessary software and versions
12# apt-get update
13# 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
14
15#############
16# File Transfer
17#############
18
19# Rsync web root
20rsync -azvP --progress source_server:/var/www/site1 /var/www/
21
22# Rsync home directories
23. . .
请记住,这些命令可以重新运行,除非源文件发生更改,否则不会传输任何新数据,因此您可以在测试时逐步添加到此脚本中。
迁移数据库和其他非文件数据
请注意,许多应用程序,如数据库,会将其相关数据存储在您的文件系统中的多个实际`文件中,以优化访问,使用数据库共享等技术(https://andsky.com/tech/tutorials/understanding-database-sharding)。
幸运的是,几乎所有实现自己的存储的应用程序都将包括某种数据导出和导入到普通文件的机制,以便在像这样的迁移中正常地复制它们.例如,如果您使用MySQL,您可以查看如何导入和导出数据库(LINK0)。
步骤 4 – 更改配置文件
虽然某些软件在从原始服务器传输相关配置细节和数据后会顺利恢复工作,但许多配置需要修改。
如果您运行脚本来同步数据,然后修改值以反映其新目的地的正确信息,这些更改将在下次运行脚本时删除。
Linux 包含了一些非常有用的核心实用程序,用于这种类型的文本脚本。其中有两种是sed
和awk
。一般来说,如果您使用 普通表达式对非结构化文本进行修改,那么sed
更容易使用,而awk
则更有用用于更复杂的格式化文本或表格数据的解析。
这样,你的同步脚本可以在rsync
后立即执行sed
或awk
命令,以便在传输后自动修改你的文件。
SED
语法看起来像这样:
1sed -i 's/string_to_match/string_to_replace_it_with/g' file_to_edit
-i
标志意味着文件将被修改,而不是创建一个单独的输出文件. s
和 g
不会改变,并且是常规的 sed
惯例。
1[label ~/sync.sh]
2rsync -avz --progress source_server:/etc/mysql/* /etc/mysql/
3
4# Change socket to '/mysqld/mysqld.sock'
5sed -i 's/\/var\/run\/mysqld\/mysqld.sock/\/mysqld\/mysqld.sock/g' /etc/mysql/my.cnf
這將會將 /var/run/mysqld/mysqld.sock
在 /etc/mysql/my.cnf 中的每個實例變更為
/mysqld/mysqld.sock/g.
` 字符被用來先於 /
字符,因為它們會被解析為你的 sed
表現的結尾。這被稱為 escaping 特殊字符。 確保你的 sed
命令來自 rsync
命令之後。
您可以用「awk」用于格式化文本,就像您用「sed」用于非结构化文本一样。
1[label /etc/shadow]
2vault:!:18941::::::
3stunnel4:!:18968:0:99999:7:::
4sammy:$6$bscTWIVxvy.KhkO8$NJNhpABhJoybG/vDiRzQ2y9OFEd6XtqgCUG4qkuWfld97VEXH8/jUtc7oMtOC34V47VE7HjdpMMv37Aftdb7C/:18981:0:99999:7:::
您可以使用awk
删除第二个列
中的数据(即在第一个和第二个:
字符之间),如下:
1awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow
这个命令告诉 awk 输入和输出分界器都应该被解析为 :
. 然后它指定了如果列 1 等于根
,那么列 2 应该被设置为一个空串。
<$>[注] **注:**虽然由于使用常规表达式的灵活性,sed 仍然非常受欢迎,awk 被现代标准视为有点可怕,它的语法可能很难学习。
您可以随时将评论添加到迁移脚本中(在#
前面的行上),以记录正在进行的修复或对文件的更改。
结论
您现在应该拥有所有您需要的信息来将您的应用环境和数据迁移到新服务器,您还应该为此过程拥有良好的可重复的文档,如果您需要将堆栈重新部署到新系统中。
在本系列的最终教程中(https://andsky.com/tech/tutorials/how-to-migrate-linux-servers-part-3-final-steps),您将审查如何在新服务器上传输和测试任何延迟的系统服务。