如何在Centos6上使用Rsync创建站点的异地备份

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

状态: 已弃用

本文介绍了不再受支持的 CentOS 版本。 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议您升级或迁移到受支持的 CentOS 版本。

原因: CentOS 6 已于 2020 年 11 月 30 日结束生命周期 (EOL) and no longer receives security patches or updates. For this reason, this guide is no longer maintained.

请参阅:
本指南可能仍可用作参考,但可能不适用于其他 CentOS 版本。 如果可用,我们强烈建议使用为您正在使用的 CentOS 版本编写的指南。

以下 DigitalOcean 教程可能会立即引起人们的兴趣,因为它提供了如何使用 rsync 将本地目录与远程目录同步的概述:




介绍

本文提供了一种快速备份典型 Web 托管方案中最常见内容的方法:网站文件和数据库数据。 我们将设置网站文件夹的完整每日备份并将此数据复制到远程服务器(这也适用于另一个 VPS)。 我们还将设置一个 rsync 示例来复制增量更改。 最后,我们将设置 MySQL 数据库的备份。 描述的过程使用一些简单的 Bash 命令、rsync 和 cron 来安排备份。 例如数据,我们可以按照本教程安装Wordpress。 它会将 Wordpress 放在 /var/www/wordpress 目录和 MySQL 数据库 wordpress 中,我们现在要备份所有数据。

DigitalOcean 提供快照和备份,可以很好地处理备份和快照。 还有一些出色的备份即服务解决方案,可以在最低配置下工作。 但有时我们想使用另一台备份服务器或内部服务器,我们想要一种快速的方法将数据从 webhost 拉回我们的服务器。 在这种情况下,这些提示可以提供帮助。

有两种方法可以进行备份:增量备份和完整备份。 完整备份复制所有数据,而快照仅处理自上次更新以来的更改。

完全备份

完整备份通常执行以下操作:

  • 将文件夹中的所有文件归档
  • 将生成的存档复制到远程服务器。

如前所述,我们的数据将驻留在 /var/www/wordpress 目录中。 我们将指定一个备份文件夹位置。

mkdir -p /backup/wordpress

上述命令将创建一个 /backup 目录和一个 /backup/wordpress 目录(如果它们不存在)。 为了创建我们数据的完整快照,我们使用名为 tar 的 linux 工具。

tar -czf /backup/wordpress/initial_backup.tar.gz
/var/www/wordpress

Tar 将 cf 文件 initial_backup.tar.gz 中创建 agzip 存档。 如果我们想要一个详细的输出(文件名列表),我们可以添加一个 v 标志(所以我们得到 tar -czvf)。 我们将文件命名为 initial_backup.tar.gz 以便我们知道这是一个初始备份,它使用 tar 归档,而 iz 以 gzip 格式压缩。 Tar 将使用我们提供的任何参数作为源,在我们的例子中,它将备份 /var/www/wordpress 目录。 我们可以传递两个或多个参数,无论它们是文件还是文件夹:即。

tar -czf /backup/cms_systems_backup.tar.gz /var/www/wordpress
/var/www/drupal /var/www/joomla

最后一个命令将备份我们所有安装的 cms 系统。

现在,对于我们未来的备份,我们可能想要添加备份的日期:

tar -czf /backup/wordpress/wordpress-`date '+%m%d%y'`.tar.gz
/var/www/wordpress

让我们看看我们现在有什么:

[root@Backup ~]# ls -l /backup/wordpress/
total 9760
-rw-r--r-- 1 root root 4995743 Apr 17 12:16 initial_backup.tar.gz
-rw-r--r-- 1 root root 4995743 Apr 17 12:25 wordpress-041713.tar.gz
[root@Backup ~]#

我们有两个文件,一个叫做 initial_backup,一个叫做 wordpress-041713(写这篇文章的时间是 2013 年 4 月 17 日)。 现在,要每天安排这个,我们需要创建一个 crontab 条目。 Crontab 是一个 linux 任务调度器:我们告诉它什么时候做某事以及实际做什么任务。 无论如何,我们打开 crontab 编辑器:

EDITOR=nano crontab -e

它将在文本编辑器中打开一个 crontab 文件。 默认情况下,DO CentOS 图像包含 vim 作为编辑器,这需要一些设置,因此我们为此使用了一个更简单的编辑器,称为 nano 编辑器。 我们可以只使用默认编辑器:

crontab -e

现在我们需要告诉 cron 进行备份,比如说,每天凌晨 3.30,希望没有太多流量的时候。 我们还将告诉它通过电子邮件向我们发送任何发现。 我们把这个内容放到 crontab 中:

MAILTO=email@example.com
30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress

我们用 CTRL-X 保存文件并用 Y 和 Enter 确认。 上面的命令会告诉 linux 在每天 3:30 重复我们的命令。 我们还告诉 cron 将结果通过电子邮件发送给我们。 您将收到以下消息:/bin/tar:从成员名称 中删除前导 `/',作为一切都通过的标志。 如果出现错误,消息将包含详细信息,以便我们解决此问题。 因此,每日备份已准备就绪并且可以正常工作。

将备份复制到另一个远程服务器

要将备份复制到另一个远程服务器,我们将使用 scp - 安全复制。 首先,我们需要生成一个 SSH 密钥:

ssh-keygen

我们现在可以将密码留空,并使用 /root/.ssh/id_rsa_backup 密钥文件(或 /home/username/.ssh/id_rsa_backup,如果我们 ' 没有以 root 身份运行)。 现在我们可以检查公钥部分:

cat .ssh/id_rsa_backup.pub

我们需要将 SSH 密钥的这个公共部分复制到远程服务器,复制到文件 authorized_keys. 我假设我们已经有一个名为 backup.example.com 的远程服务器和一个用户 backup。 这可能是一个空的新创建的 DigitalOcean VPS (droplet),但必须事先创建用户。 这部分我们只会做一次。

scp .ssh/id_rsa_backup.pub
backup@backup.example.com:/home/backup/backup_key.pub

系统将提示我们输入备份用户的密码。 我们复制了文件,现在让我们将它添加到它应该在的地方,在authorized_keys 中。 我不能假设这个用户已经设置了文件和文件夹,所以让我们检查一下信息:

ssh backup@backup.example.com "mkdir -p /home/backup/.ssh"
ssh backup@backup.example.com "chmod 700 /home/backup/.ssh"
ssh backup@backup.example.com "touch /home/backup/.ssh/authorized_keys"
ssh backup@backup.example.com "chmod 600 /home/backup/.ssh/authorized_keys"
ssh backup@backup.example.com "mkdir -p /home/backup/backups"

上面的几个命令创建了一个 SSH 使用的目录(如果它不存在),以及 authorized_keys 文件,该文件需要存在才能进行备份。 我们还创建了一个 backups 目录来存储我们的文件。 现在剩下的就是将我们的公钥复制到该文件中。

ssh backup@backup.example.com "cat /home/backup/backup_key.pub >>
/home/backup/.ssh/authorized_keys"

现在我们可以使用这个密钥来复制未来的东西。

现在,让我们将备份文件复制到那里:

scp -i .ssh/id_rsa_backup
/backup/wordpress/wordpress-041713.tar.gz
backup@backup.example.com:/home/backup/backups

如果我们的密钥设置正确,文件将被复制,我们不会被要求输入密码。 我们可以检查该文件是否真的存在:

ssh backup@backup.example.com "ls -l /home/backup/backups"

好的,我们现在也可以将此操作安排到 crontab。 再次启动 crontab 编辑器:

EDITOR=nano crontab -e

我们现在将更改我们的备份行:我们要添加信息以在创建备份存档时复制它。 因此,我们附加新命令,使其看起来像这样:

30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress;/usr/bin/scp -i
/root/.ssh/id_rsa_backup /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz
backup@backup.example.com:/home/backup/backups

注意:这不是通常的方法,最好设置一个执行所有任务的脚本,然后安排脚本。 但为了本文的简洁,我们将使用该表格。

增量备份

但是,如果我们在另一台服务器上拥有自己的备份软件怎么办? 我们只想把数据同步过来,然后让另一台服务器去做备份工作。 此外,我们希望保留文件戳记。 然后我们使用 rsync。 这里的用例是我们只想将所有内容从 /var/www/wordpress 增量复制到远程服务器,这次复制到 /home/backup/snapshots/wordpress目录。 这是一个简单的命令来完成所有这些:

ssh backup@backup.example.com "mkdir -p /home/backup/sync"
rsync -avz --delete -e "ssh -i /root/.ssh/id_rsa_backup"
/var/www/wordpress backup@backup.example.com:/home/backup/sync

第一行创建一个快照目录,第二行复制 changed 文件。 这意味着被修改、新创建或删除的文件。 我们也可以在 cron 中安排它:

EDITOR=nano crontab -e

crontab 行应如下所示:

30 3 * * * /usr/bin/rsync -avz --delete -e "ssh -i
/root/.ssh/id_rsa_backup" /var/www/wordpress
backup@backup.example.com:/home/backup/sync

现在我们的远程服务器将始终拥有一个新的同步数据副本,我们可以在那里进行备份。

备份数据库

我们还可以备份我们的数据库。 首先,我们要转储数据。 如果我们遵循 wordpress 安装指南,我们还有一个数据库 wordpress,由用户 wordpressuser 使用密码 password 访问。 我们可以像这样进行初始转储:

mkdir /backup/mysql
mysqldump < wordpress -u wordpressuser -ppassword | gzip >
/backup/mysql/initial.sql.gz

此命令创建了一个 initial.sql.gz gziped SQL 文件。 要每天执行此操作,我们可以像以前一样将其安排在 cron 中。 我们生成的 cron 行应如下所示:

0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql--`date +\%m\%d\%y`.sql.gz

现在我们还可以将它与 scp 或 rsync 结合起来远程复制它。

0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql-`date +\%m\%d\%y`.sql.gz;
/usr/bin/scp -i /root/.ssh/id_rsa_backup /backup/mysql/mysql-`date
+\%m\%d\%y`.sql.gz  backup@backup.example.com:/home/backup/

通过此设置,我们可以为紧急情况设置数据的基本备份。