Rsync 简介
rsync 是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平台。
传统的 scp 和 cp 工具拷贝每次均为完整拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝功能。因此,从同步数据的性能及效率上,Rsync工具更胜一筹。
官网地址:
1 | https://download.samba.org/pub/rsync/rsync.html |
版本查看
1 | [yun@backup ~]$ rsync --version |
Rsync 增量复制的原理
Rsync 通过 “quick check” 算法 (默认情况) 找到要传输的文件,该算法会查找大小已改变或最后修改时间已改变的文件。
当 “quick check” 指示不需要更新文件的数据 (即:文件的内容) 时,会直接在目标文件上更改其他属性(如权限信息、属主属组信息、时间戳信息)「根据相应的选项参数」。
rsync2.x对比方法,把所有文件比对一遍,然后进行同步。
rsync3.x对比方法,一边比对差异,一边对差异的部分进行同步。
Rsync 软件功能介绍
rsync == cp
1 | # 拷贝 /etc/rpm 目录 |
注意:cp -a 的参数意义和 rsync -a 的参数意义不一样。
rsync == scp
1 | [yun@back tmp]$ scp -pr yun@172.16.1.182:/etc/xml /tmp/ |
rsync == rm
删除 /tmp/yum/ 目录下的所有文件和目录。【千万不要搞错目录】
1 | [yun@back tmp]$ rm -fr /tmp/yum/* |
其中 /tmp/zhang/ 目录下无任何文件
rsync == ls -l
1 | [yun@backup tmp]$ ls -l /tmp/xml/catalog |
Rsync 特性介绍
1、支持拷贝特殊文件。如链接文件、设备等。
2、可以排除指定文件或目录的同步功能,相当于打包tar的排除功能。
3、可以做到保持源文件或目录的权限、时间、软链接、属主、属组等所有属性均不改变。
4、可实现增量同步。既只同步发生变化的数据,因此传输效率很高,tar -N。
5、可以使用 rcp、rsh、ssh 等方式来配合传输文件(rsync本身不对数据加密)。
6、可以通过socket(进程方式)传输文件和数据(服务端和客户端)【重点掌握】。
7、支持匿名或认证(无需系统用户)的进程传输,可以实现方便安全的进行数据备份及镜像。
Rsync 运用场景
又比如敏感数据不能丢失,那必须做实时备份。
Rsync 使用说明
Rsync 传输方式分三种
1、单个主机本地内部之间的数据传输(此时类似于 cp 的功能)
2、借助rcp,ssh等通道来传输数据(此时类似于 scp 的功能)
3、以守护进程方式传输数据(rsync 自身的重要功能)
1 | # 本地数据同步方式 |
源目录后面无 “/“ 和有 “/“ 的区别
将 /etc/yum 目录复制到 /tmp/zhang/ 目录下。
1 | # 源目录后面无 "/" |
将 /etc/yum/ 目录下的所有文件和目录,复制到 /tmp/zhang/ 目录下。
1 | # 源目录后面有 "/" |
常用参数说明
参数 | 参数说明 |
---|---|
-v, --verbose | 显示传输了哪些文件 ★★★★★ |
-z, --compress | 传输时进行压缩以提高传输效率,--compress-level=NUM 指定加压缩级别。★★★★★ |
-P, --progress | 显示同步的过程及传输时进度等信息 ★★★★★ |
-a, --archive | 归档模式,表示以递归方式传输文件,并保持文件属性。等价于 -rlptgoD ★★★★★ |
-r, --recursive | 对子目录以递归模式,即目录下的所有目录都同样传输【归档于-a】 |
-t, --times | 保持文件时间信息【归档于-a】 |
-o, --owner | 保持文件属主信息【归档于-a】 |
-g, --group | 保持文件属组信息【归档于-a】 |
-p, --perms | 保持文件权限信息【归档于-a】 |
-D, --devieves | 保持设备文件信息【归档于-a】 |
-l, --linkd | 保持软链接信息【归档于-a】 |
-L, --copy-links | 如果是链接文件那么转为源文件复制【复制软连接的源文件】 |
-e, --rsh=COMMAND | 使用信道协议,指定替代rsh的shell程序 |
--exclude=PATTERN | 指出哪些文件或目录不需要传输,支持通配符 |
--exclude-from=FILE | 在 FILE 文件中指定哪些文件或目录不需要传输 |
--include=PATTERN | 指出哪些文件或目录不被排除要传输,支持通配符;通常配合 --exclude 或 --exclude-from 使用 |
--include-from=FILE | 在 FILE 文件中指定哪些文件或目录不被排除需要传输;通常配合 --exclude 或 --exclude-from 使用 |
--bwlimit=RATE | 限速 限制 I/O 带宽;K字节每秒 |
--delete | 让目标DEST目录与SRC目录数据一致 【慎用】 |
1 | # --exclude=PATTERN 示例 |
1 | # --exclude-from=FILE 示例 |
1 | # --include=PATTERN 示例 |
Rsync 本地模式实践
1 | Local: rsync [OPTION...] SRC... [DEST] |
示例如下:
1 | rsync -avz /etc/yum /tmp/zhang01 |
Rsync 使用远程 SSH 通道实践
1 | Access via remote shell: |
拉取数据:将远程机器的数据复制到本地
1 | [yun@backup ~]$ rsync -avzP -e 'ssh -p 22' yun@172.16.1.182:/etc/yum /tmp/zhang01 |
推送数据:将本地的数据复制到远程机器
1 | [yun@backup ~]$ rsync -avzP -e 'ssh -p 22' /etc/yum yun@172.16.1.182:/tmp/zhang |
Rsync daemon 服务模式实践
1 | Access via rsync daemon: |
2、以 ansi-haproxy02 作为客户端,进行数据推拉。
rsync 服务端配置
系统环境信息
1 | [yun@backup ~]$ cat /etc/redhat-release |
服务配置文件
注意:配置后面不要添加任何信息和空格,不然可能被解析,导致后续一系列问题。
1 | [root@backup ~]# cat /etc/rsyncd.conf |
配置文件详解
更多参数与详解,参见 man rsyncd.conf
1 | # 备注:更多参数与更多详解,参见 man rsyncd.conf |
当 rsync 服务端的 uid、gid 用的是 rsync 用户和用户组【或其他非超级用户、用户组】时,客户端同步时只能同步数据信息、权限信息、时间戳信息,但不能同步属主、属组信息。此时客户端若要同步的数据属主、属组,那么客户端数据的属主、属组必须也是 rsync【即客户端与服务端的 uid、gid 相同】;或者不要同步属主、属组信息。
如果需要把多个文件且属主、属组不同的属性信息也同步到 rsync 服务端,那么在 rsync 服务端的 uid、gid 配置都应该是 root。
use chroot = true
需要 root 权限,且 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下,然后再开始与客户端进行文件传输。
优点:可以提供额外的保护,防止可能的出现的安全漏洞
缺点:如果同步的数据有软连接,那么软连接「可能」同步不了
use chroot = false
出于安全原因,默认情况下使用 munge 符号链接,即所有的软连接前面多会加 /rsyncd-munged/,如下:
其他必要设置与配置
1、创建对应的目录
1 | [root@backup ~]# mkdir -p /backup/{busi_data,database} |
2、rsync虚拟用户配置
1 | [root@backup ~]# ll /etc/rsync.password # 注意文件的权限信息 600 |
启动/停止 Rsync 守护进程服务
1 | [root@backup ~]# systemctl start rsyncd.service |
停止 rsync 服务
1 | [root@backup ~]# systemctl stop rsyncd.service |
加入开机自启动
1 | [root@backup ~]# systemctl enable rsyncd.service # 加入开机自启动 |
Rsync 客户端配置
系统环境信息
1 | [root@ansi-haproxy02 ~]# cat /etc/redhat-release |
密码文件
注意密码文件只能填写对应密码信息,不要有其他多余的字符,rsync 在读取时仅读取该文件的第一行信息。
1 | [root@ansi-haproxy02 ~]# ll /etc/rsync.password* # 注意权限信息 600 或 400 |
注意:客户端一个 password 文件不能存放多个密码,rsync 在读取文件的时候只会读取第一个密码。
客户端准备数据
1 | [root@ansi-haproxy02 zhang]# pwd |
推拉数据
客户端向服务端推送数据
使用 rsync_backup 账号测试
情况1、需要校验用户密码
1 | [root@ansi-haproxy02 zhang]# rsync -avz /tmp/zhang rsync_backup@172.16.1.181::back_data_module |
情况2、不要密码【密码文件】
1 | # 方式一 |
其中:back_data_module 为 rsync 配置中的模块名
客户端向服务端拉取数据
使用 rsync_db_back 账号测试
情况1:需要校验用户密码
1 | [root@ansi-haproxy02 test]# rsync -avz rsync_db_back@172.16.1.181::back_data_module/zhang /tmp/test/ |
情况2、不要密码【密码文件】
1 | # 方式一 |
其中:back_data_module 为 rsync 配置中的模块名
注意点:
客户端路径末尾是否有 /
“/” 有:则表示推送该目录下的所有文件
“/” 无:则表示推送该目录,与该目录下所有文件
目标一端可以加一个不存在的目录
类似 cp 命令一样,我们可以在目标一端指定一个目录
推送时,目标一端有该目录则直接使用;没有则创建
Rsync 常见问题
故障点1:客户端密码文件属主不对
客户端以哪个用户执行命令,那么 password-file 文件的属主就是哪个用户。
当然为了安全起见,客户端的 password-file 文件属主最好是 root ,这时我们执行命令也用 root 用户。
1 | [root@ansi-haproxy02 ~]# rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module |
故障点2:客户端密码文件权限不对
客户端的 password-file 文件权限是 600 或 400。
1 | [root@ansi-haproxy02 ~]# rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module |
故障点3:客户端用户执行权限不足
客户端用户执行权限不足,不能读取 password-file 文件信息。
当前使用 yun 用户,实际需要 root 用户。
1 | [yun@ansi-haproxy02 ~]$ rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module |
故障点4:服务端没有对应的模块目录
服务端 back_db_module 模块的 path 路径不存在。
1 | [root@ansi-haproxy02 ~]# rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module |
故障点5:客户端密码不正确
客户端 password-file 文件的密码信息与服务端的密码不匹配,不能通过验证。
1 | [root@ansi-haproxy02 ~]# rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module |
故障点6:服务端目录不存在
服务端只能创建一级不存在的目录,不能创建二级及以上不存在的目录。
1 | [root@ansi-haproxy02 ~]# rsync -avz --password-file=/etc/rsync.password2 /etc/yum rsync_db_back@172.16.1.181::back_db_module/aaa/bbb |