二、RSYNC
1.简介
Rsync(Remote Synchronization)是一款开源的,快速的,多功能的,可实现全量和增量的本地或远程数据同步备份的优秀工具.
2.功能
scp
cp
rm
增量备份
rsync通过’quick check’算法,它仅同步大小或者最后修改时间发生变化的文件或目录.
也可以根据权限,属主等属性变化来同步,但需要指定参数
全量备份
3.优点
- 同步时能够完整的保留数据目录结构、权限、时间、软硬链接等
- 能够实现增量同步, 每一次同步只会同步发生过改变的数据
- 文件传输效率高
- 支持匿名传输
- 无须特殊权限即可安装
- 支持流控制, 可以精确同步速度和使用的带宽大小
4.用法
- 语法
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
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
- OPTION
-v, --verbose 输出详细的数据同步过程
--version 查看版本信息
-q, --quiet 静默模式
-c, --checksum 对传输的数据进行校验和检查, 默认情况下 rsync 进行快速检查, 使用基于校验和的检查意味着会大量的消耗磁盘 IO 降低传输速度
-a, --archive 归档模式, 等于 -rlptgoD
-d --dirs 以不递归的方式拷贝目录本身。递归时, 如果源为 "dir1/file1", 则不会拷贝 dir1 目录, 使用该选项将拷贝 dir1 但不拷贝 file1
-P, --partial 保留那些因故没有完全传输的文件, 以加快随后的再次传输
-r, --recursive 递归复制目录
-R --relative 使用相对路径, 这意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端
-b, --backup 创建备份, rsync 将在每个文件被传输或删除时重命名(filename~) 先前存在的目标文件
--backup-dir=DIR 使用 -b 创建备份时, 可以使用 --backup-dir 将文件备份到指定的目录中
--suffix=SUFFIX 使用 -b 创建备份时, 可以使用 --suffix 指定备份文件的后缀(默认为 filename~)
-u, --update 仅在源 mtime 比目标已存在文件的mtime新时才拷贝, 注意: 该选项是接收端判断的, 不会影响删除行为
-l, --links 遇到符号链接时, 在目标上重新创建符号链接
-L, --copy-links 遇到符号链接时, 拷贝符号链接指向的原文件
--safe-links 忽略指向复制树之外的所有符号链接
-k, --copy-dirlinks 如果符号链接为一个目录, 则进行 --copy-links 操作, 如果您不希望非目录的符号链接受到影响, 这是非常有用的
-H, --hard-links 保持硬链接
-p, --perms 保持文件权限
-A, --acls 保持文件的 acl, 原系统和目标系统的 ACL 兼容才能工作
-o, --owner 保持文件的属主, 仅当接收到的 rsync 作为超级用户运行时才能工作, 默认权限为接受端用户的权限
-g, --group 保持文件的属组, 仅当接收到的 rsync 作为超级用户运行时才能工作
-D, --devices 保持设备文件信息, 仅当接收到的 rsync 作为超级用户运行时才能工作
-t, --times 保持文件修改时间
-O, --omit-dir-times 保持文件修改时间时忽略目录, 如果在接收端使用 NFS 共享目录, 则最好使用 -O 选项
-J, --omit-link-times 保持文件修改时间时忽略符号链接
--super 告诉接受方尝试以超级用户运行 rsync, 如果是超级用户可以使用 --no-super 关闭以超级用户身份运行
--fake-super 通过尝试添加特殊权限来模拟超级用户运行
-S, --sparse 对稀疏文件进行特殊处理以节省 DST 的空间
-n, --dry-run 测试运行, 查看将有哪些数据被传输
-W, --whole-file 禁用增量检测, rsync 将使用全量传输, 在网络带宽高于磁盘带宽时, 该选项比增量传输更高效
-x, --one-file-system 禁止跨越文件系统(当遇到符号链接时, 如果符号链接为一个目录, 则 rsync 将其当成一个挂载点忽略; 如果符号链接为文件则不受此选项影响)
--existing 仅更新目标端已存在的文件, 跳过 DST 上不存在的文件或目录, 该选项和 --ignore-existing 一起使用时将不会更新任何的文件(在使用 --delete 时肯会有用, 这将删除 DST 上多余的文件)
--ignore-non-existing 和 --existing 相同
--ignore-existing 仅更新目标端不存在的文件, 跳过 DST 上已存在的文件或目录
delete 操作:
--delete 删除 DST 上 SRC 不存在的数据
# 下面 4 个选项都隐含了 delete 操作
--delete-before 在传输文件之前先执行 delete 操作(这在 DST 磁盘空间比较紧缺时是比较有效的), 如果指定了传输超时时间该选项可能会造成传输超时
该选项强制 rsync 使用旧的非增量的递归算法, 该算法要求 rsync 扫描传输中的所有文件
--delete-during, --del --delete 在大多数情况下采用的算法 ,请求在传输发生时增量地删除接收端上的文件, 每个目录的删除扫描是在每个目录检查更新之前完成的, 相对于 --delete-before 更高效
--delete-after 请求在传输完成后删除接收端上的文件, 该选项强制 rsync 使用旧的非增量的递归算法, 该算法要求 rsync 扫描传输中的所有文件
--delete-delay 请求在传输过程中计算接收端上的文件删除, 然后在传输完成后删除 这在与 --delay-updates and/or --fuzzy 使用时非常用于, 比 --delete-after 更有效
--ignore-errors 及时出现 IO 错误也进行 delete 操作
--remove-source-files 删除源端文件, 当 rsync 将源端的文件拷贝到 DST 时, rsync 将会删除源端的文件, 没有拷贝或者拷贝失败的文件不会被删除
--size-only rsync 仅检查文件大小, 默认情况下 rsync 会检查文件大小和 mtime
--force 当要使用非目录替换一个非空目录时, 删除非空目录(删除目录, 即使目录不为空)
--max-delete=NUM 指定删除文件或目录的最大数量
--max-size=SIZE 指定传输文件的最大大小, 单位K, M, G
--min-size=SIZE 指定传输文件的最小大小, 单位K, M, G
-f, --filter=RULE 使用指定规则筛选不需要传输的数据, 示例: rsync -r --filter='exclude *.log' /var/log/ /mnt/
RULE:
1、exclude 规则: 即排除规则, 只作用于发送端, 被排除的文件不会进入文件列表
2、include 规则: 即包含规则, 只作用于发送端, 被包含的文件将明确记录到文件列表中
3、hide 规则: 即隐藏规则, 只作用于发送端, 隐藏后的文件对于接收端来说是看不见的, 也就是说接收端会认为它不存在于源端
4、show 规则: 即显示规则, 只作用于发送端, 是隐藏规则的反向规则
5、protect 规则: 即保护规则, 该规则只作用于接收端, 被保护的文件不会被删除掉
6、risk 规则: 即取消保护规则, 是protect的反向规则
7、clear 规则: 删除i nclude/exclude 规则列表
--exclude=PATTERN --filter 的简写模式, 指定排除不需要传输的文件模式
--include=PATTERN --filter 的简写模式, 指定不排除而需要传输的文件模式
-z, --compress 传输数据时启用压缩, 这个操作会用到大量的cpu资源, 但是可以节约带宽
--compress-level=NUM 压缩级别
--skip-compress=LIST 不压缩的文件列表(已经压缩过的文件通常不需要再压缩), 示例: --skip-compress=gz/jpg/7z/bz2 (不压缩 gz, jpg, 7z, bz2) 等类型的文件
--bwlimit=RATE 指定传输速率, 单位秒(s), 示例: --bwlimit=10m
--timeout=TIMEOUT 设置 I/O 超时时间, 如果在这段时间之内没有传输数据则 rsync 退出, 单位秒(s), 默认值为 0, 表示永不超时
--contimeout 设置与 rsync daemon 连接超时的时间
--log-file 指定日志文件
--log-file-format 设置日志格式
--stats 输出传输过程中的详细信息
--iconv=CONVERT_SPEC 指定传输编码, 默认 utf8
--no-OPTION 在选项见面加一个 --no 表示关闭这个选项(rsync 有一些默认选项, 可以使用这个参数来关闭它), 注意: 不是所有选项都可以关闭
# 作为 daemon 运行的参数
--daemon 将 rsync 作为守护进程运行
--address rsync daemon 监听的地址
--port rsync daemon 监听的端口
--sockopts 监听的 unix 套接字地址
--password-file=FILE 从指定文件获取 rsync daemon 的用户名和密码
-4, --ipv4 监听 ipv4 地址
-6, --ipv6 监听 ipv6 地址
--config 指定配置文件
--bwlimit=RATE 设置传输速率
5.企业应用场景
5.1 在本地文件之间或远程服务器
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
pull
两台机子都要有rsync包
A:192.168.217.154
B:192.168.217.155
实验
rsync -av root@192.168.217.155:/etc/ /tmp
在B机子上在/etc目录上添加123文件
再次同步
push
rsync -av /tmp/ root@192.168.217.155:/tmp
5.2 两台服务器之间的数据同步crond+rsync
1.配置rsyncd服务器
- 创建配置文件(/etc/rsyncd.conf)
uid = rsync #客户端连接到服务端后服务端进程执行者
gid = rsync #执行组
use chroot = no #是否chroot
max connections = 100
timeout 300
strict modes = yes
pid file = /var/run/rsyncd.pid #pid文件
lock file = /var/run/rsyncd.lock #锁文件,保持文件一致性
log file = /var/log/rsyncd.log #日志文件
#模块定义
[backup] #模块名称
path = /backup #备份目录
comment = backup file #模块说明
ignore errors #忽略错误
read only = no #可写
hosts allow = * #允许
hosts deny = 172.16.1.1 #拒绝
list = false #能否被列表
auth users = rsync_backup #允许那些用户同步
secrets file = /etc/rsync.passwd #用户帐号密码文件(权限必须是600)
2.创建密码文件并修改权限为600
格式:
用户名:密码
密码不能超过8位
[root@localhost ~]# vim /etc/rsync.passwd
rsync:123
usync:123
[root@localhost ~]# chmod 600 /etc/rsync.passwd
3.创建共享目录并授权
[root@localhost ~]# mkdir /backup
[root@localhost ~]# ll ..
total 62
drwxr-xr-x. 2 root root 4096 May 14 08:15 backup
[root@localhost ~]# useradd -r rsync
[root@localhost ~]# chown -R rsync.rsync /backup
[root@localhost ~]# ll ..
total 62
drwxr-xr-x. 2 rsync rsync 4096 May 14 08:15 backup
4.加入开机自动启动脚本
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
5.作为守护进程
[root@localhost ~]# rsync --daemon
[root@localhost ~]# ps aux | grep rsync
root 1087 0.0 0.0 114696 384 ? Ss 08:28 0:00 rsync --daemon
root 1090 0.0 0.0 112660 968 pts/0 S+ 08:29 0:00 grep --color=auto rsync
6.rsync客户端
配置密码文件
[root@localhost ~]# vim /etc/rsync.passwd
123
7.推送文件
方法1:
rsync -avz /etc/hosts rsync@192.168.217.154::backup --password-file=/etc/rsync.passwd
方法2:
rsync -avz /etc/hosts rsync://rsync@192.168.217.154/backup --password-file=/etc/rsync.passwd
查看backup目录
[root@localhost ~]# ls /backup/
hosts
8.将rsync写入shell脚本中,将脚本放到cron中定时运行
永久生效
date #查看时间
vi /etc/crontab #进入该文件
分 时 日 月 周 bash /root/copy.sh #写入
临时生效
crontab -e
分 时 日 月 周 bash /root/copy.sh
[root@localhost ~]# crontab -l
0 * * * * bash /root/copy.sh
[root@localhost ~]# cat copy.sh
rsync -avz /etc/hosts rsync@192.168.217.154::backup --password-file=/etc/rsync.passwd
5.3 实时同步
inotify+rsync
inotify
Inotify,它是在内核 2.6.13 版本中引入的一个新功能,它为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
1.安装inotify
# Centos7 epel源地址
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@localhost ~]# yum install -y inotify-tools
2.用法
- 常见用法: inotifywait -mrq --format ‘%Xe %w%f’ -e modify,create,delete,attrib /data/
- -m monitor,持续监控目标文件/目录
- -r recursive,递归
- -q quiet,静默模式
- –format
- %Xe event事件
- %w 目录
- %f 文件
- -e 监控事件
- 参数说明
- 监听事件
参数说明
监听事件
3.实例
实现实时同步脚本
简化版
bakup_simple.sh
#!/bin/bash
/usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file
#把发生更改的文件列表都接收到file 然后循环,但有什么鬼用呢?下面的命令都没有引用这个$file 下面做的是全量rsync
do
cd /backup && rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password
done
优化版
backup_optimization.sh
#!/bin/bash
src=/data/ # 需要同步的源路径
des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件
ip1=192.168.0.18 # 目标服务器1
ip2=192.168.0.19 # 目标服务器2
user=root # rsync --daemon定义的验证用户名
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE变量代表路径哦 -c校验文件内容
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
fi
fi
done