inotify是Linux核心子系统之一,做为文件系统的附加功能,它可监控文件系统并将异动通知应用程序。
rsync 是一个相当棒的异地备份系统的指令,可以达到类似镜像(mirror)的功能
rsync 第一次备份的时候需要花费比较长的时间,因为首次要备份所有的文件。但是再次备份文件的时候,仅会复制有差异的数据。这个很重要的哈!
因为 rsync 是通过 SSH 来传输数据的,所以你可以针对 某个用户制作出免密码登录的SSH密钥!如此一来,往后异地备份系统就能够自动地以 crontab 来进行备份了。
利用inotify和rsync实时同步文件
yum install inotify-tools
利用这两者,将一个同步shell script 写成 /etc/init.d/inotify_rsync 服务。
可以直接利用 service inotify_rsync start | stop 开关。
#!/bin/bash
#192.168.2.222:/var/www/img/ad --- rsync to ---> /var/www//img(192.168.1.(11|22|33))
### BEGIN INIT INFO
# Provides: inotify_rsync
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: inotifywait rsync
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: inotify_rsync script
# Description: inotify_rsync script.
### END INIT INFO
case $1 in
start)
inotifywait --exclude ^.*\.filepart$ -mrq -e create,delete,modify,move /var/www/img/ad | while read line;
do
for ip in 192.168.1.11 192.168.1.22 192.168.1.33
do
/usr/bin/rsync --exclude=.* --exclude=*.swp --exclude=*.filepart -avzu --progress --delete /var/www/img/ad root@$ip:/var/www/img/ >> /dev/null 2>&1;
done
done &
;;
stop)
pid_a=`ps -ef | grep inotifywait | grep -v grep | awk '{print $2}'`;
kill -9 $pid_a && echo "inotify stop[OK]" || echo "inotify stop[failed]";
;;
esac
只要/var/www/img/ad 文件夹下有变化(create,delete,modify,move)就同问更新的文件到远程主机对应的目录下面。
--exclude=xxx.xxx,不仅代表该目录下的这个目录,还代表了子目录。只要包含这个名字就排除。
之后便启动脚本,做个测试,可以的话就加入开机自启动(chkconfig)。
第二种利用rsync同步方法
这种方法需要区分同步端操作和被同步端操作。
同步端:
yum install rsync inotify-tools #安装两个软件
#写一个同步脚本
vim /root/rsynccc.sh
#!/bin/bash
/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' --exclude '.*\.logs' -e modify,delete,create,attrib /var/www/apadv | while read files
do
/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync/rsyncd.passwd --exclude=/var/www/apadv/t/config.php /var/www/apadv/* staff@192.168.1.11::zhang
#注意staff@192.168.1.11::zhang, 这个zhang是被同步端定义的rsyncd.conf中定义的名称,相当于把zhang中定义的路径拿到来用。
#echo "${files} to ${host1} was rsynced" >>/var/log/rsync/rsync.log 2>&1
done
(备注:secrets file = /etc/rsync/rsyncd.passwd)
3. vi /etc/rsync/rsyncd.passwd (注意没用户,只有密码)
123456 #把staff用户密码写入此文件
4,chmod 600 /etc/rsync/rsyncd.passwd #必须这个权限才能读取
开启此脚本:
nohup ./rsynccc.sh&
如果有需要可以写一个检测脚本
加入开机自启:
chmod u+x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
nohup /root/rsynccc.sh&
被同步端:
vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/log/rsync/rsyncd.pid
lock file = /var/log/rsync/rsync.lock
log file = /var/log/rsync/rsyncd.log
[zhang] #注意这个
path = /var/www/apadv_new/
comment = web file
ignore errors
read only = no
write only = no
hosts allow = 192.168.2.22
hosts deny = *
list = false
uid = root
gid = root
auth users = staff
secrets file = /etc/rsync/rsyncd.passwd
2, vi /etc/rsync/rsyncd.passwd (注意有用户和密码)
staff:123456
chmod 600 /etc/rsync/rsyncd.passwd (一定注意权限600和root所属)
chown root:root /etc/rsync/rsyncd.passwd
启动客户端:
rsync --daemon --config=/etc/rsyncd.conf
加入开机自启:
chmod u+x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
rsync --daemon --config=/etc/rsyncd.conf