设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] rsync + inotify 实现两台主机间文件的同步备份

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-10-17 08:51:02 | 显示全部楼层 |阅读模式
                      前面一篇博文介绍了rsync的主要使用及工作于服务器模式下的安装、配置。inotify是Linux内核中监控文件系统的一种事件机制,它负责监视文件系统的变化。如文件的创建、修改、删除等,并以事件的方式通知给应用程序。inotify-tools是一个基于内核的inotify机制为用户提供实现对文件系统的事件进行监控功能的应用程序组件。

inotify实现的对文件系统监视的事件:
IN_ACCESS:文件被访问
IN_MODIFY:文件被修改
IN_ATTRIB,文件属性被修改
IN_CLOSE_WRITE,以可写方式打开的文件被关闭
IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭
IN_OPEN,文件被打开
IN_MOVED_FROM,文件被移出监控的目录
IN_MOVED_TO,文件被移入监控着的目录
IN_CREATE,在监控的目录中新建文件或子目录
IN_DELETE,文件或目录被删除
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

通过/proc接口中的如下参数设定inotify能够使用的内存大小:
1、/proc/sys/fs/inotify/max_queue_events
应用程序调用inotify时需要初始化inotify实例,并时会为其设定一个事件队列,此文件中的值则是用于设定此队列长度的上限;超出此上限的事件将会被丢弃
2、/proc/sys/fs/inotify/max_user_instances
此文件中的数值用于设定每个用户ID(以ID标识的用户)可以创建的inotify实例数目的上限
3、/proc/sys/fs/inotify/max_user_watches
此文件中的数值用于设定每个用户ID可以监控的文件或目录数目上限

inotifywait命令
inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:
-m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;
-r, --recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。
-e <event>, --event <event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;
--timefmt <fmt>:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';
--format <fmt>:自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:
      %w:显示被监控文件的文件名;
      %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
      %T:使用--timefmt选项中自定义的时间格式

举例:
        # inotify -r -m --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/src
        持久监控/tmp/src目录及其内部所有文件上发生的create,delete,modify,close_write事件。

两台主机间文件同步备份
文件源主机A : 192.168.100.107            要同步的源文件: /var/mydata
文件备份服务器B : 192.168.100.105     备份存放位置: /tmp/mydata
假定在服务器B上已经安装配置好了rsync服务,并已经正常开启了服务。在主机A上也已经安装好了rsync,并已测试通过两主机之间通过rsync同步文件的功能。只需安装inotify-tools,然后编写相应的脚本。

1) 编译安装inotify-tools
假定已经在官方网站下载好了源码包inotify-tools-3.13.tar.gz,位于/tmp/目录下。
?
1
2
3
4
5
6
# tar xf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig



2) 编写脚本/root/mydatasync.sh
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#

syncServer=192.168.100.105
syncShareName=mydata
srcdir=/var/mydata/

inotifywait -mr --timefmt "%y%m%d %H%M" --format "%T %w %f" \
        -e create,modify,delete,close_write,attrib $srcdir \
        | while read DATE TIME DIR FILE; do
    fileName=${DIR}${FILE}
    rsync -azv --password-file=/etc/rsyncd.passwd $srcdir \
    myuser@${syncServer}::${syncShareName} &>/dev/null
    if [ $? -eq 0 ]; then
        echo "At ${TIME} on ${DATE}, file ${fileName} was backde up by rsync." \
        >> /var/log/backup.log
    fi
done



3) 给予脚本可执行权限
?
1
# chmod u+x /root/mydatasync.sh



?
1
  



如果想让次文件同步备份在开机时自动启动,可以如下方式进行:
?
1
# echo "/root/mydatasync.sh" >> /etc/rc.d/rc.local




实际测试心得:
通过以上方式,实现了在源端新增了文件或目录,以及文件内容发生修改时,均被同步更新到了备份服务器端。如果在源端删除了某个文件或目录,则备份服务器端不会作对应的删除。所以这种同步备份,不适合要求源端和服务器端资源严格一致的场景!                   



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-26213-1-1.html 上篇帖子: Python + Django 配置后台管理系统 下篇帖子: ubuntu下制作u盘启动盘安装win7 主机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表