rsync+inotify

Rsync 数据同步工具

一、Rsync介绍

· 英语:Remote Rynchronization
· 官网:http://www.samba.org/ftp/rsync/rsync.html
· 功能:可实现全量及增量的本地或远程数据同步备份的优秀工具
· rsync 适用于 unix/linux/windows等多种操作系统
· rsync 相当于scp,cp,rm,但是还优于他们每一个命令
· rsync 服务端口873

二、Rsync特性

· 支持拷贝特殊文件如链接文件、设备等。
· 可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
· 可以做到保持源文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-P。
· 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率高。
· 可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)
· 可以通过socket(进程方式)传输文件和数据。(服务端与客户端)
· 支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像

三、Rsync工作模式

· 第一种:shell模式,本地模式

格式: rsync [option…] SRC… [DEST]

使用: rsync -a /data /backup //将本地“/data”目录拷贝到本地的“/backup”

说明:当SRC和DEST路径都不包括":"时,启动这个模式

rsync -rq /opt /bak

rsync -v /opt /bak

· 第二种:远程shell模式

格式1 Pull :rsync [option…] [USER@]HOST:SRC… [DEST]

格式2 Push:rsync [option…] SRC… [USER@]HOST:[DEST]

说明 :使用此模式建议配置ssh免密登录

ssh-keygen -t rsa

ssh-copy-id IP

使用1 Pull (下载) :rsync -re ssh 192.168.1.110:/opt /bak

使用2 Push(上传) :rsync -re ssh /opt 192.168.1.110:/bak

· 第三种:列表模式

格式:rsync [option…] [USER@]HOST:[DEST]

说明:将本地信息忽略,启动这个模式

作用:相当于ls命令,列出源内容

使用:rsync -nv rsync://192.168.1.110/www

· 第四种:服务器模式

格式1 Pull(下载)

rsync [OPTION…] [USER@]HOST::SRC… [DEST]

rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]

使用:rsync -r /opt/ user1@192.168.1.110::data

格式2 Push(上传)

rsync [OPTION…] SRC… [USER@]HOST::DEST

rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

使用:rsync -r user1@192.168.1.110::www /bak/

四、rsync选项

选项说明
-n测试,模拟
-v详细输出模式
-q静默模式
-c开启校验功能,强制对文件传输进行校验
-r递归复制
-a归档,保留文件的原有属性
-p保留文件的权限
-t保留文件的时间戳
-l保留文件的符号链接
-g保留文件的属组
-o保留文件的属主
-D保留设备文件
-e ssh表示使用ssh协议作承载
-z对文件压缩后传输
-progress显示进度条
-stats显示如何执行压缩和传输

五、rsync配置文件

rsync主配置文件( /etc/rsyncd.conf )

#全局配置设置
address = 192.168.10.10				#绑定 ip
port 873							#默认端口
uid = nobody  						#设置 uid 
gid = nobody 						#设置 gid 
use chroot = no 					#是否使用root 权限 
max connections = 10 				#设置最大连接数 
strict modes = yes 					#严格模式 
pid file = /var/run/rsyncd.pid 		#设置 pid 文件存放位置 
log file = /var/log/rsyncd.log 		#设置日志存放的位置 
#目录设置 
[syncd_dir_name] 					#共享目录名 
path = /path/to/some_dir 			#设置物理路径 
ignore errors = yes 				#报错后是否继续执行 
read only = no 						#只读 
write only = no 					#只写
hosts allow = white_list_ip/net 	#白名单 
hosts deny = black_list_ip/net 		#黑名单 
list = false	 					#是否可以列出目录内容 
uid = root 							#访问者的 uid 身份 
gid = root 							#访问者的 gid 身份 
auth users = username 				#用户名 
secrets file = /etc/rsyncd.passwd 	#设置密码

rsync密码文件( /etc/rsyncd.passwd)

rsync密码文件说明
1. 密码文件为明文
2. 文件权限必须是600
3. 格式  username:password

六、rsync 单向数据同步实验

1、实验环境

实验环境:一台NFS服务器(模拟www数据) 一台客户端

数据目录:NFS:/tmp3 client:/目录

2、搭建rsync服务

​ Ⅰ、在NFS服务器上搭建rsync服务
安装

​ Ⅱ、创建主配置文件

在这里插入图片描述

​ Ⅲ、创建密码文件

在这里插入图片描述

​ Ⅳ、启动服务 (脚本见:九)

在这里插入图片描述

3、下行 or 上行 同步

​ 上传在这里插入图片描述

​ 下载
在这里插入图片描述

​ 删除多余文件

在这里插入图片描述

七、rsync+inotify 单向实时同步

rsync+inotify 说明

定期同步的缺点:
· 执行备份的时间固定,延期明显,实时性差
· 当同步源长期不变化时,密集的定期任务是不必要的(浪费资源)
实时同步的优点:
· 一旦同步源出现变化,立即启动备份,实时性好
· 只要同步源无变化,则不执行备份,节省资源

1、inotify介绍

简介:notify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知,该机制是著名的桌面搜索引擎项目 beagle 引入的,并在 Gamin 等项目中被应用
安装包:epel源获取,点击查看 ctrl + f + 关键字inotify

2、inotifywait命令格式

inotifywait命令格式:
        inotifywait -mrq -e  监控动作1,监控动作2  /监控目录 &
        inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file>

3、inotifywait选项

inotifywait 主要用到的参数:
-m|--monitor 永远监听事件。
-d|--daemon

后台运行,以守护进程方式运行
-r |--recursive 递归监控
-e|--event		监听事件

inotifywait其他选项
-m :实时监控。
-d:后台运行。
-r:递归,对子目录监控。
-e:监控事件。以下
        access:检测文件访问事件。
        close_write:写入关闭事件。
        modify:文件发生变化。
        attrib:文件属性变化事件。
        delete:文件被删除。
--timefmt :当在--format 选项中使用%T 时,--timefrt 选项则可以用来指定自定义的符合 
--strftime 规范的时间格式,此时间格式可用的格式符可以通过 strftime 的手册页获取;
--timefrt 后常用的参数是'%d/%m/%y %H:%M';
--format :自定义 inotifywait 的输出格式,如--format '%T %w %f';常用的格式符如下:
    %w:显示被监控文件的文件名;
    %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
    %T:使用--timefmt 选项中自定义的时间格式. 
    eg. inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write /data #输出时间
    eg. innotifywait -mrq --format '%w%f' -e create,close_write,delete /data #简化输出

4、通过rsync+inotifywait结合脚本实现单向实时同步

补充:调整inotify监控文件数量
vim /etc/sysctl.conf
mak_queue_events			# 监控队列大小
mak_user_instances			# 最多监控实例数
max_user_watches			# 每个实例最多监控文件数
# 1、安装inotifywait:
rpm -ivh inotify-tools-3.14-9.el7.x86_64.rpm
rpm -ivh inotify-tools-devel-3.14-9.el7.x86_64.rpm

在这里插入图片描述

# 2、配置服务器:
# 用户登录时需要免密登录
#!/bin/bash
a="inotifywait -mrq -e create,delete /src" 
b="rsync -avz /src root@192.168.1.110:/des" 
$a | while read file
do
		$b
done

# bash jiaoben.sh &		# 后台运行

3、测试

​ 在服务器上创建或删除,查看同步

在这里插入图片描述

5、解决rsync+inotifywait同步多个文件慢及浪费资源问题

#!bin/bash
# me teacher gave to us
# i don't get it.
# heyhey :)

src=/data/
# 需要同步的源路径
des=data
# 目标服务器上 rsync --daemon 发布的名称,rsync --daemon 这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd
# rsync 验证的密码文件
ip1=192.168.0.18
# 目标服务器 1
ip2=192.168.0.19
# 目标服务器 2
user=root
# rsync --daemon 定义的验证用户名
cd ${src}
# 此方法中,由于 rsync 同步的特性,这里必须要先 cd 到源目录,inotify 再监听 ./ 才能 rsync 同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
# 把监控到有发生更改的"文件路径列表"循环
do
INO_EVENT=$(echo $file | awk '{print $1}')
# 把 inotify 输出切割 把事件类型部分赋值给 INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}')
# 把 inotify 输出切割 把文件路径部分赋值给 INO_FILE
echo "-------------------------------$(date)------------------------------------" 
echo $file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] ||
[[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
# 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' 
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && 
# INO_FILE 变量代表路径哦 -c 校验文件内容
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔细看 上面的 rsync 同步命令 源是用了$(dirname${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R 参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM' 
rsync -avzR --delete --password-file=${rsync_passwd_file}
$(dirname ${INO_FILE}) ${user}@${ip1}: ${des} && rsync -avzR --delete --password-file=${rsync_passwd_file}
$(dirname ${INO_FILE}) ${user}@${ip2}: ${des}
#看 rsync 命令 如果直接同步已删除的路径${INO_FILE}会报 no such or directory 错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete 来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
	fi
#修改属性事件 指 touch chgrp chmod chown 等操作
	if [[ $INO_EVENT =~ 'ATTRIB' ]]
	then
		echo 'ATTRIB' 
		if [ ! -d "$INO_FILE" ]
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync 会顺带更新此目录。
		then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}: ${des} && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}: ${des}
		fi
	fi
done

/usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while 
read file
#把发生更改的文件列表都接收到 file 然后循环,但有什么鬼用呢?下面的命令都没有引用这个$file 下面做的是全量 rsync
do
cd /backup && rsync -az --delete /backup/
rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password
done

八、unison+inotify双向实时同步

说明:

​ rsync在单向同步上支持的非常好,且效率很高,但是在双向同步支持较差;
​ unison 则是双向同步的优秀工具,但其缺点是同步效率较低。

1、环境环境

​ 两台服务器

​ 准备软件(inotify + ocaml + unison)

2、 搭建unison+inotify

​ Ⅰ、两台服务器都安装 inotify + ocaml + unison

# 联网安装:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install inotify*  ocaml*  unison*

# 两边需要互相认证

​ Ⅱ、配置脚本
注意:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,否则会变成死循环

SRC

#!/bin/bash
a="inotifywait -mrq -e create,delete  /src"
b="/usr/local/bin/unison -batch /src/ ssh://192.168.1.110//des"
$a | while read dir event file
do
	$b
done

DES

#!/bin/bash
a="inotifywait -mrq -e create,delete  /des"
b="/usr/local/bin/unison -batch /des/ ssh://192.168.1.110//src"
$a | while read dir event file
do
	$b
done

3、测试

​ 将脚本放入后台运行,或者通过xinetd管理 (守护进程)1,自己写一个rsync服务管理脚本
​ 在两边目录分别创建文件,删除文件查看是否同步(可能出现延迟)

九、Rsync服务脚本

#!/bin/bash
# author:Sand
# chkconfig:35 13 91
# description:This is Rsync service management shell script
# Source function library

. /etc/rc.d/init.d/functions
start(){
    rsync --daemon
    if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ];then
        action "Starting Rsync:" /bin/true
        sleep 1
    else
        action "Starting Rsync:" /bin/false
        sleep 1
    fi
}
stop(){
    pkill rsync;sleep 1;pkill rsync
    if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
        action "Stopping Rsync: " /bin/true
        sleep 1
    else
        action "Stopping Rsync:" /bin/true
        sleep 1
    fi
}
case "$1" in
    start)
        start;
        ;;
    stop)
        stop;
        ;;
    restart|reload)
        stop;
	sleep 1
        start;
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload}"
        ;;
esac
-v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
        action "Stopping Rsync: " /bin/true
        sleep 1
    else
        action "Stopping Rsync:" /bin/true
        sleep 1
    fi
}
case "$1" in
    start)
        start;
        ;;
    stop)
        stop;
        ;;
    restart|reload)
        stop;
	sleep 1
        start;
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload}"
        ;;
esac

  1. 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。 ↩︎

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值