前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rsync远程同步文件_ssh远程登录

rsync远程同步文件_ssh远程登录

作者头像
全栈程序员站长
发布2022-11-04 16:15:25
1.9K0
发布2022-11-04 16:15:25
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、简介

一款快速增量备份工具Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync 主机同步 它名称里面的r指的是 remote,rsync 其实就是”远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,如果没有相当于新建则是全量备份,如果目标方已有一些文件,则用增量备份方式仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

二、配置参数

1、参数

-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参数指定同步时压缩数据。

2、配置源的两种表示方法

格式一: 用户名@主机地址::共享模块名

代码语言:javascript
复制
rsync -avz 用户名@源地址::共享模块名称 /目标位置

格式二: rsync://用户名@主机地址/共享模块名

代码语言:javascript
复制
rsync -avz rsync://用户名@源地址/共享模块 /目标位置

三、远程同步

服务器192.168.133.50 客户机192.168.133.75 systemctl stop firewalld setenforce 0

代码语言:javascript
复制
[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” 配置项去掉即可

代码语言:javascript
复制
[root@master ~]# vim /root/rsyncd_users.db 为备份账户创建数据文件
user1:123123                                                  建立同步用户

设定权限一定要600 权限拥有者可读写,其他人不可读写执行

代码语言:javascript
复制
[root@master ~]# chmod 600 /root/rsyncd_users.db
代码语言:javascript
复制
[root@master ~]# mkdir -p /data/back 建立设定的文件夹
[root@master ~]# chmod +r /data/back 给文件夹加可读权限
代码语言:javascript
复制
[root@master ~]# rsync --daemon 开启rsync
[root@master ~]# netstat -natp |grep rsync 查看状态
在这里插入图片描述
在这里插入图片描述

测试

主服务器上

代码语言:javascript
复制
[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

客户机上

代码语言:javascript
复制
[root@client back]# ls 文件夹目前是空的
[root@client back]# rsync -avz user1@192.168.133.50::ceshi /data/back 取文件
Password: 

这时就可以从主服务器上下拉文件了

在这里插入图片描述
在这里插入图片描述

免交互配置:

在客户机目标文件夹下

代码语言:javascript
复制
[root@client back]# echo "123123" >server.pass
[root@client back]# chmod 600 server.pass

在主服务器上新建文件

代码语言:javascript
复制
[root@master back]# touch file{a..h}.txt

然后去客户机上

代码语言:javascript
复制
[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内核提供,因此主要做本机监控,在触发式备份中,应用时更适合上行同步。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
[root@master ~]# vim /etc/rsyncd.conf
read only = no                                                    根据之前的只把只读关闭
代码语言:javascript
复制
[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))

主客机上都要配置

代码语言:javascript
复制
[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

1、在客户机上安装inotify

1.1调整inotify内核参数(优化)

/etc/ sysctl.conf(内核参数配置文件) inotifywait:#用于持续监控,实时输出结果(增删改属性修改) 格式: inotifywait[参数] 常见参数 -m 持续进行监控 -r 递归监控所有子对象 -q 简化输出信息 -e 指定要监控哪些事件类型 inotifywatch:#用于短期监控,任务完成后再出汇总结果 max_queue_event #监控事件队列大小 max_user_instances #最多监控实例数 max_user_watches #每个实例最多监控文件数

#客户端: inotify内核参数

代码语言:javascript
复制
cat /proc / sys/fs/inotify/max_queued_events
cat /proc / sys/fs/inotify/max_user_instances
cat /proc / sys/ fs/inotify/max_user_watches
代码语言:javascript
复制
vim /etc/ sysctl.conf
代码语言:javascript
复制
fs.inotify.max_queued_events = 32768                                 # 监控时间队列,默认为16384
fs.inotify.max_user_instances = 1024                                   # 最多监控实例数,默认为128
fs.inotify.max_user_watches = 1048576                             #每个实例最多监控文件数,默认为8192

#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值

代码语言:javascript
复制
sysctl -p

把安装包导入系统/opt

代码语言:javascript
复制
[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

2、编写监控脚本

代码语言:javascript
复制
[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
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
[root@client ~]# chmod +x /opt/inotify.sh

然后所有服务器都给目标和源目录加上权限

代码语言:javascript
复制
[root@client inotify-tools-3.14]# chmod 777 /data/back
代码语言:javascript
复制
[root@client back]# cd /opt 进入客户机启动脚本
[root@client opt]# ./inotify.sh &

这时你在客户机上的源目标文件夹任何操作都会被在主服务器上的目的文件夹里操作

代码语言:javascript
复制
[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

加入开机自启

代码语言:javascript
复制
chmod +x letc/rc.d/rc.local
echo " /opt/inotify.sh" >>/etc/rc.d/rc.local

五、rsync批量快速删除大量文件

1、rm和rsync的比较

1、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实际上用的就是替换原理

2、实际操作

在机器上一个目录里创建多个文件

代码语言:javascript
复制
[root@localhost data]# touch {1..1000}.txt
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
[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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、配置参数
    • 1、参数
      • 2、配置源的两种表示方法
      • 三、远程同步
        • 测试
          • 免交互配置:
          • 四、实时同步
            • 1、在客户机上安装inotify
              • 1.1调整inotify内核参数(优化)
            • 2、编写监控脚本
            • 五、rsync批量快速删除大量文件
              • 1、rm和rsync的比较
                • 2、实际操作
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档