到写方案的时候很头疼,不如和山河老师一起看看如何完成完整的备份方案。

## 二 rsync介绍与完整备份方案

**(1)rsync是什么**

rsync 全称remote synchronize,即"远程同步",是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。

**(2)rsync是用来干什么的?**

我们用rsync 是为了备份的,这种说法不够准确,容易让人误解,其实rsync的工作只是用来完成远程同步的、只是为异地备份数据做好了一个铺垫,且听我细细道来。

首先:本地备份不可靠的,为什么呢?

如果一份重要数据在本地的某个文件夹里存放着,并且该文件夹内的数据每天都可能会发生变化,为了防止某一天数据突然丢失的情况下我们可以找回数据,我们需要结合计划任务把每天的数据都备份一下然后存在本机,此时,备份是有了,但这就万无一失了吗?错!如果本机挂掉了,你备份的数据都不可用,所以备份的数据一定需要传送到远端,那么你的思路可能是这样的

```bash

结合计划任务

1、每天备份一下数据,此时备份的数据是在本地存放着

2、然后将备份的数据发送到远端

3、隔一段时间就删除七天前的本地备份数据,只留下七天内的,节省本地空间

```

上述思路既浪费空间,传输效率又低,而且如果本机的计划任务尚未触发本机就挂了,异地将获取不到备份数据

我们可以这么做

```bash

# 一 制异地镜像

计划任务+rsync将本地数据定期同步到异地->无法做到实时同步

rsync+inotify或sersync将本地数据实时同步到异地->可以做到实时同步,异地就是本地的一个镜像点

# 二 结合计划任务对异地镜像点的目录做增量备份

```

体会下上述方案

```bash

1、本机无需再做备份,我们只需要对远程的镜像站点制作备份即可,因为远程的镜像点与本机完全一致/同步

这样就节省了本机的空间,并且减少了本机的工作量

2、如果本机突然挂掉,不必担心丢失最近的数据,因为远程的镜像点与本机的数据是同步的,本机挂了,远程的镜像点仍然可以保留下最近的数据,亦可对其进行一次备份。

3、如果本机挂掉了,不必担心数据无法恢复,因为备份的数据也都在远程存放着呢。

```

**(3)rsync的原理与特点**

rsync的远程传数据可以简单总结为三步

```bash

1、先验证用户身份

2、检测出到底需要传哪些文件,默认quick check算法(依据源路径与目标路径下对应文件的大小或修改时间是否有变动),检测出需要传输的文件后,并非是将文件全部传到远端,而是只传文件改动的部分,俗称增量,然后传到远端后,远端再依据之前的内容与传过来的新内容按照算法拼成一个新文件,所以说rsync并不耗费IO,但是耗cpu

3、传输

```

rsync的特点

- 1、IO效率高,但耗费cpu资源

```bash

与其他远程文件传输工具(如 FTP 或 scp)不同的是,rsync 的最大特点是会检查发送方和接收方对应的、已有的文件,然后仅传输有变动的部分。

因此,在第一次rsync远程同步时,远端无任何内容,所以同步的是全量,以后每次都只是传内容有改变的部分,而不是全部传,这可以极大地节省带宽与传输时间,因此rysnc的IO效率比较高,这在做镜像方面是很不错的。

但是传到远端后,远端再依据之前的内容与传过来的新内容按照算法拼成一个新文件,这是非常耗费cpu计算资源的

```

综上rsync不适用于的场景如下

```bash

  # 1、源路径下的内容都不能算是经常改动的,而是频繁改动的场景,rsync不适合,比如数据库文件

如果源路径频繁改动,rsync将时刻处于高频计算中,因为rsync的底层算法要计算出改动的位置然后把文件分段后再进行重新拼接,io没啥问题,cpu都得累死

  # 2、不适合同步大文件

因为一个10T的文件但凡修改一个字符,远程同步时只会传一个字符,这并不影响io,但是该字符到达远端后,远端主机的rsync却需要把之前文件的内容与该字符拼成一个新文件,如果文件过大,背后的算法是非常消耗cpu资源的,而且跟重写了一个文件也没多大区别

```

- 2、rsync可以实现类似scp的本地路径与远程路径之间的拷贝(rsync不支持远程到远程的拷贝,即源路径与目标路径都是远程路径,但scp支持这一点)

```bash

scp我们经常都是远端到本地,本地到远端,

远端到远端其实scp也是可以的,只不过看不到进度

scp -pr3 root@192.168.12.17:/root/1.txt root@192.168.12.39:/aaa

-p保留权限

-r递归

-3就是远端到远端了

  # 依次输入源主机的密码+回车,然后再输入目标主机的密码+回车即可

```

- 2、rsync虽然是远程同步,但也支持两个本地目录之间同步文件,因此它也可以当作文件复制工具,所以说rsync相当于是集成了cp和scp的功能,但是他们的底层机制不一样

- 4、rsync的远程同步是跨平台的

```

linux --> windows   

windows --> linux   

linux --> mac  

mac --> linux  

mac --> windows

```