Rsync文件同步与inotify实现文件同步功能
Rsync
- rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
-
# 使用的参数说明: v: 显示详细信息 z: 传输过程中对数据进行压缩 r: 递归 t: 保留修改时间属性 o: 保留文件所有者属性 p: 保留文件权限属性 g: 保留文件所属组属性 a: 归档模式,主要保留文件属性,等同于-rlptgoD --progress: 显示数据传输的进度信息 --password-file=FILE: 指定密码文件,将密码写入文件,实现非交互式数据同步,这个文件名也需要修改权限为600 --delete: 删除那些仅在目标路径中存在的文件(源路径中不存在),在脚本中的数据同步经常加上此参数 --list-only: 仅列出服务器模块列表,需要rsync服务器设置list=true
rsync -e "ssh -p22" -avz --delete ./ root@11.22.33.44:/tmp
使用rsync将当前目录下的内容同步到远程服务器11.22.33.44的tmp目录下,并且删除远程服务器上在本地没有的文件,-a 归档模式,主要保留文件属性,等同于-rlptgoD;-v 能显示详细步骤;-z 表示在传输过程中压缩;-e 表示指定要使用的远程shell。rsync -avz --delete ./ root@11.22.33.44:/tmp
上面命令的精简
Rsync 虚拟账户登录同步文件
该模式需要在服务端安装rsync
1. 服务端Rsync
yum -y install rsync
在服务端安装rsync- 编辑
/etc/rsyncd.conf
# 设置服务器信息提示文件,在该文件中编写提示信息 motd file = /etc/rsync/rsyncd.motd # 开启rsync数据传输日志功能 transfer logging = yes # 设置日志文件名,可通过log format参数设置日志格式 log file = /var/log/rsyncd.log # 设置rsync进程号保存文件名称 pid file = /var/run/rsyncd.log # 设置锁文件名称 lock file = /var/run/rsync.lock # 设置服务器监听的端口号,默认是873 port = 873 # 设置本服务器所监听网卡接口的ip地址 address = 0.0.0.0 # 设置进行数据传输时所使用的帐户名或ID号,默认使用nobody uid = root # 设置进行数据传输时所使用的组名或GID号,默认使用nobody gid = root # 若为yes, rsync会首先进行chroot设置,将根映射在下面的path参数路径下,对客户端而言,系统的根就是path参数指定的路径。但这样做需要root权限,并且在同步符号连接资料时只会同步名称,不会同步内容。 use chroot = no # 是否允许客户端上传数据,yes表示不允许 read only = no # 设置并发连接数,0表示无限制 max connections = 50 [common] # 自定义模块名,rsync通过模块定义同步的目录,可定义多个 # 定义注释说明字串 comment = web content # 同步目录的真是路径通过path指定 path = /home/www/composer # 忽略一些IO错误 ignore errors # exclude指定common目录下某个目录可以不同步数据 # exclude = test/ # 设置允许连接服务器的账户,此账户可以是系统中不存在的用户 auth users = rsync # 密码验证文件名,该文件权限要求为只读,建议为600,仅在设置auth users后有效 secrets file = /etc/rsync/rsyncd.secrets # 设置哪些主机可以同步数据,多ip和网段之间使用空格分隔 # hosts allow = 11.22.33.44 # 除了hosts allow定义的主机外,拒绝其他所有 # hosts deny=* # 客户端请求显示模块列表时,本模块名称是否显示,默认为true list = false
- 在命令行执行
echo "tom:123" > /etc/rsync/rsyncd.secrets chmod 600 /etc/rsync/rsyncd.secrets echo "welcome to access" > /etc/rsync/rsyncd.motd #此项客户端不需要做 rsync --daemon # --daemon表示后台执行,客户端开启rsync不需要--daemon选项 echo "/usr/bin/rsync --daemon" >> /etc/rc.local #开机启动rsync服务
- 这项待定
# groupadd --system --gid 102 rsync # useradd --system -g rsync --no-create-home --home /nonexistent --comment "rsync user" --shell /sbin/nologin --uid 102 rsync
- 开放873默认端口
2. 客户端Rsync
yum -y install rsync
安装rsync- 命令行执行
echo "123456789" > /etc/rsyncd.secrets #客户端只需要把密码写入文件 chmod 600 /etc/rsyncd.secrets
3. 执行同步操作
rsync -avz --progress --password-file=/etc/rsyncd.secrets tom@11.22.33.44::common /tmp
上面命令的含义为使用 /etc/rsyncd.secrets 里面设定的密码配置,使用tom虚拟账号(tom账号可以为linux系统中没有到账户),使用公共模块common,同步客户端 /tmp 下文件到服务端,具体到服务端什么地方,可以查看服务端配置。
inotify
- Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过Inotify可以监控文件系统添加、删除、移动、修改等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况
- 安装 inotify-tools 该软件包共安装了两个工具(命令),即inotifywait和inotifywatch
- inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在脚本中使用
- inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计
- inotifywait命令常用参数详解
参数 说明 含义 -r –recursive 递归查询目录 -q –quiet 打印很少的信息,仅仅打印监控事件的信息 -m –monitor 始终保持事件监听状态 –format – 打印使用指定的输出类似格式字符串 –timefmt – 指定事件输出的格式 -e –event 通过此参数可以指定要监控的事件 – access 文件或目录被读取 – modify 文件或目录的内容被修改 – attrib 文件或目录的属性被改变 – close 文件或目录被封闭,无论读/写模式 – open 文件或目录被打开 – move_to 文件或目录被移动至另外一个目录 – move 文件或目录被移动至另外一个目录或从另一个目录移动至当前目录 – create 文件或目录被创建在当前目录 – delete 文件或目录被删除 – umount 文件系统被卸载 inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e create /backup
监控/backup目录下文件的创建,新开一个窗口创建一个文件,返回原来窗口,查看反馈,如下
inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e delete,close_write,modify /backup/
同时测试create、modify、delete,效果如下
inotifywait -mrq --format '%w%f' -e create /backup
简化事件输出
rsync + inotify实时监控脚本,构建服务器文件同步工具
- 通过rsync文件同步工具和inotify文件监控工具,可以构建出一个实时监控文件改动的同步工具。
- 自动化脚本
#!/bin/sh FILE=/data IP=11.22.33.44 /usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete $ FILE \ | while read file do cd $FILE &&\ rsync -az “$file” --delete rsync_backup@$IP::nfsbackup \ --password-file=/etc/rsync.password & done
- docker运行脚本
#!/bin/bash if [ $# -eq 1 ] then # 第一个参数为本地同步路径 LocalPath=${1} else echo "\033[5;34m Usage: \033[0m sh ${0} LocalPath" | grep "LocalPath" --color exit 0 fi # rsync密码存放路径 RsyncPass=/home/www/rsync (docker run -it --rm -v $LocalPath:/mnt decezz/inotify inotifywait -mrq --format '%w%f' -e create,modify,delete,attrib,move /mnt) | while read act_log do docker run -i --rm -v $RsyncPass:/tmp -v $LocalPath:/mnt decezz/app rsync -avz --progress --password-file=/tmp/rsyncd.secrets --delete /mnt/ rsync@11.22.33.44::common done