rsync 远程同步

目录

[1. rsync 远程同步](#1. rsync 远程同步)

[1.1 rsync 远程同步概述](#1.1 rsync 远程同步概述)

[​1.2. 配置rsync源服务器](#1.2. 配置rsync源服务器)

[1.3 发起端 客户端设置](#1.3 发起端 客户端设置)

[1.4 发起端配置 rsync+inotify](#1.4 发起端配置 rsync+inotify)

[2. 如何快速清空目录中的大量文件?](#2. 如何快速清空目录中的大量文件?)

​总结


1. rsync 远程同步

1.1 rsync 远程同步概述

rsync(Remote Sync,远程同步) 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文件的原始位置,发起端应对该位置具有读取权限。

1.2. 配置rsync源服务器

7-1 客户端 192.168.80.10

7-2 服务端 192.168.80.20

关闭防火墙

复制代码
systemctl stop firewalld
setenforce 0

建立/etc/rsyncd.conf 配置文件

复制代码
rpm -q rsync							#一般系统已默认安装rsync

#建立/etc/rsyncd.conf 配置文件
vim /etc/rsyncd.conf				#添加以下配置项
uid = root
gid = root
use chroot = yes										#禁锢在源目录
address = 192.168.80.10									#监听地址
port = 873												#监听端口 tcp/udp 873,可通过cat /etc/services | grep rsync查看
log file = /var/log/rsyncd.log							#日志文件位置
pid file = /var/run/rsyncd.pid							#存放进程 ID 的文件位置
hosts allow = 192.168.80.0/24
#允许访问的客户机地址
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z		#同步时不再压缩的文件类型	

[wwwroot]												#共享模块名称
path = /var/www/html									#源目录的实际路径
comment = Document Root of www.xy101.com
read only = yes											#是否为只读
auth users = kx                                          #授权账户,多个账号以空格分隔                                  
secrets file = /opt/rsync_userlist                     #存放账户信息的数据文件

#启动 rsync 服务程序
rsync --daemon				#启动 rsync 服务,以独立监听服务的方式(守护进程)运行 

netstat -anpt | grep rsync

#关闭 rsync 服务
kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid
复制代码
chmod 600 /etc/rsync_userlist

[root@localhost ~]# cd /opt
[root@localhost opt]# touch rsync_userlist
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 7月   1 19:52 rsync_userlist
[root@localhost opt]# chmod 600 rsync_userlist 
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-------. 1 root root 0 7月   1 19:52 rsync_userlist
复制代码
[root@localhost opt]# mkdir -pv /var/www/html
mkdir: 已创建目录 "/var/www"
mkdir: 已创建目录 "/var/www/html"
[root@localhost opt]# ll -d /var/www/html      
drwxr-xr-x. 2 root root 6 7月   1 19:57 /var/www/html
#保证所有用户对源目录/var/www/html 都有读取权限


[root@localhost opt]# cp -r /etc/hosts /etc/passwd /etc/shadow /etc/yum.repos.d/ /var/www/html
#复制到/var/www/html目录中

[root@localhost opt]# ll !$
ll /var/www/html
总用量 12
-rw-r--r--. 1 root root  158 7月   1 20:01 hosts
-rw-r--r--. 1 root root 2304 7月   1 20:00 passwd
----------. 1 root root 1263 7月   1 20:01 shadow
drwxr-xr-x. 3 root root   40 7月   1 20:01 yum.repos.d
[root@localhost opt]# ll /var/www/html/ -R
/var/www/html/:
总用量 12
-rw-r--r--. 1 root root  158 7月   1 20:01 hosts
-rw-r--r--. 1 root root 2304 7月   1 20:00 passwd
----------. 1 root root 1263 7月   1 20:01 shadow
drwxr-xr-x. 3 root root   40 7月   1 20:01 yum.repos.d

/var/www/html/yum.repos.d:
总用量 4
-rw-r--r--. 1 root root  70 7月   1 20:01 local.repo
drwxr-xr-x. 2 root root 220 7月   1 20:01 repo.bak

/var/www/html/yum.repos.d/repo.bak:
总用量 40
-rw-r--r--. 1 root root 1664 7月   1 20:01 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 7月   1 20:01 CentOS-CR.repo
-rw-r--r--. 1 root root  649 7月   1 20:01 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 7月   1 20:01 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 7月   1 20:01 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 7月   1 20:01 CentOS-Sources.repo
-rw-r--r--. 1 root root 8515 7月   1 20:01 CentOS-Vault.repo
-rw-r--r--. 1 root root  616 7月   1 20:01 CentOS-x86_64-kernel.repo

1.3 发起端 客户端设置

基本格式:rsync [选项] 原始位置 目标位置

复制代码
#将指定的资源下载到本地/opt 目录下进行备份。
格式一:
rsync -avz kx@192.168.80.20::xy101web /opt/data					#密码123456



#免交互格式配置:
echo "abc123" > /etc/server.pass
chmod 600 /etc/server.pass

crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/
。

systemctl restart crond
systemctl enable crond

复制代码
格式二:
rsync -avz rsync://kx@192.168.80.20/xy101web /opt/data
复制代码
--delete:删除目标位置有而原始位置没有的文件。

复制代码
[root@localhost ~]# vim rsync_passwd
[root@localhost ~]# chmod 600 rsync_passwd 
[root@localhost ~]# ll
总用量 12
-rw-------. 1 root root 2051 4月   2 22:45 anaconda-ks.cfg
-rw-r--r--. 1 root root 2079 4月   2 14:48 initial-setup-ks.cfg
-rw-------. 1 root root    8 7月   1 20:26 rsync_passwd


#为了在同步过程中不用输入密码,需要创建一个密码文件,保存 backuper 用户的密码,如 /etc/server.pass。在执行 rsync 同步时使用选项 "--password-file=/etc/server.pass" 指定即可
复制代码
crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/
复制代码
//rsync 有两种常用的认证方式,一种为 rsync-daemon 方式,另外一种则是 ssh。在一些场合,使用 rsync-daemon 方式会比较缺乏灵活性,ssh 方式则成为首选。
-e 'ssh -p 22':rsync 使用 ssh 指定端口,端口如果是 22 默认端口则不用指定该参数。

rsync -avz -e 'ssh -p 22' /var/www/html/index.html root@192.168.80.10:/opt/

客户端

不加/把整个目录复制过来

加上/,是复制这个目录下所有文件和子目录都复制过来

1.4 发起端配置 rsync+inotify


使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
将inotify机制与rsync工具相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。这样,就避免了按固定周期备份时存在的延迟性、周期过密等问题。
因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步。

(1)修改rsync源服务器配置文件

复制代码
vim /etc/rsyncd.conf
......
read only = no                                            #关闭只读,上行同步需要可以写

kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid
rsync --daemon    
netstat -anpt | grep rsync

chmod 777 /var/www/html/

(2)调整 inotify 内核参数
在Linux内核中,默认的inotify机制提供了三个调控参数:max_queue_events(监控事件队列,默认值为16384)、max_user_instances(最多监控实例数,默认值为128)、max_user_watches(每个实例最多监控文件数,默认值为8192)。当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。

复制代码
cat /proc/sys/fs/inotify/max_queued_events
cat /proc/sys/fs/inotify/max_user_instances
cat /proc/sys/fs/inotify/max_user_watches

vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

sysctl -p

(3)安装 inotify-tools

用 inotify 机制还需要安装 inotify-tools,以便提供 inotifywait、inotifywatch 辅助工具程序,用来监控、汇总改动情况。
inotifywait:可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果。
inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。

复制代码
tar zxvf inotify-tools-3.14.tar.gz -C /opt/

cd /opt/inotify-tools-3.14
./configure
make && make install
复制代码
#可以先执行"inotifywait"命令,然后另外再开启一个新终端向 /var/www/html 目录下添加文件、移动文件,在原来的终端中跟踪屏幕输出结果。
inotifywait -mrq -e modify,create,move,delete /var/www/html

#选项"-e":用来指定要监控哪些事件
#选项"-m":表示持续监控
#选项"-r":表示递归整个目录
#选项"-q":简化输出信息

(4)在另外一个终端编写触发式同步脚本(注意,脚本名不可包含 rsync 字符串,否则脚本可能不生效)

复制代码
vim /opt/inotify.sh

#!/bin/bash
LOCAL_DIR=/data/
INOTIFY_CMD="inotifywait -mrq -e modify,create,delete,move $LOCAL_DIR"
REMOTE_USER=root
REMOTE_PASSWORD=abc1234
REMOTE_PORT=22
REMOTE_IP=192.168.80.30
REMOTE_DIR=/var/www/html

$INOTIFY_CMD | while read DIRECTORY FILE EVENT  #使用while、read持续获取监控结果,根据结果可以作进一步判断是否读取到输出的监控记录
do
    if [ $(pgrep rsync | wc -l) -eq 0 ];then
        rsync -az --delete -e "sshpass -p $REMOTE_PASSWORD ssh -p $REMOTE_PORT"   $LOCAL_DIR  root@$REMOTE_IP:$REMOTE_DIR
    fi
done

2. 如何快速清空目录中的大量文件?

rsync -a --delete 空目录/ 目标目录/ #删除大量小文件rsync最快
find 目标目录/ -type f -delete #速度其次
rm -f ./* #速度最慢

总结

复制代码
文件传输协议:ftp   cifs   nfs   ssh
文件传输工具:lrzsz    vsftpd     samba     scp    sftp    WinSCP    rsync    SVN    git


rsync 远程文件同步,可实现跨主机增量同步文件数据


rsync-daemon 方式:
同步源要修改rysnc配置文件 /etc/rsync.conf ,添加共享模块和用户认证等配置,再 rsync --daemon 启动rsync进程

发起端使用命令 rsync -avz --delete  原始位置 目标位置 ,进行文件同步

下行同步: rsync -az --delete [--password-file=密码文件] 用户名@源服务器地址::共享模块名   本地目录
           rsync -az --delete [--password-file=密码文件] rsync://用户名@源服务器地址/共享模块名   本地目录

上行同步:rsync -az --delete [--password-file=密码文件]  本地目录/  用户名@源服务器地址::共享模块名
          rsync -az --delete [--password-file=密码文件]  本地目录/   rsync://用户名@源服务器地址/共享模块名 


rsync-ssh 方式:
同步源不需要修改rysnc配置文件和启动rsync进程,发起端即可直接进行文件同步

下行同步: rsync -az -e 'sshpass -p ssh密码 ssh -p ssh端口 -o StrictHostKeyChecking=no'  用户名@源服务器地址:共享目录/   本地目录

上行同步: rsync -az -e 'sshpass -p ssh密码 ssh -p ssh端口 -o StrictHostKeyChecking=no'  本地目录/   用户名@源服务器地址:共享目录/


定时同步  rsync + crontab
实时同步  rsync + inotify

vim inotify.sh
#!/bin/bash
LOCAL_DIR=/data/
INOTIFY_CMD="inotifywait -mrq -e modify,create,delete,move $LOCAL_DIR"
REMOTE_USER=root
REMOTE_PASSWORD=abc1234
REMOTE_PORT=22
REMOTE_IP=192.168.80.30
REMOTE_DIR=/var/www/html

$INOTIFY_CMD | while read DIRECTORY FILE EVENT
do
    if [ $(pgrep rsync | wc -l) -eq 0 ];then
        rsync -az --delete -e "sshpass -p $REMOTE_PASSWORD ssh -p $REMOTE_PORT"   $LOCAL_DIR  root@$REMOTE_IP:$REMOTE_DIR
    fi
done
相关推荐
wdxylb30 分钟前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20072 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪2 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk4 小时前
Linux 正则表达式
linux·运维
Fireworkitte5 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9006 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char6 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘127 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记11 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发11 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建