探索rsync在备份方案中的作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探索rsync在备份方案中的作用相关的知识,希望对你有一定的参考价值。

参考技术A 在系统管理员的工作中 备份 无疑是一个重要的部分。当没有完整备份或者良好规划的备份和实施时,就可能或早或晚不可挽回地丢失重要的数据。

所有公司,无论大小, 都运营在数据之上 。考虑到 丢失业务数据造成的经济和业务损失, 从最小的个人公司到最大的跨国企业,没有一个公司能在丢失大部分数据以后得以幸存。你的办公室可以通过保险赔偿重建,但是你的数据就不可能再恢复了。

这里提到的丢失是指 数据的完全损坏 。而不是指数据被偷走,那是另一种灾难。我这里说的是数据被完全摧毁。

即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我有二十年来的个人财务数据和我现在已经关闭的企业的数据,以及大量的电子发票。也包括近年来我创作的大量不同类型的文档、报告和数据报表。我不想失去任何这些数据。

所以备份是我数据长期安全的必要保障。

有许多软件可以执行备份。大多数 Linux 发行版提供至少一种开源的备份软件。同时也有许多商业备份软件,但是这些都不符合我的需求,所以我决定使用基础的 Linux 工具来进行备份。

在我为 Open Source Yearbook 写的文章, 最佳搭档之 2015:tar 和 ssh 中,我说明了昂贵的商业备份软件在设计实施可行的备份计划中并不是必要的。

从去年开始我尝试了另一种选择, rsync 命令,它有许多我已经从中受益的有趣特性。我的主要需求是所创建的备份,用户不需要解压备份压缩包就能定位和恢复文件,以便节约创建备份的时间。

这篇文章的目的只是为了说明 rsync 在我的备份方案中的作用。并不是 rsync 的全部能力或者它的各种适用场景的概览。

Andrew Tridgell 和 Paul Mackerras 编写了 rsync ,首次发布于 1996 年。 它的目标是向另一台电脑同步文件。 你注意到了他们为什么取这个名字了吗(remotely synchronize )?它是大多数发行版都提供的开源软件。

rsync 能够用于 同步两个目录或目录树 ,无论它们是在同一个计算机上还是不同的计算机上,而且不仅如此,它还能做到更多。它创建或者更新的目录与源目录完全一样。新的目录不是以 tar 或 zip 等打包存储,而是普通的目录和文件,常见的 Linux 工具都能轻松访问,而这正是我所需要的。

rsync 的最重要的特性之一是它 处理源目录被修改的已有文件的方式 。它使用 分块校验来比较源文件和目标文件 ,而不是从源把整个文件复制过去。如果两个文件所有块的校验和都相同,那么就不用传输数据。否则只有被改变的块被传输。 这样节约了远程同步消耗的大量时间和带宽 。比如,我第一次使用 rsync 脚本来把我所有的主机备份到一个外接的大型 usb 硬盘上需要三个小时,因为所有的数据都需要传输过去。而接下来的备份需要的时间就只是 3 到 8 分钟,这取决于上次备份以来创建和改变了多少文件。我使用 time 命令来记录实际花费的时间。昨天晚上,我只花了三分钟来从六个远程系统和本地工作站备份大概 750 Gb 数据。实际上只有在白天改变的几百 Mb 数据需要备份。

rsync -aH sourcedir targetdir可以用来同步两个目录及其任意子目录的内容。也就是说,在新目录的内容和源目录同步完之后,它们的内容完全一样。

-a 选项表示归档模式,它会保持权限、所有关系和符号(软)链接。-H 选项用来保持硬链接。注意源目录和目标目录都可以在远程主机上。

另外一个特性: 从源目录删除了一些文件 。rsync 默认只复制新的和改变过的文件到新目录里,而不去改变新目录里被我们删除的文件,但是如果你想让那些在源目录里被删除的文件在新目录里也被删除,那么你可以加上 --delete 选项来删除。

第3个特性: --link-dest 每日备份只花费很少的额外空间和很短的时间 。用这个选项指定前一天的备份目录,以及今天的备份目录,然后 rsync 会创建今天的新备份目录,并将昨天备份目录里的每一个文件在今天的备份目录中创建硬链接。

第4个特性: --exclude 排除不想要备份的目录或者文件 。

现在的命令汇总为

rsync -aH --delete --exclude Cache  --link-dest=yesterdaystargetdir  sourcedir  todaystargetdir

可以依靠 rsync 的大量选项来定制你的同步过程。大多数情况而言,我刚刚描述的简单命令就足以胜任我的个人需要。你可以阅读 rsync 丰富的文档来了解它的其他能力。

我的备份自动运行因为—“万物皆可自动化”。我写了一个 BASH 脚本使用 rsync 创建每天的备份。包括确保备份介质被挂载,生成每天的备份目录的名字,以及在备份介质中创建合适的目录结构,最后执行真正的备份再卸载备份介质。

cron 每天早晨执行脚本确保我永远不会忘记备份。

所有没有经过测试的备份计划都不完整的。你可以通过测试恢复某个文件或者整个目录,以确保备份在照常工作并且可以通过它来在数据全部丢失后恢复。我见过太多备份由于种种理由失败,以及由于缺乏测试忽略的问题导致宝贵的数据被丢失。

选择一个文件恢复到比如 /tmp 的测试目录,这样你就不会覆盖任何备份后被更新的文件。验证文件的内容是否是你预期的。恢复用 rsync 备份的文件仅仅只是找到你的备份文件然后把它复制到你想恢复的地方去那样简单。

Rsync官方地址:https://rsync.samba.org/

该文提到的 Rsync缺点 ,供学习参考:

1. 大量小文件同步会比较慢,需要比对较长时间,有可能会造成rsync进程停止。

解决思路:将小文件进行打包,然后在同步,减少比对时间,传输效率提高。

2. 同步大文件会出现中断情况,而且长时间同步会造成网络资源被耗尽。

解决思路:配置限速同步,未同步完之前修改为隐藏文件,同步完成后修改为正常文件。

3. 扫描百万级别文件非常耗时

随着应用系统规模的不断扩大,对数据的安全性和可靠性提出了更高的要求,rsync便暴露出了很多不足之处。首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到了百万量级及以上时,扫描文件就非常耗费时间,有时还会出现只是很少一部分数据发生了变化,因此rsync就变得非常低效了。

4. rsync不能够实时监测、同步数据

虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会出现时间差,可能导致服务器端和客户端的数据出现不一致,后期无法在出现故障时完全恢复数据。

rsync如何同步单个文件到服务器上,使用rsync命令将备份同步到远程服务器的四个简单步骤...

使用rsync命令进行远程备份的Bash脚本

定期备份重要数据是一个好习惯。

它使您可以在需要时还原它。

如果系统崩溃,即使您有备份,也将无法根据需要还原备份。

那么,克服此问题的最佳解决方案是什么?

在这种情况下,远程备份是一个更好的解决方案。

Rsync是执行远程备份的出色Linux命令。

什么是rsync命令?

Rsync代表远程同步。Rsync是一种快速且用途广泛的文件复制工具。它用于快速和增量文件传输。Rsync被广泛用于备份和镜像目的。

rsync通常用于在两个不同系统或本地目录之间同步文件和目录。

它使用增量传输算法,该算法通过仅将已更改的文件传输到自上次备份以来已更改的目标,来减少通过网络发送的数据量。

它提供了广泛的选项,可控制其行为的各个方面,并允许非常灵活地指定要复制的文件集。

步骤1:使用tar命令创建数据的本地备份

首先,您需要为重要数据创建本地备份。

步骤2:设置无密码SSH身份验证

由于您计划将备份移至远程(非现场)服务器,因此必须设置无密码ssh身份验证以自动执行此任务。

否则,您需要手动执行此操作,因为每次运行脚本时,远程服务器都会要求输入密码。

步骤3:使用rsync命令为远程备份创建Bash脚本

在本教程中,我们包含了五个脚本。每个脚本的编写目的均不同,并根据需要选择相应的脚本。

Bash Script-1:使用rsync命令将备份移动到具有标准SSH端口的远程服务器

如果您在其上使用标准ssh端口,请使用以下bash脚本将备份移至远程服务器。

# /opt/scripts/remote-backup-1.sh

#!/bin/bash

#Remote Server IP

rserver=192.168.1.5

#Local backup location

lbackuploc=/home/daygeek/Downloads/test/

#Remote backup location

rbackuploc=/home/daygeek/site

#rsync command with standard port

rsync -avz -e ssh $lbackuploc $rserver:$rbackuploc

#To delete files older than 10 days

find $rbackuploc/* -mtime +10 -exec rm ;

Bash Script-2:使用rsync命令将备份移动到具有非标准SSH端口的远程服务器

如果使用非标准ssh端口,请使用以下bash脚本将备份移至远程服务器。

# /opt/scripts/remote-backup-2.sh

#!/bin/bash

#Remote Server IP

rserver=192.168.1.5

#SSH Non-Stardard port number

snsport=2200

#Local backup location

lbackuploc=/home/daygeek/Downloads/test/

#Remote backup location

rbackuploc=/home/daygeek/site

#rsync command with non-standard port

rsync -avz -e "ssh -p $snsport" $lbackuploc $rserver:$rbackuploc

#To delete files older than 10 days

find $rbackuploc/* -mtime +10 -exec rm ;

Bash Script-3:使用rsync命令通过标准SSH端口将备份移至多个远程服务器

如果您在其上使用标准ssh端口,请使用以下bash脚本将备份移至多个远程服务器。

# /opt/scripts/remote-backup-3.sh

#!/bin/bash

#Local backup location

lbackuploc=/home/daygeek/Downloads/test/

#Remote backup location

rbackuploc=/home/daygeek/site

for rserver in 192.168.1.5 192.168.1.8

do

rsync -avz -e ssh $lbackuploc $rserver:$rbackuploc

find $rbackuploc/* -mtime +10 -exec rm ;

done

Bash Script-4:使用rsync命令将备份移动到具有非标准SSH端口的多个远程服务器

如果您使用备份工具上的非标准ssh端口,请使用以下bash脚本将其备份到多个远程服务器。

# /opt/scripts/remote-backup-4.sh

#!/bin/bash

#SSH Non-Stardard port number

snsport=2200

#Local backup location

lbackuploc=/home/daygeek/Downloads/test/

#Remote backup location

rbackuploc=/home/daygeek/site

for rserver in 192.168.1.5 192.168.1.8

do

rsync -avz -e "ssh -p $snsport" $lbackuploc $rserver:$rbackuploc

find $rbackuploc/* -mtime +10 -exec rm ;

done

Bash Script-5:使用rsync命令将备份移动到具有标准和非标准SSH端口的多个远程服务器

使用以下bash脚本将备份移动到多个远程服务器,而不管ssh端口如何。

# /opt/scripts/remote-backup-5.sh

#!/bin/bash

#SSH Non-Stardard port number

snsport=2200

#Local backup location

lbackuploc=/home/daygeek/Downloads/test/

#Remote backup location

rbackuploc=/home/daygeek/site

for rserver in 192.168.1.5 192.168.1.8

do

ssport=$(nmap -Pn $rserver | grep -w ssh | awk 'print $1' | sed "s//tcp//")

if [ "$ssport" == "22" ]

then

echo "$rserver"

rsync -avz -e ssh $lbackuploc $rserver:$rbackuploc

find $rbackuploc/* -mtime +10 -exec rm ;

else

echo "$rserver"

rsync -avz -e "ssh -p $snsport" $lbackuploc $rserver:$rbackuploc

find $rbackuploc/* -mtime +10 -exec rm ;

fi

done

设置文件的可执行权限remote-backup-5.sh。

# chmod +x remote-backup-5.sh

最后运行脚本以实现此目的。

# sh remote-backup-5.sh

192.168.1.5

sending incremental file list

./

wordpress-5.2.zip

sent 11,774,912 bytes  received 38 bytes  7,849,966.67 bytes/sec

total size is 12,114,587  speedup is 1.03

192.168.1.8

sending incremental file list

./

wordpress-5.2.zip

sent 11,774,905 bytes  received 41 bytes  7,849,964.00 bytes/sec

total size is 12,114,587  speedup is 1.03

如果要确保备份状态,请使用以下bash脚本。

# /opt/scripts/list-remote-backup.sh

#!/bin/bash

#User Name

username=daygeek

#SSH Non-Stardard port number

snsport=2200

#Remote backup location

rbackuploc=/home/daygeek/site

for rserver in 192.168.1.5 192.168.1.8

do

ssport=$(nmap -Pn $rserver | grep -w ssh | awk 'print $1' | sed "s//tcp//")

if [ "$ssport" == "22" ]

then

echo "$rserver"

echo "-----------"

ssh $username@$rserver "ls -lh $rbackuploc"

else

echo "$rserver"

echo "-----------"

ssh $username@$rserver -p "$snsport" "ls -lh $rbackuploc"

fi

done

运行脚本以列出同步的备份文件。

# sh list-remote-backup.sh

192.168.1.5

-----------

total 12M

-rw-r--r-- 1 daygeek daygeek 12M May 20 02:42 wordpress-5.2.zip

192.168.1.8

-----------

total 12M

-rw-r--r--. 1 daygeek daygeek 12M May 19 14:12 wordpress-5.2.zip

步骤4:使用crontab自动执行备份

要完全自动化,最后将脚本添加到crontab。

使用cronjob安排您方便的时间进行工作。我添加了一个cron作业,每天早上8点运行脚本。

0 8 * * * /opt/scripts/remote-backup-5.sh

以上是关于探索rsync在备份方案中的作用的主要内容,如果未能解决你的问题,请参考以下文章

rsync远程同步(都在用的备份方案)

Linux-Rsync项目实战(详细) 备份全网服务器数据生产架构方案

rsync数据备份解决方案

搭建企业级全网数据定时备份方案cron + rsync

linux系统中Rsync文件同步方案

JumpServer双机备份方案