使用rsync进行主机间数据同步(2)

以上是将slave的node2模块对应的目录同步到master的目录下,如果要将master的目录同步到slave的node2模块对应的目录下,则使用以下命令:

$ rsync -avzP /data/node1/ 192.168.1.40::node2

以上完成后,我们就可以进行同步了,为了方便,我们可以把同步命令写成一个脚本。rsync有一些配置参数,可以直接输入命令rsync来查看。比如–delete选项表示,会同步删除的文件,比如源主机没有文件a,而目标主机有,则文件a将会从目标主机上删除。

如果你不需要实时性,则可以在每次需要同步的时候,手动运行一下该脚本。

如果你需要实时性,但不需要特别强,则可以使用 crontab 设置一个定时任务来自动同步。

如果你需要很强的实时性,则需要inotify的支持。

inotify

使用inotify之后,只要文件有任何变动,就会触发inotify,因此inotify基本可以达到实时的效果。

inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。

inotify安装完成之后会有两个命令,inotifywait 和 inotifywatch。inotifywait用于等待文件或者文件集上的一个特定事件,可以监控任何文件或者目录位置,并且可以递归地监控整个目录树;inotifywatch 用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

安装 $ cd /tmp $ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz --no-check-certificate $ tar zxvf inotify-tools-3.14.tar.gz $ cd inotify-tools-3.14 $ ./configure&&make&&make install $ ln -sv /usr/local/lib/libinotify* /usr/lib/ $ ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

以上安装的是linux版本的,如果你是windows系统,可以安装inotify-win(https://github.com/thekid/inotify-win)。

编写测试脚本 #!/bin/bash src=https://www.linuxidc.com/tmp/test/ # directory to monitor /usr/local/bin/inotifywait -rmq -e modify $src | while read event do echo "hello" >> 1.txt done 做成开机启动 $ chmod u+x /tmp/mon.sh $ echo "nohup /bin/bash /tmp/mon.sh &" >> /etc/rc.d/rc.local $ nohup /bin/bash /tmp/mon.sh &

这时候只要/tmp/test/一有改动,就会触发inotifywait,运行echo命令。

同步脚本 #!/bin/bash host=192.168.1.40 data_dir=/data/node1/ dst=node2 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files do #rsync -avzP $host::$dst $data_dir rsync -avzP --delete --progress $data_dir $host::$dst echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 done

以上让inotifywait监听/data/node1/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%T %w%f%e的格式输出。

inotifywait的输出结果,作为 while read files的输入。这里的脚本比较粗糙,因为每次有文件改动,inotifywait就会输出一行,改行表示有改动的文件。之后执行do和done之间的操作,调用rsync进行同步(全目录扫描,而不是只同步单个文件)。因此如果有10个文件改动,rsync将会被调用10次,从而造成性能上的损耗。因此对于有兴趣的同学,可以想想如何优化这个脚本,以获得更高的同步性能。

$ chmod u+x inotify_rsync.sh $ bash inotify_rsync.sh & [1] 4533 $ ps -ef | grep inoti | grep -v "grep" root 4533 1880 0 18:02 pts/1 00:00:00 bash inotify_rsync.sh root 4534 4533 0 18:02 pts/1 00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e modify,delete,create,attrib /data/node1/ root 4535 4533 0 18:02 pts/1 00:00:00 bash inotify_rsync.sh

inotifywait 的一些参数可能根据系统有所不同,请通过inotifywait命令查阅下相关参数及其意义。

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d4882998adefbfb3edb7a103e4e2af31.html