rsync+inotify

https://rsync.samba.org/

rsync介绍

默认端口:873

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

rsync的部分特性

可以镜像保存整个目录树和文件系统
可以很容易做到保持原来文件的权限、时间、软硬链接等等
无须特殊权限即可安装
快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接
支持匿名传输,以方便进行网站镜像

rsync的ssh认证协议

rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:
# ssh协议
# rsync协议
rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件
rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf

rsync命令的常用选项

//rsync常用选项:
-a, --archive    //归档
-v, --verbose    //啰嗦模式
-q, --quiet      //静默模式
-r, --recursive  //递归
-p, --perms      //保持原有的权限属性
-z, --compress   //在传输时压缩,节省带宽,加快传输速度
--delete         //在源服务器上做的删除操作也会在目标服务器上同步

rsync+inotify

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

源服务器:
* IP地址:192.168.201.129;
* 应用:rsync,inotify-tools,脚本;
* 操作系统:Redhat7

目标服务器:
* IP地址:192.168.201.128;
* 应用:rsync;
* 操作系统:Redhat7

操作过程

机器关闭selinux/firewalld
目标服务器
[root@localhost ~]# yum -y install rsync
[root@localhost ~]# useradd -s /bin/nologin -M rsync
[root@localhost ~]# mkdir /data
[root@localhost ~]# ll /data/
total 0
[root@localhost ~]# ll -d /data/
drwxr-xr-x. 2 root root 6 Feb 18 17:23 /data/
[root@localhost ~]# vim /etc/rsync.password
ran:123456
[root@localhost ~]# chmod 600 /etc/rsync.password
[root@localhost ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
user chroot = no
max connections = 200
timeout = 300
read only = no
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[rsync]
path = /data
auth users = ran
secrets file = /etc/rsync.password
ignore errors

[root@localhost ~]# systemctl start rsyncd

# 权限报错,目录给权限
源服务器(rsync-inotify)
[root@localhost ~]# yum -y install rsync
[root@localhost ~]# echo 123456 > /etc/rsync.password
[root@localhost ~]# chmod 600 /etc/rsync.password
[root@localhost ~]# echo hello > hello.txt
[root@localhost ~]# rsync -avz hello.txt ran@192.168.201.128::rsync --password-file=/etc/rsync.password    #测试连接
# 安装inotify-tools工具,实时触发rsync进行同步
# 查看服务器内核是否支持inotify
[root@localhost ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 2月  19 15:46 max_queued_events
-rw-r--r-- 1 root root 0 2月  19 15:46 max_user_instances
-rw-r--r-- 1 root root 0 2月  19 15:46 max_user_watches
**如果有这个三个以max开头的文件,则表示服务器内核支持inotify**
[root@localhost ~]# yum -y install inotify*
[root@localhost ~]# vim inotify.sh
#!/bin/bash

Path=/www  #在源服务器上所要监控的备份目录
backup_Server=192.168.201.128  #目标服务器的ip(备份服务器)
rsync_backup=ran  #执行数据同步的用户名
nfsbackup=rsync  #自定义的模块名,需要与目标服务器上定义的同步名称一致
passfile=/etc/rsync.password  #执行数据同步的密码文件

/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path | while read line 
do
 if [ -f $line ];then
 rsync -az $line --delete $rsync_backup@$backup_Server::$nfsbackup --password-file=$passfile
 else
 cd $Path &&\
 rsync -az ./ --delete $rsync_backup@$backup_Server::$nfsbackup --password-file=$passfile
 fi
done
[root@localhost ~]# nohup bash inotify.sh &
脚本设置开机自启
[root@localhost ~]# chmod +x /etc/rc.d/rc.local 
[root@localhost ~]# vim /etc/rc.d/rc.local 
nohup /bin/bash /scripts/inotify.sh &
测试时报错:
# rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
解决:
# 传输文件的属主属组设为rsync
chown rsync.rsync xxx

rsyncd.conf配置文件

# rsyncd.conf配置文件
port:指定在哪个端口启动rsyncd服务,默认是873端口。
log file:指定日志文件。
pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等进程管理操作。
address:指定启动rsyncd服务的IP。假如你的机器有多个IP,就可以指定由其中一个启动rsyncd服务,如果不指定该参数,默认是在全部IP上启动。
[]:指定模块名,里面内容自定义。
path:指定数据存放的路径。
use chroot true|false:表示在传输文件前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软连接文件,阿铭建议你设置成false。
max connections:指定最大的连接数,默认是0,即没有限制。
read only ture|false:如果为true,则不能上传到该模块指定的路径下。
list:表示当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏。
uid/gid:指定传输文件时以哪个用户/组的身份传输。
auth users:指定传输时要使用的用户名。
secrets file:指定密码文件,该参数连同上面的参数如果不指定,则不使用密码验证。注意该密码文件的权限一定要是600。格式:用户名:密码
hosts allow:表示被允许连接该模块的主机,可以是IP或者网段,如果是多个,中间用空格隔开。 
当设置了auth users和secrets file后,客户端连服务端也需要用用户名密码了,若想在命令行中带上密码,可以设定一个密码文件

rsync -avL test@192.168.36.130::test/test1/ /tmp/test8/ --password-file=/etc/rsync.password
 其中test是目标服务器rsync的账号,/etc/rsync.password内容就是一个密码,权限要改为600
全局参数
全局参数
在文件中[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

# port
指定后台程序使用的端口号,默认为873。
# motd file
motd file参数用来指定一个消息文件
当客户连接服务器时该文件的内容显示给客户
默认是没有motd文件的
# log file
指定rsync的日志文件,而不将日志发送给syslog
比如可指定为“/var/log/rsyncd.log”
# pid file
指定rsync的pid文件
通常指定为“/var/run/rsyncd.pid”
# syslog facility
指定rsync发送日志消息给syslog时的消息级别
常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3, local4, local5, local6和local7
默认值是daemon。
模块参数
模块参数
主要是定义服务器哪个目录要被同步
其格式必须为“[module]”形式,这个名字就是在rsync 客户端看到的名字
而服务器真正同步的数据是通过 path 来指定的
我们可以根据自己的需要,来指定多个模块

##  基本模块参数

# comment
给模块指定一个描述
该描述连同模块名在客户连接得到模块列表时显示给客户
默认没有描述定义。
# path
指定该模块的供备份的目录树路径
该参数是必须指定的
=============================================
##  模块控制参数

# use chroot
如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。
这样做的原因是实现额外的安全防护,但是缺 点是需要以root权限,并且不能备份指向外部的符号连接所指向的目录文件
默认情况下chroot值为true
# uid
该选项指定当该模块传输文件时守护进程应该具有的uid
配合gid选项使用可以确定哪些可以访问怎么样的文件权限
默认值是"nobody"
# gid
该选项指定当该模块传输文件时守护进程应该具有的gid
默认值为"nobody"
# max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试
默认值是0,也就是没有限制
# lock file
指定支持max connections参数的锁文件
默认值是/var/run/rsyncd.lock
# list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出
如果设置该选项为false,可以创建隐藏的模块
默认值是true
# read only
该选项设定是否允许客户上载文件
如果为true那么任何上载请求都会失败
如果为false并且服务器目录读写权限允许那么上载是允许的
默认值为true。
# write only
指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。
# ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误
一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题
# ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件
这对于在需要备份的目录中,有些文件是不应该被备份者得到的
# timeout
通过该选项可以覆盖客户指定的IP超时时间
通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端
超时单位为秒钟,0表示没有超时定义,这也是默认值
对于匿名rsync服务器来说,一个理想的数字是600
# dont compress
用来指定那些不进行压缩处理再传输的文件
默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
====================================================
##  模块文件筛选参数

# exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中
这等同于在客户端命令中使用--exclude来指定模式,一个 模块只能指定一个exclude选项
但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表
如果希望确保特定的文件不能 被访问,那就最好结合uid/gid选项一起使用
# exclude from
指定一个包含exclude模式的定义的文件名
服务器从该文件中读取exclude列表定义
# include
用来指定不排除符合要求的文件或目录
这等同于在客户端命令中使用--include来指定模式
结合include和exclude可以定义复杂的exclude/include规则
# include from
指定一个包含include模式的定义的文件名
服务器从该文件中读取include列表定义
==================================================
##  模块用户认证参数

# auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块
这里的用户和系统用户没有任何关系
如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议
用户的名和密码以明文方式存放在"secrets file"选项指定的文件中
默认情况下无需密码就可以连接模块(也就是匿名方式)
# secrets file
该选项指定一个包含定义用户名:密码对的文件
只有在"auth users"被定义时,该文件才有作用
文件每行包含一个username:passwd对
一般来说密码最好不要超过8个字符
没有默认的 secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)
注意:该文件的权限一定要是600,否则客户端将不能连接服务器
# strict modes
该选项指定是否监测密码文件的权限
如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件
默认值为true
=====================================================
##  模块访问控制参数

# hosts allow
该选项指定哪些IP的客户允许连接该模块
客户模式定义可以是以下形式:
单个IP地址,例如:192.167.0.1
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多个IP或网段需要用空格隔开
“*”则表示所有,默认是允许所有主机连接
# hosts deny
指定不允许连接rsync服务器的机器
可以使用hosts allow的定义方式来进行定义
默认是没有hosts deny定义
===========================================================
##  模块日志参数

# transfer logging
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
# log format
通过该选项用户在使用transfer logging可以自己定制日志文件的字段
其格式是一个包含格式定义符的字符串,格式定义符如下所示:
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:"send""recv"
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码
默认log格式为:"%o %h [%a] %m (%u) %f %l"
一般来说,在每行的头上会添加"%t [%p] "
在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件
=====================================================
# refuse options
通过该选项可以定义一些不允许客户对该模块使用的命令参数列表
这里必须使用命令全名,而不能是简称
但发生拒绝某个命令的情况时服务器将报告错误信息然后退出
如果要防止使用压缩,应该是:"dont compress = *"

rsync参数

-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,关于更完整更详细的选项说明,见我的rsync man手册翻译。

虽然选项非常多,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。

inotify命令

inotifywait   #用来监控文件或目录的变化,是inotify核心命令
inotifywatch  #用来统计文件系统访问的次数,例如发生了多少次inotify事件,某文件被访问了多少次等等,一般用不上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值