跳至正文

rsync远程同步备份

一、简介

Rsync 全称remote synchronize,即”远程同步”,是Liunx/Unix下的一款开源,快速,多功能的可实现全量及增量(差异化)的本地或远程数据同步备份工具,适用于 Linux、Windows 等多种操作系统。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。

参考文章

二、rsync传输方式

(推拉是由客户端发起的)
推:push,上传(upload),将客户端数据上传到rsync服务端,所有主机推送本地数据至rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
拉:pull,下载(download),将rsync服务端的数据下载到客户端,rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大

三、语法常用命令

语法:
命令   选项        源数据       目标地址
rsync [OPTION]... SRC [SRC]... DEST
​
常用选项:rsync支持一百多个选项,所以此处只介绍几个常用选项
-a --archive  : 归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r            : 递归传输目录和子目录
-v            : 显示rsync过程,可以使用"-vvvv"获取更详细信息。
-P            : 显示rsync过程及详细信息(传输进度)
-z            : 传输时进行压缩提高效率。
-R            : 使用相对路径(存储时自动创建当前文件从根开始完整目录文件夹)
-c --checksum : 
-n            : 模拟执行,不实际操作文件
特殊选项:
--delete      : 使目标目录成为源目录镜像存在(对目标目录‘多删少补’)
--exclude     : 指定排除文件模式,例:
(--exclude='*.txt'                                                排除所有txt文件)
(--exclude=".*"                                                   排除所有.开头隐藏文件)
(--exclude 'dir1/*'                                               排除某个子目录里面的所有文件,但不希望排除该子目录本身)
(--exclude 'file1.txt' --exclude 'dir1/*')                       多个排除模式
(--exclude={'file1.txt','dir1/*'})                               多个排除模式汇总
(--exclude-from='exclude-file.txt')                              多个排除模式调用文件
--include     : 必须同步模式,一般与排除模式混用(--include必须在--exclude之前),例:
(--include="[0-9].txt" --exclude='*')                            排除所有文件,但是会包括1.txt、2.txt等文件
--backup      : 同步时对目标目录下已存在的文件做备份,以后缀'~'标识
--backup-dir  : 与上一条配合使用,指定备份路径,要求路径必须存在(使用该选项后默认不会添加后缀,除非显式指定),例:--backup-dir=/mnt/bak
--suffix      : 指定备份使用后缀:例:--suffix=".bak"

四、rsync两种工作模式:

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


1、本地模式

本地模式时,类似于cp
cp命令只是本地复制,每次cp都会用源文件内容覆盖新文件,所以cp命令会修改文件时间属性
rsync可本地可远程,首次rsync与cp一样,后续rsync会对比两个文件的不同,只传输文件更新的部分,如果未更新,则rsync不会修改文件任何属性

示例:rsync /mnt/sda /test

2、远程模式

传输时需要认证远程主机的账号密码,有两种认证方式:ssh认证与守护进程rsync-daemon认证

ssh协议

基于ssh协议:rsync 默认使用 SSH 进行远程登录和数据传输,详细地说,rsync 在传输数据之前,会先与远端进行一次 ssh 登录认证(采用的是系统账号),因此需要目标主机事先开启ssh服务。

(1)在本地与目标主机都安装rsync
(2)远程主机要打开sshd服务
(3)需要用到的账号是远程主机可登录系统账号—》不安全
(4)不受目录限制————————-》不安全

语法:语法类似于scp命令,但备份方案不同于scp(scp 与 cp一样,每次都是全量)

# 拉取
命令   选项        远程用户@远程主机:远程的目录作为源   本地作为目标
rsync [OPTION]    [USER@]HOST:SRC                [DEST]
​
# 推送
命令   选项        本地数据作为源                   远程用户@远程主机:远程的目录作为目标
rsync [OPTION]    SRC [SRC]...                  [USER@]HOST:DEST

示例:
拉取   rsync -avz root@192.168.12.17:/data /bak/
推送   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端口。

守护进程rsync协议

守护进程模式其实也是一种远程模式,只不过采用的是rsync协议传输,若想采用rsync协议传输,则需要远程主机也安装rsync,并启动rsync守护进程,此时不需要依赖远程主机的sshd服务

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

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

# 方式一:rsync://协议(默认端口873)
$ rsync -av source/ rsync://192.168.12.66/module/destination
​
# 方式二:远程目标前面使用连续两个冒号
$ rsync -av source/ 192.168.12.66::module/destination
​
完整语法:
rsync ----命令
[OPTION…] ----选项
[USER@] ----远程主机用户(虚拟用户)
HOST:: ----远程主机地址
SRC… ----远程主机模块(不是目录)
[DEST] ----远程主机数据备份至本地位置

拉取 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
例子:# rsync -avz rsync_backup@192.168.20.21::backup/ /mnt/ --password-file=/etc/rsync.password

推送 Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
例子:# rsync -avz /mnt/ rsync_backup@192.168.20.21::backup/ --password-file=/etc/rsync.password
        
若远程主机修改了rsync守护进程的端口,那么在本机应该这么做
$ rsync -av source/ rsync://192.168.12.66:879/module/destination  # 可以指定端口

注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。

守护进程模式搭建

1、本地和远程主机安装rsync

2、远程主机配置并启动守护进程
创建编辑配置文件 vim /etc/rsyncd.conf

#客户端以虚拟用户egon(客户端登录服务端使用的虚拟账号)登录成功后,会转换成uid指定的身份,然后以该身份来完成对目标目录的写操作(文件实际写入时使用的账号)
uid = rsync
​
#客户端以虚拟用户egon登录成功后,转换成的组身份
gid = rsync
​
#端口
port = 873
​
#设置为yes,则代表uid可以不为root
fake super = yes

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

#安全机制,rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
use chroot = no
​
#最大连接数,0表示没有限制
max connections = 200
​
#超时时间,确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
timeout = 600
​
#忽略错误(忽略I/O错误,报错会跳过--delete)
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用户列表的用户名和密码,每行包含一个username:passwd。
auth users = rsync_backup

# 由于"strict modes"默认为true,所以此文件要求非rsync daemon用户不可读写。只有启用了auth users该选项才有效。
secrets file = /etc/rsyncd.passwd

创建启动守护进程时用到的用户与组(已存在用户则无需创建)

useradd rsync -s /sbin/nologin -M

配置虚拟用户egon的密码文件

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

为模块xxx创建真实的目录

mkdir /egon_bak
chown -R rsync.rsync /egon_bak/

启动守护进程

rsync --daemon

客户端使用

创建密码文件

echo 123 > /etc/egon.password  # 客户端的密码文件只能写入密码,文件名可以自定义
chmod 600 /etc/egon.password  # 必须配置好权限
rsync -az egon@192.168.12.39::xxx /test --password-file=/etc/egon.password

发表回复