rsync命令

一、rsync介绍

1.1 安装与介绍

[root@web02 ~]# rpm -qa |grep rsync
rsync-3.1.2-12.el7_9.x86_64  # 在centos9.3中是3.2.3版

安装完毕之后,你便会得到一个rsync命令,这个命令非常强大

1、你既可以把它当一个客户端命令用
2、也可以用它来启动一个守护进程来充当服务端用
    rsync --daemon 为客户端rsync命令提供基于rsync协议传输的的套接字服务

1.2 rsync作为客户端命令介绍

落到具体的用上面,那就是把rsync当客户端命令来用,它本质就是一个用来拷贝文本的工具,
你既可以在本地使用它来拷贝文件就像cp命令一样,也可以用它来进行远程传输就像scp那样

1、rsync在本地用的时候使用形式与cp一样
2、用于远程传输的时候使用形式与scp一样

但是比起cp或scp,rsync拥有更强大的功能

  • 1、rsync同时涵盖了cp与scp,一条命令既支持本地玩,也支持远程玩
  • 2、本地拷贝或远程传输时,cp或scp都是全量拷贝,而rsync则是增量拷贝,数据量会很小因此速度会非常的快
    rsync可以检测源文件与目标文件的差异,并只复制修改部分,
    这减少了数据传输量和网络消耗,提高了文件同步的效率。
  • 3、远程传输时,rsync支持scp所不具备的断点续传功能,一旦中途断掉重新执行命令不需要复制整个文件
  • 4、灵活性和可配置型强
    rsync拥有大量的命令行选项,可以对传输过程进行精细控制,
    比如可以设定包含和排除规则来控制哪些文件需要被同步,
    也可以尽可能地保留符号链接、硬链接、权限、用户及组信息等文件属性。

rsync也有缺点

  • 1、命令行选型复杂
  • 2、没有检测文件变化的能力,无法做到文件一修改就自动感知到,然后触发rsync进行远程备份,这也是其不完美的地方,如果不配合其他检测文件改动的工具一齐工作,那你只能每次手动或者配置计划任务定时执行,无法做到实时同步本地数据到远端
  • 3、可能过度消耗服务器资源:如果同步的文件数量过多,尤其是需要对每个文件进行增量更新检查时,rsync可能会消耗大量的服务器cpu资源。

总结
rsync是一个非常强大的文件同步工具,尤其适合进行周期性的备份或镜像。但对于需要实时同步的场景,或者对服务器资源敏感的场景,还需要搭配其他解决方案一起用。

1.2 rsync –daemon作为服务端介绍

rsync客户端命令在进行远程传输时,支持两种协议,分别对应两种服务端

  • 1、默认是ssh协议,对应的服务端服务是sshd,也就是说其实你并不是一定要rsync –daemon启动服务端
  • 2、也可以用rsync协议,对应的服务端服务是rsync –daemon
    要求传输的双方都必须安装 rsync包
    yum -y install rsync

    file

服务端你也可以开启sshd,也可以配置开启rsync自己的守护进程
在客户端,你需要为rsync指定使用的协议
1、指定为ssh协议(默认就是),则会与服务端的sshd建立会话

rsync -avz /bak root@192.168.12.17:/data/  # 默认ssh协议,使用系统账号认证

2、指定为rsync协议,则会与服务端的rsync –daemon守护进程建立会话

rsync -av /bak rsync://192.168.12.17/服务端配置的模块名/子路径1/子路径2/

二、像cp命令一样去用rsync

rsync的本地模式

1、语法:
命令   选项        源数据       目标地址
rsync [OPTION]... SRC [SRC]... DEST

2、常用选项:rsync支持一百多个选项,所以此处只介绍几个常用选项
-a --archive  :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-v            :显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-z            :传输时进行压缩提高效率。
-R            :使用相对路径

3、类似于cp命令,又不同于cp
(1)、cp命令只是本地复制,每次cp都会用源文件内容覆盖新文件,所以cp命令会修改文件时间属性,

(2)、rsync可本地可远程,首次rsync与cp一样,后续rsync会对比两个文件的不同,只传输文件更新的部分,如果未更新,则rsync不会修改文件任何属性

4、注意:源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身,这一点本地模式与远程模式均适用

示例1: 拷贝文件

[root@local ~]# rsync /etc/passwd /test

示例2:拷贝文件夹,-r,验证源路径带/后缀与不带后缀的两种情况

[root@local ~]# rsync -r /etc/cron.d /test  # 把文件夹cron.d拷贝到/test下
[root@local ~]# rsync -r /etc/cron.d/ /test  # 把文件夹cron.d下的内容拷贝到/test下

实例3:-r拷贝文件夹,-R会截取你指定目录的相对目录进行拷贝

[root@local ~]# mkdir -p /src/aaa/bbb/ccc
[root@local ~]# mkdir /dst
[root@local ~]# 
[root@local ~]# rsync -r /src/aaa/bbb/ccc /dst/
[root@local ~]# ls /dst/
ccc
[root@local ~]# 
[root@local ~]# rm -rf /dst/*
[root@local ~]# rsync -r -R /src/aaa/bbb/ccc /dst/  # 默认就以/为相对路径起始,拷贝其后目录
[root@local ~]# ls /dst/
src
[root@local ~]# rm -rf /dst/*
[root@local ~]# rsync -r -R /src/./aaa/bbb/ccc /dst/ # 以点左侧为相对路径起始,拷贝其后目录
[root@local ~]# ls /dst/
aaa
[root@local ~]# rm -rf /dst/*
[root@local ~]# rsync -r -R /src/aaa/./bbb/ccc /dst/ # 以点左侧为相对路径起始,拷贝其后目录
[root@local ~]# ls /dst/
bbb
[root@local ~]# 

实例3:如果源文件与目标文件命冲突,增加–backup选项可以确保不会直接覆盖掉,目标位置下的同名文件会被重命名默认~号结尾

[root@remote ~]# mkdir /egon111
[root@remote ~]# mkdir /egon222
[root@remote ~]# 
[root@remote ~]# echo 111 > /egon111/1.txt
[root@remote ~]# echo 222 > /egon111/2.txt
[root@remote ~]# echo 333 > /egon111/3.txt
[root@remote ~]# 
[root@remote ~]# echo 666 > /egon222/1.txt
[root@remote ~]# echo 888 > /egon222/2.txt
[root@remote ~]# 
[root@remote ~]# rsync -r --backup /egon111/ /egon222/
[root@remote ~]# ll /egon222/
总用量 20
-rw-r--r--. 1 root root 4 4月  16 13:12 1.txt
-rw-r--r--. 1 root root 4 4月  16 13:11 1.txt~
-rw-r--r--. 1 root root 4 4月  16 13:12 2.txt
-rw-r--r--. 1 root root 4 4月  16 13:11 2.txt~
-rw-r--r--. 1 root root 4 4月  16 13:12 3.txt
[root@remote ~]# 

# 可以使用"--suffix"指定备份后缀,例如
[root@remote ~]# rsync -r --backup --suffix=".bak" /egon111/ /egon222/

# 也可以干脆不指定任何后缀,我们将重名的文件单独放纵到某一个目录下,用到--backup-dir选项
[root@remote ~]# rm -rf /egon222/*  # egon222目录下的文件都还原到初始状态
[root@remote ~]# echo 666 > /egon222/1.txt
[root@remote ~]# echo 888 > /egon222/2.txt

[root@remote ~]# mkdir /egon222/old_file_bak
[root@remote ~]# rsync -r --backup --backup-dir=/egon222/old_file_bak /egon111/ /egon222/
[root@remote ~]# tree /egon222/
/egon222/
├── 1.txt
├── 2.txt
├── 3.txt
└── old_file_bak
    ├── 1.txt
    └── 2.txt

[root@remote /egon222]# ls
1.txt  2.txt  3.txt  old_file_bak
[root@remote /egon222]# cat 1.txt 
111
[root@remote /egon222]# cat 2.txt 
222
[root@remote /egon222]# cat 3.txt 
333
[root@remote /egon222]# cat old_file_bak/1.txt 
666
[root@remote /egon222]# cat old_file_bak/2.txt 
888

示例4:

=======> 准备文件
[root@www ~]# echo 666 > egon.txt
[root@www ~]# stat egon.txt 
......
最近改动:2021-04-08 20:00:10...

=======> cp每次拷贝都是用新的覆盖旧的,即每次都是全量
[root@www ~]# # 首次拷贝->全量
[root@www ~]# cp -a egon.txt egon111.txt  
[root@www ~]# stat egon111.txt 
......
最近改动:2021-04-08 20:00:20... ---> 改变
[root@www ~]#
[root@www ~]#
[root@www ~]#
[root@www ~]# # 第二次拷贝->仍是全量
[root@www ~]# \cp -a egon.txt egon111.txt  # 加\开头取消默认提示 
[root@www ~]# stat egon111.txt 
......
最近改动:2021-04-08 20:00:30... ---> 改变

=======> rsync首次拷贝为全量,后续拷贝如果参照的源内容不变,则不覆盖目标文件
[root@www ~]# # 首次拷贝->全量
[root@www ~]# rsync -az egon.txt egon222.txt 
[root@www ~]# stat egon222.txt 
......
最近改动:2021-04-08 20:00:40... ---> 改变
[root@www ~]#
[root@www ~]#
[root@www ~]#
[root@www ~]# # 第二次拷贝->检测到源文件没有发生变动,则不会覆盖目标文件
[root@www ~]# rsync -az egon.txt egon222.txt  
[root@www ~]# stat egon222.txt 
......
最近改动:2021-04-08 20:00:40... ---> 不变
[root@www ~]#
[root@www ~]#
[root@www ~]#
[root@www ~]# # 第三次拷贝->检测到源文件没有发生变动,则不会覆盖目标文件
[root@www ~]# rsync -az egon.txt egon222.txt  
[root@www ~]# stat egon222.txt 
......
最近改动:2021-04-08 20:00:40... ---> 不变

其他选项

# 0、选项-c、--checksum改变rsync的检查方式
默认情况下,rsync基于"quick check"算法只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式,比如"--size-only"选项表示"quick check"将仅检查文件大小不同的文件作为待传输文件。

使用-c参数以后,则通过判断文件内容的校验和,决定是否重新传输,增强了数据传输的可靠性但降低了效率,是否使用该选项呢?如果是私网内部传输,网络通常可控且较为稳定,文件完整性通常不会有问题,不需要加-c选项,如果是传到外网,网络不可控且不够稳定,可以考虑加上-c选项增强可靠性,此时需要付出的代价就是效率的降低,用不用请自行斟酌

rsync支持非常多的选项
一些选项控制检查的模式(如-c、--size-only等)、一些选项控制文件同步的模式(例如--delete等)
检查模式决定了哪些文件需要被同步
文件同步模式决定了在文件确定要被同步后、同步过程发生之前要做的额外工作
相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能,例如上面所述-c选项

# 1、选项-n
如果不确定 rsync 执行后会产生什么结果,可以先用`-n`或`--dry-run`参数模拟执行的结果。
rsync -anv source/ destination

上面命令中,-n参数模拟命令执行的结果,并不真的执行命令。-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。

# 2、选项--delete
如果要使得目标目录成为源目录的镜像副本,则必须使用`--delete`参数,这将删除只存在于目标目录、不存在于源目录的文件,也就是"多则删之,少则补之"。

[root@www ~]# echo 111 > /aaa/1.txt
[root@www ~]# echo 222 > /aaa/2.txt
[root@www ~]# echo 333 > /aaa/3.txt
[root@www ~]# echo 444 > /bbb/4.txt
[root@www ~]# 
[root@www ~]# 
[root@www ~]# 
[root@www ~]# rsync -az --delete /aaa/ /bbb/
[root@www ~]# ls /bbb/
1.txt  2.txt  3.txt

# 3、选项--exclude
有时,我们希望同步时排除某些文件或目录,这时可以用--exclude参数指定排除模式。
$ rsync -av --exclude='*.txt' source/ destination
或者
$ rsync -av --exclude '*.txt' source/ destination
上面命令排除了所有 TXT 文件。
注意,rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"。

如果要排除source/下某个子目录里面的所有文件,但不希望排除该子目录本身,可以写成下面这样。
$ rsync -av --exclude 'dir1/*' source/ destination #  强调,--exlucde里指定的路径只能是相对目录,./都不能带,直接写子目录就行

#  强调,--exlucde里指定的路径只能是相对目录,./都不能带,直接写子目录就行
[root@k8s-master-01 ~]# tree /aaa
/aaa
├── 1.txt
├── 2.txt
├── 3.txt
├── a
│   └── aaaa.txt
└── b
[root@k8s-master-01 ~]# rsync -zavn --exclude={'1.txt','a/*'} /aaa/ /bbb/
sending incremental file list
./
2.txt
3.txt
a/
b/


多个排除模式,可以用多个--exclude参数。
$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination 

多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。
$ rsync -av --exclude={'file1.txt','dir1/*'} source/ destination

如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件。
$ rsync -av --exclude-from='exclude-file.txt' source/ destination

# 4、选项--include
用来指定必须同步的文件模式,往往与--exclude结合使用。
$ rsync -av --include="[0-9].txt" --exclude='*' source/ destination
上面命令指定同步时,排除所有文件,但是会包括1.txt、2.txt等文件,注意--include必须在--exclude之前

三、像scp命令一样取用rsync

rsync的远程模式,支持两种协议

  • 1、采用ssh协议,对应的服务端为sshd
  • 2、采用rsync协议,对应的服务端为rsync –daemon启动的守护进程

3.1 基于ssh协议

1、服务端准备与介绍

(1)在本地与目标主机都安装rsync(没错,哪怕你用ssh协议也要安装)
(2)远程主机要打开sshd服务
(3)需要用到的账号是远程主机可登录的、系统账号---》不安全
(4)不受目录限制------------------------------》不安全

2、客户端传输

# 基于ssh协议,rsync 在传输数据之前,会先与远端进行一次 ssh 登录认证(采用的就是系统账号),
# 因此需要目标主机事先开启ssh服务
rsync -avz /xxx root@1.1.1.1:/yyy
rsync -avc root@1.1.1.1:/yyy /xxx

示例1:拉取

[root@www ~]# rsync -avz root@192.168.12.17:/data /bak/
......
[root@www ~]# ls /bak/
data
[root@www ~]# 可以用stat命令查看一下最近改动时间,然后再次执行下行命令
[root@www ~]# rsync -avz root@192.168.12.17:/data /bak/
[root@www ~]# 此时用stat命令查看一下最近改动时间,与上一次完全相同

示例2:推送

[root@www ~]# rsync -avz /bak root@192.168.12.17:/data/  # 推送

由于早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。

$ rsync -av -e ssh source/ user@remote_host:/destination

但是,如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。

$ rsync -av -e 'ssh -p 8888' source/ user@remote_host:/destination

上面命令中,-e参数指定 SSH 使用2234端口。

3.2 基于rsync协议

(1)快速了解流程

1、服务端准备与介绍

(1)在本地与目标主机都安装rsync
(2)远程主机要打开rsync守护进程,端口默认873
    rsync --daemon
    或
    systemctl start rsyncd
(3)用到的是虚拟账号,虚拟账号对应的是配置文件中uid的权限,例如:uid=rsync
    虚拟账号egon------->远端主机真实存在的系统账号rsync
(4)用的是模块名-》具体的目录

为什么推荐使用守护进程模式?
1.基于ssh的认证,传输时会使用系统用户和密码,不安全,而守护进程模式使用的是虚拟用户和虚拟密码
2.当使用普通用户传输文件时会出现权限不足的情况,而守护进程模式可以解决这个问题

centos7.9中默认有一个系统服务rsyncd,你可以查看下它的systemctl相关配置,本质就是启动rsync –daemon守护进程

file

2、客户端使用

服务端的sshd服务关闭掉了,意味着你无法继续用ssh协议了,客户端想实现远程传输
只能用rsync协议,指定使用rsync协议的方式有两种

# 方式一:rsync://前缀,代表使用rsync协议(服务端端口默认873)---》该方式了解就行,不推荐记忆
$ rsync -av source/ rsync://192.168.12.66/服务端配置文件设置的模块名/路径  # 

# 方式二:ip地址与目标路径之间放置连续两个冒号,也代表使用rsync协议创术
$ rsync -az source/ 虚拟用户名@192.168.12.39::服务端配置文件设置的模块名/路径  

注意:
1、推荐使用方式二,因为除了连续两个冒号外,形式上跟scp的形式非常像了
2、服务端配置文件中设置的模块名,是一个虚拟的配置,该配置项设定的服务端具体路径
3、不指定虚拟用户名,则默认使用客户端当前登录的用户名去连接远程,而远程主机如果碰巧开的虚拟用户名能对得上那才行,否则完蛋,所以还是建议在客户端指定具体的虚拟用户名

若远程主机修改了rsync守护进程的端口,那么在本机应该这么做
$ rsync -av source/ rsync://192.168.12.66:879/module/destination  # 可以指定端口

完整语法:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

(2)配置与使用实操

守护进程模式搭建

I:环境准备

主机 IP 角色
本地 192.168.12.17 rsync客户端
远程 192.168.12.39 rsync服务端
本地与远程均执行下述两条命令
setenforce 0
iptables -F

II:安装rsync(本地和远程主机都要装)

[root@remote ~]# yum install rsync -y

III:在远程主机配置并启动守护进程
!!!强调一个核心点,其他的都好理解!!!

secrets file = /etc/rsync.passwd 指定虚拟机用户及密码,客户端用的就是这个虚拟用户
uid与gid指定的是存在于远程主机的系统用户
当客户端利用虚拟用户连接到远程主机后便会转换成uid与gid指定的身份

具体配置如下

[root@remote ~]# vim /etc/rsyncd.conf 
# 虚拟用户egon对应的就是该用户的权限,限制的是客户端的权限
uid = rsync
# 虚拟用户egon对应的就是该组的权限,限制的是客户端的权限,
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = egon
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[xxx]
comment = "备份文件的目录"
path = /egon_bak

rsync默认配置文件各配置项详解如下,注意不要将注释卸卸载配置项后面

[root@remote ~]# vim /etc/rsyncd.conf
#客户端以虚拟用户egon登录成功后,会转换成uid指定的身份,然后以该身份来完成对目标目录的写操作
uid = rsync

#客户端以虚拟用户egon登录成功后,转换成的组身份
gid = rsync

#端口
port = 873

#设置为yes,则代表uid可以不为root
#注意,如果想让rsync -a选项能把本地文件的属主和属组也同步到远端
#则必须让远端的守护进程以root用户启动,即设置uid=root、gid=root,并且将fake super改为no
#在rsync -a选项下,本地文件的uid和gid会同步给服务端,但服务端的uid和gid对应的用户和组名有可能与本地不一致,这完全正常
fake super = yes

#安全机制,rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
use chroot = no  

#最大连接数,0表示没有限制
max connections = 200

#超时时间,确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
timeout = 600

#忽略错误
ignore errors

#关闭只读
read only = false

#查看模块列表,改为true后,在local端可以用命令rsync rsync://192.168.12.39查看远端可用的模块数
list = false  

#指定虚拟用户,传输时使用该用户就会对应到真实系统用户rsync的权限,把此处注释掉,可以在模块里设置
#auth users = egon  

#指定虚拟用户的密码文件
#secrets file = /etc/rsync.passwd

#日志文件
log file = /var/log/rsyncd.log

# 指定哪些文件不用进行压缩传输
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  

###########下面指定模块,并设定模块配置参数,可以创建多个模块###########
# 模块名为xxx,对应的实际目录为/egon_bak
[xxx]   
#备注
comment = "备份文件的目录"

#真实文件目录
path = /egon_bak

# 忽略某些IO错误信息
ignore errors    

# 指定该模块是否可读写,即能否上传文件,false表示可读写,true表示可读不可写。所有模块默认不可上传
read only = false  

# 指定该模式是否支持下载,设置为true表示客户端不能下载。所有模块默认可下载
write only = false 

# 客户端请求显示模块列表时,该模块是否显示出来,设置为false则该模块为隐藏模块。默认true
list = false       

# 指定允许连接到该模块的机器,多个ip用空格隔开或者设置区间
hosts allow = 10.0.0.0/24 

# 指定不允许连接到该模块的机器
hosts deny = 0.0.0.0/32   

# 若模块里指定虚拟用户,则把全局的注释掉即可
auth users = rsync_backup 
secrets file = /etc/rsyncd.passwd 
# 保存auth users用户列表的用户名和密码,每行包含一个username:passwd。
# 由于"strict modes"默认为true,所以此文件要求非rsync daemon用户不可读写。只有启用了auth users该选项才有效。

[yyy]    # 以下定义的是第二个模块,未设置虚拟账号,则所有账号都可以操作该模块
path=/bak/
read only = false
ignore errors

在远程主机:创建启动守护进程时用到的用户与组

[root@remote ~]# useradd rsync -s /sbin/nologin -M

在远程主机:配置虚拟用户egon的密码文件

[root@remote ~]# echo "egon:123" > /etc/rsync.passwd  # 虚拟用户egon的密码为123,注意这是在服务端的密码文件,里面必须是"用户名:密码"的格式,而在客户端则不一样
[root@remote ~]# chmod 600 !$

在远程主机:为模块xxx创建真实的目录

[root@remote ~]# mkdir /egon_bak
[root@remote ~]# chown -R rsync.rsync /egon_bak/

在远程主机:启动守护进程

# 1、rsync daemon的启动方式很简单。
[root@remote ~]# rsync --daemon  # 启动 rsync 服务,以独立监听服务的方式(守护进程)运行 
# 注意注意注意:
我们是以root用户启动的rsync进程,所以rsync的进程身份就是root,一定与配置文件中的uid指定的身份区分开
说白了我们以什么用户启动服务端的rsync进程,控制的是服务端软件的权限
而配置文件中的uid控制的则是客户端的权限、对目录/egon_bak的权限

[root@remote ~]# netstat -anpt | grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      55535/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      55535/rsync   

# 2、如果是CentOS 7,则自带启动脚本。
[root@remote ~]# systemctl start rsyncd  
# 可以查看启动脚本的内容:cat /usr/lib/systemd/system/rsyncd.service
# 可以看到较本质启动方法也仅仅只是多了一个"--no-detach",该选项表示rsync不将自己从终端上剥离。

IV:测试

# 1、在本地拉取
准备:远程主机创建文件
[root@remote ~]# echo "111" > /egon_bak/1.txt 

拉取
rsync -az egon@192.168.12.39::xxx /test  # 不指定虚拟用户名egon,则默认使用当前用户名
Password: 123  # 输入虚拟用户egon的密码123

rsync -az egon@192.168.12.39::xxx/111.txt /test # 指定模块下的具体文件
# 2、在本地推送
准备:本机机创建文件
echo "222" > /test/2.txt 

推送: 使用的是虚拟用户egon
rsync -az --delete /test/ egon@192.168.12.39::xxx 

# 3、若本地不想手动输密码,有两种方式解决
(1) 写入文件
echo 123 > /etc/egon.password  # 客户端的密码文件只能写入密码
chmod 600 /etc/egon.password  # 必须配置好权限
rsync -az egon@192.168.12.39::xxx /test --password-file=/etc/egon.password

(2) 配置变量
[root@local ~]# export RSYNC_PASSWORD=123  # 变量名是固定的
[root@local ~]# rsync -az egon@192.168.12.39::xxx /test

V:限速传输

有些机房会限制机器的流量,在使用scp和rsync的时候都要注意,为了防止出现断流现象,我们必须对自己的数据传输进行一定的限流措施,慢一点总比被掐了的好。

rsync限制速度很简单,添加个参数即可bwlimit,后面的值是多少KBytes/s

# --bwlimit=100     # 单位是KB/s
生成一个500M的文件
[root@local ~]# dd if=/dev/zero of=/tmp/egon.txt bs=1M count=500

指定速率传输,-P显示同步的过程及传输时的进度等信息
[root@local ~]# rsync -avzP --bwlimit=10 /tmp/egon.txt egon@192.168.12.39::xxx

# 注意
blocks of data are sent, then if rsync determines the transfer was too fast, it will wait before sending the next data block. The result is an average transfer rate equaling the specified limit.
数据块发送后,如果rsync确定传输速度过快,它将在发送下一个数据块之前等待。结果是平均传输速率等于指定的限制。
所以rsync是是根据传输平均值来调节生成的吞吐量,你看到当前的传输效率比你指定的大也是很正常的。

例如--bwlimit=5,应该是5KB/s才对,但是实际运行看到的是10MB/s
rsync的--bwlimit参数是平均带宽,它会在一些周期内起作用。所以,你可能会在一些周期内看到速度高于5KB/s,但在其他周期内速度低于5KB/s,从而使得平均速度接近于5KB/s。

3.3 rsync协议与ssh协议的认证方式总结

  • 1、基于ssh认证
I:使用的是远程主机的系统账号与密码
II:通过ssh隧道进行传输
    需要远程主机开启sshd服务
    只需要双方安装rsync,不需要双方启动rsync,
    类似于scp工具,同步操作不局限于rsync中定义的同步文件夹,
  • 2、基于守护进程认证,即rsync-daemon
I:使用的是远程主机的虚拟账号,在rsync-daemon认证下,rsync可以把密码写入到一个文件中。
II:在rsync-daemon认证方式下
    只需要双方安装rsync,并且远程主机需要开启rsync进程,默认监听tcp的873端口
    同步操作只能同步到远程主机指定的目录下

3.4 断点续传

 
以下是一个使用 rsync 进行断点续传的实例:
bash
rsync -avz --progress --partial /originating/directory/ user@remote-host:/destination/directory/
在这个实例中:
-a 选项是归档模式,可以递归地传输文件,并保持所有文件属性。
-v 选项表示详细模式,用于打印出更多的信息。
-z 选项是通过网络传输时进行压缩,可以加快传输速度。
--progress 选项可以显示传输过程中的详细信息,便于了解传输进度。
--partial 选项让 rsync 保留那些因某种原因未能完全传输的文件,以便于后续继续传输。
-P: 等同于 --partial --progress

假设我们使用上述命令开始一个文件传输任务,在传输过程中网络连接断开,我们只需在连接恢复后再次执行同样的命令,rsync 会从断点处继续传输

示例:
1、可以创建一个大文件测试
dd if=/dev/zero of=/tmp/a.txt bs=1G count=5
2、断点续传
rsync -avz  --progress --partial /tmp/a.txt root@192.168.71.113:/opt
3、此时可以在本机上top命令查看rsync的cpu利用率高,因为要计算

4、传到差不多82%的时候,ctrl+c终止掉传输
[root@nfs ~]# rsync -avz  --progress --partial /tmp/a.txt root@192.168.71.113:/opt
sending incremental file list
a.txt
  4,451,270,656  82%  165.32MB/s    0:00:05  ^CKilled by signal 2.

rsync error: unexplained error (code 255) at rsync.c(638) [sender=3.1.2]
rsync: [sender] write error: Broken pipe (32)

5、去对端看到已经传了4G
[root@web02 /opt]# ls -lh /opt/a.txt 
-rw-r--r-- 1 root root 4.0G 1月   1 1970 /opt/a.txt

6、重新执行命令后断点续传,先计算断点位置,完毕后续传,然后新内容与旧内容合并到一起
rsync -avz  --progress --partial /tmp/a.txt root@192.168.71.113:/opt


四、rsync实现增量备份

4.1 储备备份相关知识

1、什么是备份

备份就是把重要的数据复制一份到其他位置保留起来

2、为何要备份

备份-》为了防止数据丢失时,可以通过备份恢复回来
备份意识在运维管理中是一个基本常识

3、如何备份之三种备份方案/思想

# 1、全量备份/完全备份(Full Backup)
每次备份的结果都是一次完整的拷贝

# 2、差异备份(Differential Backup)
每次备份时,都是基于第一次完全备份的内容,只备份有差异的数据(新增的、修改的、删除的),例如

第一次备份:完全备份
第二次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第三次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第四次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第五次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
。。。

# 3、增量备份(Incremental Backup )
每次备份时,都是基于上一次备份的内容(注意是上一次,而不是第一次),只备份有差异的数据(新增的、修改的、删除的),所以增量备份的结果是一条链,例如

第一次备份:完全备份
第二次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第三次备份:以当前时间节点的数据为基础,备份与第二次备份内容的差异
第四次备份:以当前时间节点的数据为基础,备份与第三次备份内容的差异
第五次备份:以当前时间节点的数据为基础,备份与第四次备份内容的差异
。。。

file

针对上述三种备份方案,如何恢复数据呢

# 1、全量备份的数据恢复

只需找出指定时间点的那一个备份文件即可,即只需要找到一个文件即可

# 2、差异备份的数据恢复
需要先恢复第一次备份的结果,然后再恢复最近一次差异备份的结果,即需要找到两个文件

# 3、增量备份的数据恢复
需要先恢复第一次备份的结果,然后再依次恢复每次增量备份,直到恢复到当前位置,即需要找到一条备份链

综上,对比三种备份方案

  • 1、占用空间:全量 > 差异 > 增量
  • 2、恢复数据过程的复杂程度:增量 > 差异 > 全量

4、备份的位置

本地备份

异地备份(推荐)

5、常用备份工具

1、cp命令:可以,但因其只能在本地拷贝,所以不会用它来备份,而且cp会产生大量文件占用大量inode,还不如用tar
2、scp远程传输
3、rsync远程传输

6、备份的时候用push还是pull
我们用rsync在我们的架构中对nfs文件存储做备份,此时文件存储作为服务端,我们的备份机作为客户端,在备份机只有一台的情况下,使用push与pull没有多大差别的,都不会对服务端造成过多的压力
但是在别的备份场景即客户端比较多的情况下,则对服务器的请求压力、带宽都会有要求,为了分摊压力,可以是多级节点的方式,服务的将数据push到一个地方,客户端都从这个地方pull数据到本地,这样可以减轻服务器的压力,但实时性方面可能会弱一些

4.2 rsync实现增量备份

rsync 的最大特点就是它可以完成增量备份,
除了源目录与目标目录直接比较,rsync还支持使用–link-dest参数用来指定同步时的基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 青浦区尚茂路798弄 联系方式-13697081366