标签:-- notify 改进 match 经验 sel 重要 rbo mat
inotify + rsync
最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的文件列表就达20M,在网络状况不佳或者限速的情况下,变更的文件可能10来个才几M,却因此要发送的文件列表就达20M,严重减低的带宽的使用效率以及同步效率;更为要紧的是,加入inotifywait在5s内监控到10个小文件发生变化,便会触发10个rsync同步操作,结果就是真正需要传输的才2-3M的文件,比对的文件列表就达200M。使用这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,比如排除同步的目录,同步多个模块或同步到多个主机。
sersync
后来听同事说 sersync 这么个工具可以提高同步的性能,也解决了同步大文件时出现异常的问题,所以就尝试了一下。sersync是国内的一个开发者开源出来的,使用c++编写,采用多线程的方式进行同步,失败后还有重传机制,对临时文件过滤,自带crontab定时同步功能。网上看到有人说性能还不错,说一下我的观点:
国产开源,文档不是很全,在2011年之后就没更新了(googlecode都要快关闭了,其实可以转交其他人维护),网上关于它的使用和讨论都止于10年了
采用xml配置文件的方式,可读性比较好,但是有些原生的有些功能没有实现就没法使用了
无法实现多目录同步,只能通过多个配置文件启动多个进程
文件排除功能太弱。这个要看需求,不是每个人都需要排除子目录。而对于我的环境中,这个功能很重要,而且排除的规则较多
虽然提供插件的功能,但很鸡肋,因为软件本身没有持续更新,也没有看到贡献有其它插件出现(可能是我知识面不够,还用不到里面的refreshCDN plugin)。
虽然不懂c++,但大致看了下源码 FileSynchronize,拼接rsync命令大概在273行左右,最后一个函数就是排除选项,简单一点可以将--exclude=改成--eclude-from来灵活控制。有机会再改吧。
另外,在作者的文章 Sersync服务器同步程序 项目简介与设计框架 评论中,说能解决上面 rsync + inotify中所描述的问题。阅读了下源码,这个应该是没有解决,因为在拼接rsync命令时,后面的目的地址始终是针对module的,只要执行rsync命令,就会对整个目录进行遍历,发送要比对的文件列表,然后再发送变化的文件。sersync只是减少了监听的事件,减少了rsync的次数——这已经是很大的改进,但每次rsync没办法改变。(如有其它看法可与我讨论)
其实我们也不能要求每一个软件功能都十分健全,关键是看能否满足我们当下的特定的需求。所谓好的架构不是设计出来的,而是进化来的。目前使用sersync2没什么问题,而且看了它的设计思路应该是比较科学的,特别是过滤队列的设计。双向同步看起来也是可以实现。
lsyncd
Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。
实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录),一个命令搞定。
软件部署安装
rpm -qa inotify-tools inotify-tools-3.14-9.el7.x86_64
软件使用方法
/usr/bin/inotifywait --- 实现监控目录数据变化信息 添加 修改 删除 关注 /usr/bin/inotifywatch --- 实时统计目录数据变化信息 添加*10 修改*20
inotifywait使用手册:
inotifywait [ options ] /data 日志
--exclude
Exclude all events on files matching the extended regular expression .
实时同步数据时, 将部分文件排除进行同步操作
--excludeiLike --exclude but case insensitive.
实时同步数据时, 忽略文件大小写进行同步排除操作
-m|--monitor Keep listening for events forever. Without this option, inotifywait will exit after one event is received.
维持事件永久监听状态. 如果没有此参数, 一次事件被接收后就退出监视过程
-r|--recursive Watch directories recursively
递归监控目录数据信息变化
-q|--quiet Print less (only print events).
输出很少的信息 (只输出事件信息)
-qq Print nothing (not even events).
什么都没有(甚至事件信息也不要输出)
--formatPrint using a specified printf-like format string; read the man page for more details.
设计规划命令输出信息格式
--timefmtstrftime-compatible format string for use with %T in --format string.
规划时间信息格式
-e|--event[ -e|--event ... ]
Listen for specific event(s). If omitted, all events are listened for.
指定监听事件信息, 如果忽略参数配置, 所有事件都要监视
监控事件信息 close_write move create delete
access file or directory contents were read
modify file or directory contents were written 修改
attrib file or directory attributes changed
close_write file or directory closed, after being opened in writeable mode
文件或目录被写入新的信息后, 进行关闭操作
close_nowrite file or directory closed, after being opened in read-only mode
文件或目录没有写入新的信息后, 进行关闭操作
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
文件或目录有数据变化, 数据信息是从其他目录转移过来
moved_from file or directory moved from watched directory
文件或目录有数据变化, 数据信息是从监控服务转到其它目录
move file or directory moved to or from watched directory
create file or directory created within watched directory
文件或目录进行创建时需要被监控
delete file or directory deleted within watched directory
文件或目录进行删除时需要被监控
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
inotify部署全网备份服务:
基础使用方法 : inotifywait -mrq /data
扩展使用方法 : inotifywait -mrq /data --format "%T %w%f %e" --timefmt="%F_%A %T"
inotifywait -mrq /data --format "%T %w%f %e" --timefmt="%F_%A %T" -e "close_write,move,create,delete"
while read line
do
…
done < file
command | while read line
do
…
done
#!/bin/bash
inotifywait -mrq /data --format "%w%f" -e "close_write,move,create,delete"|while read line
do
rsync -az /data/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
done
nohup sh /server/scripts/inotify.sh & #nohup该命令可以在你退出帐户/关闭终端之后继续运行相应的进程,& 后台运行
安装部署lsync实时同步工具
yum install -y lsyncd
编写配置文件
vim /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
}
sync {
default.rsync,
source = "/data",
target = "rsync_backup@172.16.1.41::backup",
delete= true,
exclude = { ".*" },
delay = 1,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.password",
_extra = {"--bwlimit=200"}
}
}
systemctl start lsyncd
(无法由systemctl启动,只能手动/脚本启停,pkill sersync2,sersync2 -dro /usr/bin/xxxxx)
排错经验: 首先看提示信息error,-----》
配置文件出错:
01.. 书写信息错误
02. 文件语法错误
03. 配置参数缺失
标签:-- notify 改进 match 经验 sel 重要 rbo mat
原文地址:https://www.cnblogs.com/hypj/p/13170280.html