rsync+inotify-tools实现文件的实时同步

rsync简介:

   Rsync 是一个远程数据同步工具,使用所谓的“Rsync 演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsync server 的机器也叫 backup server,一个 Rsync server 可同时备份多个 client 的数据;也可以多个Rsync server 备份一个 client 的数据。Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。Rsync server 会打开一个873的服务通道(port),等待对方 Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份

inotify-tools简介:

   inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。现在介绍一下它的使用方法


环境部署:

  inotify_slave  42.159.246.48:57893      数据备份端

  inotify_master  42.159.246.48:57892      源数据端

  

一、部署数据备份端:

1. 备份端部署rsync服务:

[root@WEB2 ~]#yum -y install rsync

[root@WEB2 ~]#useradd rsync -s /sbin/nologin  -M

[root@WEB2 ~]#mkdir -p /cmsresoure/p_w_picpath/backup

[root@WEB2 ~]#chown rsync:rsync /cmsresoure/p_w_picpath/backup

2. 添加配置文件/etc/rsyncd.conf 

[root@WEB2 ~]#vim /etc/rsyncd.conf

##################################################################################

##rsyncd.conf start##

uid = rsync

gid = rsync

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[backup]

path = /cmsresoure/p_w_picpath/backup/

ignore errors

read only = false

list = false

hosts allow = *

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

#rsync_config_______________end

##################################################################################                                

3. 配置虚拟用户的密码文件并启动服务

[root@WEB2 ~]# echo "rsync_backup:leesir" >/etc/rsync.password

[root@WEB2 ~]# chmod 600 /etc/rsync.password

[root@WEB2 ~]# rsync --daemon

[root@WEB2 ~]# ps -ef | grep rsync

4. 通过源数据端测试推送

  [root@web1 ~]# echo "leesir" >/etc/rsync.password #注意:这里只要写密码即可,切记。

  [root@web1 ~]# chmod 600 /etc/rsync.password

[root@web1 ~]# rsync -avzlh  inotify.sh [email protected]::backup --password-file=/etc/rsync.password

在源数据端推送后,去数据备份端检查是否推送成功。

二、源数据端部署

1. 查看当前系统是否支持inotify

[root@web1 ~]# ll /proc/sys/fs/inotify/

total 0

-rw-r--r-- 1 root root 0 Oct  8 18:54 max_queued_events

-rw-r--r-- 1 root root 0 Oct  8 18:54 max_user_instances

-rw-r--r-- 1 root root 0 Oct  8 18:54 max_user_watches


Remarks:

    #显示这三个文件则证明支持。

    /proc/sys/fs/inotify/max_queued_evnets      

    #表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

    /proc/sys/fs/inotify/max_user_instances 

    #表示每一个real user ID可创建的inotify instatnces的数量上限。

    /proc/sys/fs/inotify/max_user_watches 

    #表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

    例如: echo 30000000 > /proc/sys/fs/inotify/max_user_watches


2. 部署inotify服务:

[root@web1 ~]#  yum -y install inotify-tools

[root@web1 ~]#  rpm -qa  | grep inotify-tools

inotify-tools-3.14-1.el6.x86_64

[root@web1 ~]#  vim inotify.sh

################################################################################## 

#!/bin/bash

#

#2015.10.8

#

DESTHOST=42.159.246.48

SRCDIR=/cmsresoure/p_w_picpath/backup/

PASSWD=/etc/rsync.password

USER=rsync_backup


inotifywait -mr  --timefmt '%d/%m/%y  %H:%M'   --format  '%T   %w    %f' -e close_write,modify,create,attrib $SRCDIR | while read DATE TIME DIR FILE;do


        FILECHANGE=${DIR}${FILE}


        rsync -avztopglH $SRCDIR  $USER@${DESTHOST}::backup --password-file=$PASSWD  &>/dev/null && \

        echo "At ${TIME} on ${DATE}, file $FILECHANGE was  backed up via rsync"  >> /var/log/p_w_picpath.log

done

################################################################################## 


3. 测试脚本创建文件测试:

[root@web1 ~]# more  /home/user/touch_file.sh 

################################################################################## 

#!/bin/sh

#

#2015.10.8

#

#Create 5 100K files, file name is a random number

#

#


for ((i=1;i<6;i++))

do


dd if=/dev/zero of=/cmsresoure/p_w_picpath/backup/$(sha1sum<<<$RANDOM|cut -b 5-10)  bs=100k count=1

echo "touch $i done"

sleep 3

done

echo "the script is done" 

################################################################################## 

[root@web1 ~]# echo "*/30 * * * * /bin/bash /home/user/touch_file.sh > /dev/null 2>&1" >> /etc/cronteb

[root@web1 ~]# sh inotify.sh &             #将脚本加入后台执行

Setting up watches.  Beware: since -r was given, this may take a while!

Watches established.


 

三. 实时同步测试

1. 源数据端操作:

[root@web1 ~]# sh /home/user/touch_file.sh 

################################################################################## 

1+0 records in

1+0 records out

102400 bytes (102 kB) copied, 0.000441594 s, 232 MB/s

touch 1 done

1+0 records in

1+0 records out

102400 bytes (102 kB) copied, 0.000603492 s, 170 MB/s

touch 2 done

1+0 records in

1+0 records out

102400 bytes (102 kB) copied, 0.000548994 s, 187 MB/s

touch 3 done

1+0 records in

1+0 records out

102400 bytes (102 kB) copied, 0.000423695 s, 242 MB/s

touch 4 done

the script is done

################################################################################## 

[root@web1 ~]# ls /cmsresoure/p_w_picpath/backup/

039f90  15aaf2  1c2d4b  3b079d 


2. 数据备份端检查:

[root@WEB2 ~]# cd /cmsresoure/p_w_picpath/backup/

[root@WEB2 backup]# ls

039f90  15aaf2  1c2d4b  3b079d 


四. 维护:

1.  设置在备份端监控Rsync服务的脚本:

[root@WEB2 shell]# vim rsync_check.sh

##################################################################################

#!/bin/bash

#

#2015.10.8

#

#The script will check the Rsync service, if you find that Rsync will restart the service.


RSYNC_CHECK=`netstat -npl | grep -c rsync`    


if [ "$RSYNC_CHECK" -eq "0" ];

then

/usr/bin/rsync --daemon

fi

##################################################################################

[root@web1 shell]# echo "*/2 * * * * /bin/bash /shell/rsync_check.sh >/dev/null 2>&1"  >>/etc/crontab

Remarks:

      将脚本加入到计划任务中,没两分钟检查一次rsync是否正常运行


2.  设置在源数据端检查inotify服务的脚本:

[root@web1 shell]# vim check_inotify.sh

##################################################################################

#!/bin/bash

#

#2015.10.9

#

#the script will to check the inotify server

#

#


INOTIFY=/shell/inotify.sh

CHECK_INOTIFY=`ps -ef | grep -c inotify.sh`


if [ "$CHECK_INOTIFY"  -eq "1" ];

then

/bin/bash  "$INOTIFY"  >/dev/null 2>&1

fi

##################################################################################

[root@web1 shell]# echo  "*/2 * * * * /bin/bash /shell/check_inotify.sh >/dev/null 2>&1"  >> /etc/crontab 


五。测试结果:

   rsync+inotify-tools同步效果:rsync可以完全实时同步监控的文件夹,并输出同步日志。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章