rsync笔记

备份类型

全量备
每次都是全文件备份
恢复数据时直接将备份文件还原回指定位置

差异备
每次都参考第一次文件的差异进行备份
恢复数据时需要将第一次和最后一次数据合并后还原回指定位置

增量备
每次都参考上一次文件的差异进行备份
恢复数据时需要将第一次全量备份和之后的每一次数据合并后还原回指定位置

rsync传输模式

pull 拉

​ 从远程主机拉取到本地

​ 例如: rsync [OPTION]… [USER@]HOST:SRC DEST

push 推

​ 从本地推送到远程服务器

​ 例如: rsync [OPTION]… SRC [USER@]host:DEST

rsync安装方式命令参数

# rsync安装方式
[root@vm-nfs-41 ~]# yum install rsync -y

#rsync语法
命令     选项        源数据      					   目的地址
rsync [OPTION]...   SRC								DEST
rsync [OPTION]...   SRC        						[USER@]host:DEST
rsync [OPTION]... 	[USER@]HOST:SRC					DEST
rsync [OPTION]... 	[USER@]HOST::SRC 				DEST
rsync [OPTION]... 	SRC 							[USER@]HOST::DEST
rsync [OPTION]... 	rsync://[USER@]HOST[:PORT]/SRC 	[DEST]
#命令参数 

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-v, --verbose 详细模式输出。
-r, --recursive 对子目录以递归模式处理。
-z, --compress 对备份的文件在传输时进行压缩处理。
-c, --checksum 打开校验开关,强制对文件传输进行校验(校验传输后的数据完整性)。
-R, --relative 使用相对路径信息同步。
        例: [root@vm-nfs-41 ~]# rsync -a -R a/b/c/d dest
            [root@vm-nfs-41 ~]# ll dest/
            drwxr-xr-x 3 root root 15 4月  29 22:52 a

            加上./后
            [root@vm-nfs-41 ~]# rsync -a -R a/b/./c/d dest
            [root@vm-nfs-41 ~]# ll dest/
            drwxr-xr-x 3 root root 15 4月  29 22:52 c
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
--bwlimit=KBPS 限制I/O带宽,KBytes per second(KBytes/s)。
--progress 在传输时现实传输过程。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
-P 等同于 --partial。
-n, --dry-run 显示哪些文件将被传输。(测试,通常搭配-v使用 dry-run)
--link-dest 指定基准目录  用于增量备,通常搭配--delete  rsync增量备会将未更改的基准文件以硬链接方式连接到增量后是文件夹中,恢复时只需恢复最后增量备份的文件
--delete 删除那些DST中SRC没有的文件。(强制是源目录和目标目录保持一致 目标多出来的文件会被删掉)
例如: rsync -a --delete src dest  #强制是源目录和目标目录保持一致 目标多出来的文件会被删掉
--exclude=PATTERN 指定排除不需要传输的文件模式。
例如: rsync -a --exclude=(*.txt,*.jpg) src  dest  #排除源路径中所有以txt和jpg结尾的文件
--include=PATTERN 指定不排除而需要传输的文件模式。
例如: rsync -a --include=*.txt src  dest #只同步源路径中所有以txt结尾的文件
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
-q, --quiet 精简输出模式。
-suffix=SUFFIX 定义备份文件后缀。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete-excluded 同样删除接收端那些被该选项指定排除的文件。
--delete-after 传输结束以后再删除。
--ignore-errors 及时出现IO错误也进行删除。
--max-delete=NUM 最多删除NUM个文件。
--force 强制删除目录,即使不为空。
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR 在DIR中创建临时文件。
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
--version 打印版本信息。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
-h, --help 显示帮助信息。

rsync原理

rsync远程传数据可以简单总结为三步
1、先验证用户身份
2、检查源路径到底需要传哪些文件,默认quick check算法
3、传输

ps: 远程传输远程与本地机器都必须安装rsync
ps: rsync -a 第一次拷贝时会全量备份,第二次拷贝时会通过算法比较源和目标文件的信息,如果文件为发生过改变,则rsync不会复制
例如:
#第一次拷贝为全量备份
[root@vm-nfs-41 src]# rsync -a rsync_test.txt ../dest/
[root@vm-nfs-41 src]# stat rsync_test.txt ../dest/rsync_test.txt 
  文件:rsync_test.txt
  大小:11        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:17571       硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2022-04-28 16:39:11.923351844 +0800
最近更改:2022-04-28 16:38:26.915087580 +0800
最近改动:2022-04-28 16:38:26.915087580 +0800
创建时间:2022-04-28 16:38:09.147983262 +0800
  文件:../dest/rsync_test.txt
  大小:11        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:33600798    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2022-04-28 16:39:11.923351844 +0800
最近更改:2022-04-28 16:38:26.915087580 +0800
最近改动:2022-04-28 16:39:11.923351844 +0800
创建时间:2022-04-28 16:39:11.923351844 +0800

#第二次拷贝时会比较源和目标文件的信息,如果文件为发生过改变,则rsync不会复制
[root@vm-nfs-41 src]# rsync -a rsync_test.txt ../dest/
[root@vm-nfs-41 src]# stat rsync_test.txt ../dest/rsync_test.txt 
  文件:rsync_test.txt
  大小:11        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:17571       硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2022-04-28 16:39:11.923351844 +0800
最近更改:2022-04-28 16:38:26.915087580 +0800
最近改动:2022-04-28 16:38:26.915087580 +0800
创建时间:2022-04-28 16:38:09.147983262 +0800
  文件:../dest/rsync_test.txt
  大小:11        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:33600798    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2022-04-28 16:39:11.923351844 +0800
最近更改:2022-04-28 16:38:26.915087580 +0800
最近改动:2022-04-28 16:39:11.923351844 +0800
创建时间:2022-04-28 16:39:11.923351844 +0800
ps: 拷贝目录时注意
rsync -a src/源目录 dest目标     #不加目录后的/代表拷贝源目录本身
rsync -a src/源目录/  dest目标   #加目录后的/代表不拷贝源目录本身

远程传输服务端配置

远程传输需要经过验证,验证方式有两种

  1. ssh认证(不安全)

    • 本地和远程都需要安装rsync软件

    • 远程主机需要开启sshd服务

    • 不受文件夹限制(不安全)

    • 需要用到的账号密码是远程主机的系统账号密码(因为传输时需要远程主机账号密码可能会有安全隐患)

    • 例如: 
      #推push
      [root@vm-nfs-41 ~]# rsync -az ./initalize.sh root@172.16.1.2:~
      #拉pull
      [root@vm-nfs-41 ~]# rsync -az root@172.16.1.2:~/initalize.sh  ~
      #其中root@172.16.1.2为远程主机用户名和地址
      
  2. 基于rsync-daemon认证(既快又安全)

    • 本地和远程都需要安装rsync软件
    • 远程主机不需要开启sshd服务
    • 服务端需要开启rsync守护进程
    • 需要自行创建配置文件
#添加配置文件 
#文件名必须为rsyncd.conf 路径在/etc下
[root@vm-nfs-41 ~]# vim /etc/rsyncd.conf
uid = rsync             			#虚拟用户转换身份 rsync的uid 需要保证对被传输path有读写权限(系统用户)    
gid = rsync 						#rsync的gid
port = 873							#rsync端口号	
pid file = /var/run/rsyncd.pid		#进程pid文件目录
fake super = yes					#rsync daemon以非root用户启动时,即便接收到了超出自己权限的文件,也可传输保存	
use chroot = no						#安全机制
max connections = 200				#最大连接数
timeout = 600						#超时时间
ignore errors						#忽略错误
read only = false					#是否是只读权限
list = false						#用户端是否可以查看模块列表
auth users = hanjy					#定义rsync虚拟用户用来文件同步
secrets file = /etc/rsync.passwd	#定义rsync虚拟用户连接密码 注意权限为600
log file = /var/log/rsync.log		#日志存放位置
hosts allow = 172.16.1.0/24			#允许的主机
hosts deny = 10.0.0.0/24		    #拒绝网段
[backup]							#备份模块 可以是多个
comment = "backup"					#备份模块说明
path = /backup						#备份路径

创建系统用户与组

[root@vm-nfs-41 ~]# useradd -r  rsync -s /sbin/nologin

创建rsync虚拟用户和密码,更改文件权限

# 密码文件格式为:"虚拟用户名:密码"格式
#ps: 服务端密码文件格式为:"虚拟用户名:密码",客户端密码文件格式为:"密码"
[root@vm-nfs-41 ~]# echo "hanjy:123456" > /etc/rsync.passwd 

#密码文件权限必须为600
[root@vm-nfs-41 ~]# chmod 600 /etc/rsync.passwd 

为模块backup创建真实目录并更改所有者

[root@vm-nfs-41 ~]# mkdir /backup
[root@vm-nfs-41 ~]# chown -R rsync. /backup/

启动rsync-daemon守护进程

[root@vm-nfs-41 ~]# rsync --daemon

#检查rsync是否启动
[root@vm-nfs-41 ~]# ps -ef |grep [r]sync
root        1682       1  0 20:29 ?        00:00:00 rsync --daemon
客户端配置
#创建密码文件
[root@vm-nginx01-2 ~]# echo 123456 > ./rsync.passwd

#更改密码文件权限为600
[root@vm-nginx01-2 ~]# chmod 600 rsync.passwd 

#传输文件
#格式: rsync -az --password-file=创建密码文件路径  源路径  虚拟用户@主机地址::模块名称
#ps:  hanjy@172.16.1.41::backup 此处为双冒号 单冒号走的是ssh认证 双冒号才走rsync-daemon认证
[root@vm-nginx01-2 ~]# rsync -az --password-file=/root/rsync.passwd ./test/ hanjy@172.16.1.41::backup
#第二种写法
[root@vm-nginx01-2 ~]# rsync -az --password-file=/root/rsync.passwd ./test/ rsync://hanjy@172.16.1.41:873/backup
#使用变量指定密码写法:
[root@vm-nginx01-2 ~]# export RSYNC_PASSWORD=123456
[root@vm-nginx01-2 ~]# rsync -az  ./test/ hanjy@172.16.1.41::backup 
#查看服务端是否接收文件
[root@vm-nfs-41 backup]# ll /backup/
-rw-r--r-- 1 rsync rsync 0 4月  29 20:58 1.txt
-rw-r--r-- 1 rsync rsync 0 4月  29 20:58 2.txt

rsync缺点

1、耗费cpu资源
2、源路径下如果是频繁改动的,rsync不适合,比如数据库文件
3、不适合同步大文件