
大家好,又见面了,我是你们的朋友全栈君。
一款快速增量备份工具Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync 主机同步 它名称里面的r指的是 remote,rsync 其实就是”远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,如果没有相当于新建则是全量备份,如果目标方已有一些文件,则用增量备份方式仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
-a、–archive参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。 –append参数指定文件接着上次中断的地方,继续传输。 –append-verify参数跟–append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。 -b、–backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由–suffix参数指定的文件后缀名,默认是~。 –backup-dir参数指定文件备份时存放的目录,比如–backup-dir=/path/to/backups。 –bwlimit参数指定带宽限制,默认单位是 KB/s,比如–bwlimit=100。 -c、–checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。 –delete参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。 -e参数指定使用 SSH 协议传输数据。 –exclude参数指定排除不进行同步的文件,比如–exclude=”*.iso”。 –exclude-from参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。 –existing、–ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。 -h参数表示以人类可读的格式输出。 -h、–help参数返回帮助信息。 -i参数表示输出源目录与目标目录之间文件差异的详细情况。 –ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。 –include参数指定同步时要包括的文件,一般与–exclude结合使用。 –link-dest参数指定增量备份的基准目录。 -m参数指定不同步空目录。 –max-size参数设置传输的最大文件的大小限制,比如不超过200KB(–max-size=‘200k’)。 –min-size参数设置传输的最小文件的大小限制,比如不小于10KB(–min-size=10k)。 -n参数或–dry-run参数模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去。 -P参数是–progress和–partial这两个参数的结合。 –partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与–append或–append-verify配合使用。 –partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如–partial-dir=.rsync-partial。一般需要与–append或–append-verify配合使用。 –progress参数表示显示进展。 -r参数表示递归,即包含子目录。 –remove-source-files参数表示传输成功后,删除发送方的文件。 –size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。 –suffix参数指定文件名备份时,对文件名添加的后缀,默认是~。 -u、–update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。 -v参数表示输出细节。 -vv表示输出更详细的信息, -vvv表示输出最详细的信息。 –version参数返回 rsync 的版本。 -z参数指定同步时压缩数据。
格式一: 用户名@主机地址::共享模块名
rsync -avz 用户名@源地址::共享模块名称 /目标位置格式二: rsync://用户名@主机地址/共享模块名
rsync -avz rsync://用户名@源地址/共享模块 /目标位置服务器192.168.133.50 客户机192.168.133.75 systemctl stop firewalld setenforce 0
[root@master ~]# rpm -q rsync 系统是自带的
rsync-3.0.9-18.el7.x86_64
[root@master ~]# vim /etc/rsyncd.conf 编辑此文件后面添加以下内容
22 uid = root
23 gid = root
24 use chroot = yes 禁锢在源目录
25 pid file = /var/run/rsyncd.pid 进程文件目录
26 log file = /var/log/rsyncd.log 日志文件目录
27 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 因为本身具有压缩共呢个所以取消其他压缩功能,
28 adress = 192.168.133.50 设定监听地址
29 port = 873 监听端口号 tcp/udp 873
30 hosts allow = 192.168.133.0/24 允许访问的客户机地址
31
32 [ceshi] 共享模块名称
33 path = /data/back 原目录实际路径
34 comment = web service 备注
35 read only = yes 是否只读
36 auth users = user1 授权账户,多个账号以空格分隔
37 secrets file = /root/rsyncd_users.db 存放账户信息的数据文件 第一部分:定义共享模块全局模块配置 第二部分:共享模块(可以为多个)可以对应不同的”源目录”和授权账号信息 第三部分:此配置文件是为rsync –daemon模式设置的
如果采用匿名的方式,只要将其中的“auth users” 和“secrets file” 配置项去掉即可
[root@master ~]# vim /root/rsyncd_users.db 为备份账户创建数据文件
user1:123123 建立同步用户设定权限一定要600 权限拥有者可读写,其他人不可读写执行
[root@master ~]# chmod 600 /root/rsyncd_users.db[root@master ~]# mkdir -p /data/back 建立设定的文件夹
[root@master ~]# chmod +r /data/back 给文件夹加可读权限[root@master ~]# rsync --daemon 开启rsync
[root@master ~]# netstat -natp |grep rsync 查看状态
主服务器上
[root@master ~]# cd /data/back/ 进入文件夹
[root@master back]# ls 目前是空的
[root@master back]# touch file{1..9}.txt 新建文件
[root@master back]# ls 查看文件
file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt客户机上
[root@client back]# ls 文件夹目前是空的
[root@client back]# rsync -avz user1@192.168.133.50::ceshi /data/back 取文件
Password: 这时就可以从主服务器上下拉文件了

在客户机目标文件夹下
[root@client back]# echo "123123" >server.pass
[root@client back]# chmod 600 server.pass在主服务器上新建文件
[root@master back]# touch file{a..h}.txt然后去客户机上
[root@client back]# rsync -avz --password-file=/data/back/server.pass rsync://user1@192.168.133.50/ceshi /data/back 第二种命令
可以设定crontab
使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。 将inotify机制与rsync相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。这样,就避免了按固定周期备份时存在的延迟性、周期过密等问题。 因为inotify通知机制由 Linux内核提供,因此主要做本机监控,在触发式备份中,应用时更适合上行同步。

[root@master ~]# vim /etc/rsyncd.conf
read only = no 根据之前的只把只读关闭[root@master ~]# ss -ntap |grep rsync 查看进程号
LISTEN 0 5 *:873 *:* users:(("rsync",pid=39065,fd=3))
LISTEN 0 5 :::873 :::* users:(("rsync",pid=39065,fd=5))
[root@master ~]# kill -3 39065 关闭进程
[root@master ~]# ss -ntap |grep rsync 查看已经关闭
[root@master ~]# rsync --daemon 重启服务
[root@master ~]# ss -ntap |grep rsync 查看状态
LISTEN 0 5 *:873 *:* users:(("rsync",pid=39578,fd=3))
LISTEN 0 5 :::873 :::* users:(("rsync",pid=39578,fd=5))主客机上都要配置
[root@master ~]# vim /etc/sysctl.conf 最后添加
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@master ~]# sysctl -p
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576/etc/ sysctl.conf(内核参数配置文件) inotifywait:#用于持续监控,实时输出结果(增删改属性修改) 格式: inotifywait[参数] 常见参数 -m 持续进行监控 -r 递归监控所有子对象 -q 简化输出信息 -e 指定要监控哪些事件类型 inotifywatch:#用于短期监控,任务完成后再出汇总结果 max_queue_event #监控事件队列大小 max_user_instances #最多监控实例数 max_user_watches #每个实例最多监控文件数
#客户端: inotify内核参数
cat /proc / sys/fs/inotify/max_queued_events
cat /proc / sys/fs/inotify/max_user_instances
cat /proc / sys/ fs/inotify/max_user_watchesvim /etc/ sysctl.conffs.inotify.max_queued_events = 32768 # 监控时间队列,默认为16384
fs.inotify.max_user_instances = 1024 # 最多监控实例数,默认为128
fs.inotify.max_user_watches = 1048576 #每个实例最多监控文件数,默认为8192#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
sysctl -p把安装包导入系统/opt
[root@client opt]# ls
inotify-tools-3.14.tar.gz rh
[root@client opt]# tar zxf inotify-tools-3.14.tar.gz
[root@client opt]# cd inotify-tools-3.14/
[root@client inotify-tools-3.14]# ./configure
[root@client inotify-tools-3.14]# make && make install[root@client ~]# vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /data/"
RSYNC_CMD="rsync -azH --delete --password-file=/data/back/server.pass /data/back user1@192.168.133.50::ceshi"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
# echo "${FILE} was rsynced" >>/opt/inotify_rsync.log
fi
done
[root@client ~]# chmod +x /opt/inotify.sh然后所有服务器都给目标和源目录加上权限
[root@client inotify-tools-3.14]# chmod 777 /data/back[root@client back]# cd /opt 进入客户机启动脚本
[root@client opt]# ./inotify.sh &这时你在客户机上的源目标文件夹任何操作都会被在主服务器上的目的文件夹里操作
[root@client back]# touch a{1..10}.txt 客户机创建文件
[root@master back]# ls 主服务器上查看已同步
a10.txt a1.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt server.pass加入开机自启
chmod +x letc/rc.d/rc.local
echo " /opt/inotify.sh" >>/etc/rc.d/rc.local1、rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。 2、rsync所做的系统调用很少:没有针对单个文件做lstat和unlink操作。命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink。 另外,在其他人的评测里,rm的上下文切换比较多,会造成System CPU占用较多——对于文件系统的操作,简单增加并发数并不总能提升操作速度。
tips: 当SRC和DEST文件性质不一致时将会报错 当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件 当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录 最重要的是,它的处理速度相当快,处理几个G的文件也就是秒级的事 最核心的内容是:rsync实际上用的就是替换原理
在机器上一个目录里创建多个文件
[root@localhost data]# touch {1..1000}.txt
[root@localhost opt]# mkdir empty 然后创建一个空文件
[root@localhost opt]# rsync --delete-before -aHv --progress -stats empty/ data/ 删除
或者
[root@localhost opt]# rsync --delete-before -d empty/ data空文档后的“/”一定要打否则命令不起效果 -delete-before 传输前进行删除操作 -progress 传输时显示传输过程 -a 归档,表示以递归方式传输文件 -H 保持硬链接的文件 -v 详细模式 -stats 给出某些文件的传输状态 -d 不递归地传输目录

注意: 当SRC和DEST文件性质不一致时将会报错 当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件 当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182516.html原文链接:https://javaforall.cn