rsync+inotify-tools文件传输

目录

rsync

rsync概述

rsync优缺点

rsync参数

rsync命令

rsync同步源

[linux 安装rsync](#linux 安装rsync)

安装rsync服务端

安装rsync客户端

[windows 安装rsync](#windows 安装rsync)

rsync实践

inotify-tools

inotify-tools概述

[innotify-tools 命令、参数、事件](#innotify-tools 命令、参数、事件)

rsync客户端安装inotify-tools

innotify-tools实践

rsync+inotify-tools实践

加入开机自动执行


数据均由rsync客户端推向服务端进行传输

rsync传输命令最好手敲 否则可能会出现模块用户密码无法识别的情况

官网:rsync

Linux版下载:rsync download

Windows版下载:cwRsync - Rsync for Windows | itefix.net

rsync

rsync概述

rsync(remote sync)远程同步,rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。已支持跨平台,可以在Windows与Linux间进行数据同步。 rsync监听端口:873,rsync运行模式:C/S。

官网:https://rsync.samba.org/

官方文档:https://www.samba.org/ftp/rsync/rsync.html

GitHub地址:https://github.com/WayneD/rsync

rsync优缺点

一、优点

可以镜像保存整个目录树和文件系统;

可以做到保持原来文件的权限、时间、软硬链接等等;

无须特殊权限即可安装;

可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能;

可以使用rcp、ssh等方式来传输文件,rsync本身不对数据加密;

支持匿名传输,可以实现方便安全的进行数据备份和镜像;

可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高;

可以通过socket(进程方式)传输文件和数据。

2)缺点

同步数据,需要扫描所有文件进行对比,才进行差量传输。如果文件数量达到百万甚至千万级,扫描文件对比文件将非常耗时,降低了rsync效率;

rsync不能实时地区监测、同步数据。虽然可以通过守护进程方式触发同步,但两次动作间有时间差,导致数据不一致,无法应对出现故障时完全恢复数据。

缺点可以通过和inotify-tools配合解决

rsync参数

|---------------------|-------------------------------------------------------------------------------|
| rsyncd.conf 参数 | 参数说明 |
| uid=root | rsync 使用的用户。 |
| gid=root | rsync 使用的用户组(用户所在的组) |
| use chroot=no | 如果为 true,daemon 会在客户端传输文件前"chroot to the path"。这是一种安 全配置,因为我们大多数都在内网,所以不配也没关系 |
| max connections=200 | 设置最大连接数,默认 0,意思无限制,负值为关闭这个模块 |
| timeout=400 | 默认为 0,表示 no timeout,建议 300-600(5-10 分钟) |
| pid file | rsync daemon 启动后将其进程 pid 写入此文件。如果这个文件存在,rsync 不会 覆盖该文件,而是会终止 |
| lock file | 指定 lock 文件用来支持"max connections"参数,使得总连接数不会超过限制 |
| log file | 不设或者设置错误,rsync 会使用 rsyslog 输出相关日志信息 |
| ignore errors | 忽略 I/O 错误 |
| read only=false | 指定客户端是否可以上传文件,默认对所有模块为 true |
| list=false | 是否允许客户端可以查看可用模块列表,默认为可以 |
| hosts allow | 指定可以联系的客户端主机名或和 ip 地址或地址段,默认情况没有此参数,即都 可以连接 |
| hosts deny | 指定不可以联系的客户端主机名或 ip 地址或地址段,默认情况没有此参数,即都 可以连接 |
| auth users | 指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。 默认为所有用户无密码访问 |
| secrets file | 指定用户名和密码存放的文件,格式;用户名;密码,密码不超过 8 位 |
| [backup] | 这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的 名称,便于以后维护 |
| path | 这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的 权限一致,否则会遇到读写的问题 |
| 配置/etc/rsyncd_users.db,跟auth users对应 ||

rsync命令

bash 复制代码
rsync --help
rsync [选项]  原始位置   目标位置

|------------|-------------------------|
| 常用选项 | 说明 |
| -r | 递归模式,包含目录及子目录中的所有文件 |
| -l | 对于符号链接文件仍然复制为符号链接文件 |
| -v | 显示同步过程的详细信息 |
| -z | 在传输文件时进行压缩goD |
| -p | 保留文件的权限标记 |
| -a | 归档模式,递归并保留对象属性,等同于-rlpt |
| -t | 保留文件的时间标记 |
| -g | 保留文件的属组标记(仅超级用户使用) |
| -o | 保留文件的属主标记(仅超级用户使用) |
| -H | 保留硬链接文件 |
| -A | 保留ACL属性信息 |
| -D | 保留设备文件及其他特殊文件 |
| --delete | 删除目标位置有而原始位置没有的文件 |
| --checksum | 根据对象的校验和来决定是否跳过文件 |

rsync同步源

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

例:

rsync服务端同步别人,下行同步,将别人的信息下载到本地;

别人同步rsync服务端,上行同步,将信息上传至rsync服务器。

同步方式:

全量备份:

原有的数据全部传送,把原来的文件和新的文件一起统一传送,全量复制,效率低

增量备份:

在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输,增量复制,效率高

配置源的两种表示方法

格式一:

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

rsync -avz backuper@192.168.10.10::wwwroot /root

格式二:

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

rsync -avz rsync://backuper@192.168.10.10/wwwroot /root

linux 安装rsync

安装rsync服务端

bash 复制代码
#安装rsync和xinetd超级守护进程
yum install -y xinetd rsync
#配置rsync配置文件
vim /etc/rsyncd.conf
##########linux rsyncd.conf  配置文件参数后面不能有备注否则可能有问题##############
#Global Settings 全局配置
uid = nobody                         #运行rsync的用户
gid = nobody                         #运行rsync的用户组
use chroot = no                      #是否让进程离开工作目录
max connections = 5                  #最大并发连接数,0为不限制
timeout = 600                        #超时时间
pid file = /var/run/rsyncd.pid       #指定rsync的pid存放路径
lockfile = /var/run/rsyncd.lock      #指定rsync的锁文件存放路径
log file = /var/log/rsyncd.log       #指定rsync的日志存放路径
#模块配置
[web1]
path = /var/www                      #认证的模块名,在client端需要指定 服务端存放客户端文件的目录 windows客户端存放d盘下backup_d文件夹下path = /cygdrive/d/backup_d
ignore errors = yes                  #忽略一些无关的I/O错误
read only = no                       #客户端是否能拉(PULL)
write only = no                      #客户端是否能推(PUSH)
hosts allow = 172.16.150.150         #白名单,可以访问此模块的主机
hosts deny = *                       #黑名单,*表示任何主机
list = yes                           #客户端请求是否可以列出模块列表
uid = root                           #以root的身份去获取文件
gid = root
auth users = web                     #认证此模块的用户名
secrets file = /etc/web.passwd       #指定存放"用户名:密码"格式的文件
max connections = 200                # 最大连接数
timeout = 600                        # 设置超时时间
###############################################################
##########windows rsyncd.conf  配置文件参数后面不能有备注否则可能有问题##############
uid = root
gid = 0
use chroot = no
strict modes = no
max connections = 5
timeout = 600
pid file = rsyncd.pid
lockfile = rsyncd.lock
log file = rsyncd.log
prot = 873

[test]
	path = /cygdrive/d/backup_d
	ignore errors = yes
	read only = no
	hosts deny = *
	hosts allow = 192.168.90.243
	list = yes
	max connections = 200
	timeout = 600
	auth users = asd
	secrets file = etc/rsyncd.secrets
###########################################################################

#创建同步目录
mkdir -p /var/www/
#配置rsync认证文件/etc/web.passwd
echo "web:web" > /etc/web.passwd
#修改/etc/web.passwd的权限为600
chmod 600 /etc/web.passwd
#配置服务能够启动
chkconfig rsync on
systemctl start xinetd start
#检查873端口是否监听成功
ss -antl | grep 873
#检查rsync的运行状态
chkconfig --list
systemctl status rsync

安装rsync客户端

bash 复制代码
#安装
yum install -y xinetd rsync
#设置rsync客户端的密码文件,客户端只需要设置rsync同步的密码即可,不用设置用户名(默认已经安装了rsync)
echo web > /etc/web.passwd
#修改/etc/rsyncd.passwd的权限为600
chmod 600 /etc/web.passwd

windows 安装rsync

正常执行rsync安装包下一步下一步下一步即可,服务端需要设置一个账号和密码,客户端则不用,配置信息和linux一样

window实践 创建bat脚本 执行脚本进行传输数据

@echo off

cmd /k "cd /d E:\cwRsync\bin&&rsync.exe -vzrtopg --progress --delete xz@服务端ip::www /cygdrive/E/databackup/www --port=端口号 --password-file=/cygdrive/E/cwRsync/passwd

"

pause

rsync实践

bash 复制代码
# 在192.168.0.99节点上测试手动同步
# 从远端【拉取】数据
rsync -avz root@192.168.0.99:/opt/nfsdata/* /opt/nfsdata/
#从服务端拉取数据
rsync -avz --progress --delete  root@192.168.90.13::web /shell

# 在192.168.0.99节点上测试手动同步
# 从【推送】数据
rsync -avz /opt/nfsdata/* root@192.168.0.99:/opt/nfsdata/

### 在192.168.0.99节点上测试手动同步,通过【拉取】数据,配置文件配置的模块,这里走的是rsync协议,上面走的是ssh协议,只要做了免密就直接推送或拉取数据了。这里就会用到配置文件里配置的users用户了,也是secrets file文件里配置的其中一个用户。
#【方式一】
rsync -avz backuper@192.168.0.99::nfsdata /opt/nfsdata/
# 【方式二】
rsync -avz rsync://backuper@192.168.0.99/nfsdata /opt/nfsdata/

# 在192.168.0.99节点上执行
###【推送】
#【方式一】非交互式,/opt/backuper.pass文件是backuper用户的密码,且文件权限600
rsync -avz --password-file=/opt/backuper.pass /opt/nfsdata/* backuper@192.168.0.99::nfsdata
# 【方式二】
rsync -avz /opt/nfsdata/* rsync://backuper@192.168.0.99/nfsdata 

#有密码形式推送数据到服务端
rsync -avz --progress --delete /shell 用户@IP地址::模块 --password-file 客户端存放密码文件
rsync -avz --progress --delete /shell @192.168.90.13::test --password-file /etc/web.passwd

#无密码形式推送数据到服务端
rsync -avz --progress --delete /shell  uid@服务IPD地址::模块
rsync -avz --progress --delete /shell  root@192.168.90.13::web

inotify-tools

inotify-tools概述

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

Inotify 监控文件系统操作,比如读取、写入和创建,基于事件驱动,可以做到对事件的实时响应,高效,而且没有轮询造成的系统资源消耗。

在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件

innotify-tools 命令、参数、事件

命令

inotify-tools 包含了两个命令:inotifywait 与 inotifywatch。

inotifywait:在被监控的文件或目录上等待特定文件系统事件发生,执行后处于阻塞状态,适合在shell脚本中使用。

阻塞状态 (Blocked):阻塞状态是线程因为某种原因放弃CPU的使用权,暂时停止运行。

inotifywatch:用于收集文件系统的统计数据,例如发生了多少次 inotify 事件,某文件被访问了多少次等等。
内核参数

/proc/sys/fs/inotify/ 目录下包含三个文件,分别设置 inotify 相关的三个内核参数。

max_queued_events:inotify 事件队列可容纳的事件数量,超出的事件被丢弃,但会触发队列溢出Q_OVERFLOW事件。/proc/sys/fs/inotify/max_queued_events默认值16384

max_user_instances:每个用户可运行的 inotifywait 或 inotifywatch 命令的进程数。/proc/sys/fs/inotify/mak_user_instances默认值128

max_user_watches:每个 inotifywait 或 inotifywatch 命令可以监控的文件数量。如果监控的文件数目巨大,需要根据情况适当增加此值。/proc/sys/fs/inotify/max_user_watches默认值8192
事件

inotify 监控的文件系统事件:

access:文件被访问。

modify:文件被修改。

attrib:文件元数据被修改。

open:文件被打开。

move 移动

create:在被监控的目录中创建了文件或目录。

delete:删除了被监控目录中的某个文件或目录。

-m 持续进行监控

-r 递归监控所有子对象

-q 简化输出信息

-e 指定要监控哪些事件类型

inotifywait:用于持续监控,实时输出结果

可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果。

inotifywatch:用于短期监控,任务完成后再输出结果

可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。

例:

inotifywait -mrq -e modify,create,attrib,move,delete 文件或目录

注意:对文件的某个操作往往会触发多个事件,用户应用程序需要自己防止做出重复响应。

rsync客户端安装inotify-tools

bash 复制代码
#检查当前系统内核是否支持inotify 内核版本大于2.6.13则支持
uname -r
#安装 在一块不知道为什么 inotify-tools 没有安装上 所以分开进行了安装
yum install -y epel-release
yum install -y inotify-tools
#配置内核参数
#inotify 事件队列可容纳的事件数量,超出的事件被丢弃,但会触发队列溢出Q_OVERFLOW事件。
#/etc/sysctl.conf(内核参数配置文件),需要配置下面配置
vim /etc/sysctl.conf
###################sysctl.conf######################### 默认值16384
    max_queued_events=16384
#每个用户可运行的 inotifywait 或 inotifywatch 命令的进程数。默认值128
    mak_user_instances=128
#每个 inotifywait 或 inotifywatch 命令可以监控的文件数量。
#如果监控的文件数目巨大,需要根据情况适当增加此值。配置的监控数量应该大于监控目标的总文件数默认值8192
    max_user_watches=8192 
########################################################

innotify-tools实践

不指定监控事件,分别打开两个 shell 窗口,使用 inotifywait 和 inotifywatch 监控某个目录:

bash 复制代码
#创建目录
mkdir /var/inotify-test
#监控这个文件有没有发生变化
inotifywait -m /var/inotify-test

#显示目录的详细信息
inotifywatch -v /var/inotify-test

在目录下面创建两个文件
touch /var/inotify-test/file1
touch /var/inotify-test/file2

其中 inotifywait 的信息是在进程运行过程中输出的,而 inotifywatch 的信息是在进程结束时输出的。
以上测试没有指定监听事件,所以监听的是所有的事件,可以通过 -e 选项来指定监听事件,如:
inotifywait -m -e create,modify,delete /var/inotify-test

rsync+inotify-tools实践

bash 复制代码
vim /opt/inotify_rsynx.sh
#!/bin/bash
#定义两个变量:监控文件,执行备份
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete 需要监控的目录或文件"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/密码文件 刚才监控的目录或文件 用户名@主机地址::共享模块名"
#
#rsync -az --delete /home/backup/project/bak_project rsync_backup@172.16.0.92::backup_e &>/dev/null
 #while read获取监控结果
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
#当读取目录,事件,文件
do 
    #如果rsync没有运行,执行rsync进行备份操作
    if [ $(pgrep rsync | wc -l) -eq 0 ] ; then
        $RSYNC_CMD
	fi
done

加入开机自动执行

bash 复制代码
chmod +x /etc/rc.d/rc.local
echo '/opt/inotify_rsync.sh' >> /etc/rc.d/rc.local
相关推荐
云飞云共享云桌面25 分钟前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮2 小时前
Linux 使用中的问题
linux·运维
dsywws3 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零4 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
wclass-zhengge4 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱4 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范
小林熬夜学编程5 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
力姆泰克5 小时前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节
BPM_宏天低代码5 小时前
低代码 BPA:简化业务流程自动化的新趋势
运维·低代码·自动化