Linux下rsync+inotify实现实时文件自动同步

背景随着时代的发展,手工的同步文件的功能已经不适合为高效的现代化企业的服务了。

rsync的局限性:

1、对于大的文件(百万级、千万级的)同步耗时。
2、不能实时的检测,rsync是根据Linux守护进程的方式进行触发同步的,这过程有很大的时间差。导致出现问题的时候可能无法完全的恢复数据。
3、同步笨重,同步一次就是全部同步的了,不会自动只同步更新的那点。

所以rsync+inotify的实现可以更加高效,自动化的实现文件的实时同步,能够大大的提高工作的效率,有效的减少手工操作的失误。

inotify的简介

  Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

是一个非常好的辅助性工具软件,后期本博客还会有更加多与inotify嵌合的功能发布!

一、需求环境

  Ceotos 6.5 内核2.6.32-431.el6.x86_64

虚拟机环境下

inotify服务器:192.168.0.244/24          (即主机B)

备用服务器:192.168.0.144/24            (即主机A) 

rsync-3.1.2.tar.gz

inotify-tools-3.14.tar.gz

二、搭建rsync+inotify环境

  注:在原来的rsync服务器上面即 inotify服务器:192.168.0.244/24 上面开始搭建

1、先安装好inotify包

  wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  

tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14

 ./configure --prefix=/usr/local/inotify-3.14

make && make install

2、创建监控脚本inotify.sh

#!/bin/bash
#para
host01=192.168.0.144  #rsync服务器地址
src=/backup        #本地监控的目录
dst=backup         #rsync服务器的模块名称
user=nowview      #rsync服务器的虚拟用户
rsync_passfile=/etc/rsyncd.password   #本地调用rsync服务的密码文件
inotify_home=/usr/local/inotify-3.14    #inotify的安装目录
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Folder"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
#  rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0

  脚本创建完毕,丢给后台运行。(开机启动的话放到rc.local文档即可)

sh inotify.sh &

  查看年一下进程

[root@主机B-244 /]# ps -ef |grep inotify
root       1793      1  0 17:53 ?        00:00:00 sh inotify.sh
root       1806   1793  0 17:53 ?        00:00:00 /usr/local/inotify-3.14/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f -e close_write,delete,create,attrib /backup
root       1807   1793  0 17:53 ?        00:00:00 sh inotify.sh
root       2032   1843  0 17:58 pts/0    00:00:00 grep --color inotify

  inotify的配置基本如上,更多的功能参数请参考上面的inotify文档网址。

三、测试

  现在,在inotify服务器上面可以看到

[root@主机B-244 backup]# pwd
/backup
[root@主机B-244 backup]# ls
1    108  117  126  135  144  153  162  171  180  19   199  27  36  45  54  63  72  81  90  asound.conf                krb5.conf       pm-utils-hd-apm-restore.conf
10   109  118  127  136  145  154  163  172  181  190  2    28  37  46  55  64  73  82  91  cgconfig.conf              ld.so.conf      request-key.conf
100  11   119  128  137  146  155  164  173  182  191  20   29  38  47  56  65  74  83  92  cgrules.conf               libaudit.conf   resolv.conf
101  110  12   129  138  147  156  165  174  183  192  200  3   39  48  57  66  75  84  93  cgsnapshot_blacklist.conf  libuser.conf    rsyslog.conf
102  111  120  13   139  148  157  166  175  184  193  21   30  4   49  58  67  76  85  94  dracut.conf                logrotate.conf  sestatus.conf
103  112  121  130  14   149  158  167  176  185  194  22   31  40  5   59  68  77  86  95  gai.conf                   mke2fs.conf     sudo.conf
104  113  122  131  140  15   159  168  177  186  195  23   32  41  50  6   69  78  87  96  grub.conf                  mtools.conf     sudo-ldap.conf
105  114  123  132  141  150  16   169  178  187  196  24   33  42  51  60  7   79  88  97  gssapi_mech.conf           nfsmount.conf   sysctl.conf
106  115  124  133  142  151  160  17   179  188  197  25   34  43  52  61  70  8   89  98  host.conf                  nsswitch.conf   xinetd.conf
107  116  125  134  143  152  161  170  18   189  198  26   35  44  53  62  71  80  9   99  idmapd.conf                ntp.conf        yum.conf

  我已经在根目录下创建了一个backup目录,立刻创建了如上内容

由于inotify脚本已经在后台运行了,正在实时的监控着这个目录的变化

下面到备用服务器(即原rsync服务器)上面去看看原来的rsync的模块bauckup的路径/home/backup下的情况

[root@主机A-144 backup]# pwd
/home/backup
[root@主机A-144 backup]# ll
total 0
[root@主机A-144 backup]# 

  目前还有同步过来,需要时间

  等待......

  再看

[root@主机A-144 backup]# ls
1    108  117  126  135  144  153  162  171  180  19   199  27  36  45  54  63  72  81  90  asound.conf                krb5.conf       pm-utils-hd-apm-restore.conf
10   109  118  127  136  145  154  163  172  181  190  2    28  37  46  55  64  73  82  91  cgconfig.conf              ld.so.conf      request-key.conf
100  11   119  128  137  146  155  164  173  182  191  20   29  38  47  56  65  74  83  92  cgrules.conf               libaudit.conf   resolv.conf
101  110  12   129  138  147  156  165  174  183  192  200  3   39  48  57  66  75  84  93  cgsnapshot_blacklist.conf  libuser.conf    rsyslog.conf
102  111  120  13   139  148  157  166  175  184  193  21   30  4   49  58  67  76  85  94  dracut.conf                logrotate.conf  sestatus.conf
103  112  121  130  14   149  158  167  176  185  194  22   31  40  5   59  68  77  86  95  gai.conf                   mke2fs.conf     sudo.conf
104  113  122  131  140  15   159  168  177  186  195  23   32  41  50  6   69  78  87  96  grub.conf                  mtools.conf     sudo-ldap.conf
105  114  123  132  141  150  16   169  178  187  196  24   33  42  51  60  7   79  88  97  gssapi_mech.conf           nfsmount.conf   sysctl.conf
106  115  124  133  142  151  160  17   179  188  197  25   34  43  52  61  70  8   89  98  host.conf                  nsswitch.conf   xinetd.conf
107  116  125  134  143  152  161  170  18   189  198  26   35  44  53  62  71  80  9   99  idmapd.conf                ntp.conf        yum.conf
[root@主机A-144 backup]# pwd
/home/backup

  这些内容已经同步过来了。

四、总结

   关于这个inotify.sh它的这个监控,触发问题。

目前根据我的测试得出的结论是这样的,它的实时同步是建立在当这个被监控的目录/back  一旦生成有文件或者生成任何的东西的情况下,这个脚本就会立刻触发同步更新。当然会根据文件大小、网络以及其他的因素,它的同步会有所时间的差别。

总的来说是inotify服务器目录变化,那么rsync服务器的目录就跟着变化(同步),反过来就不可以了。不过,即便这样已经是满足了现代企业日常的需求了。

Rsync 的详细介绍请点这里
Rsync 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2017-12/149355.htm