rsync+inotify实现服务器之间文件实时同步

这里参考这篇文章:http://blog.csdn.net/linuxlsq/article/details/51768731,
以及这篇文章:http://blog.51cto.com/dl528888/771533
特别感谢!


主服务器(server端)

其中主服务器需要安装rsync与inotify,主服务器作为server,向备份服务器client传输文件

  • 安装rsync
[root@nginx ~]# cd /usr/src/  
[root@nginx src]# ll  
total 16  
drwxr-xr-x 2 root root 4096 Jan 26  2010 debug  
drwxr-xr-x 2 root root 4096 Jan 26  2010 kernels  
[root@nginx src]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@nginx src]# tar zxvf rsync-3.0.9.tar.gz  
[root@nginx src]# cd rsync-3.0.9  
[root@nginx rsync-3.0.9]# ./configure --prefix=/usr/local/rsync  
[root@nginx rsync-3.0.9]# make  
[root@nginx rsync-3.0.9]# make install  

如果网站链接已经过期,可以在Linux上自行wget下载.tar.gz文件,
也可以可以自行到http://download.csdn.net/下载指定的资源到windows上,
再通过secureCRT传到Linux上,这里需要

yum -y install lrzsz,
从服务端发送文件到客户端:sz filename ,下载的路径在CRT的Options>>Session Options>>X/Y/Zmodem
从客户端上传文件到服务端:rz,上传路径在服务器当前路径

或者由其他的Linux主机上SCP传到当前Linux主机上,命令格式

scp local_file remote_username@remote_ip:remote_folder 
scp local_file remote_username@remote_ip:remote_file 
scp local_file remote_ip:remote_folder 
scp local_file remote_ip:remote_file 
  • 建立密码认证文件
[root@nginx rsync-3.0.9]# cd /usr/local/rsync/  
[root@nginx rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.passwd   

其中rsync-pwd为密码,rsync.passwd文件即为密码文件,密码和密码文件的名字都可以自行设置

无论是为了安全,还是为了避免出现以下错误,密码文件都需要给600权限

[root@nginx rsync]# chmod 600 rsync.passwd  
  • 安装inotify
[root@nginx rsync]# cd /usr/src/  
[root@nginx src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  
[root@nginx src]# tar zxvf inotify-tools-3.14.tar.gz  
[root@nginx src]# cd inotify-tools-3.14  
[root@nginx inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@nginx inotify-tools-3.14]# make  
[root@nginx inotify-tools-3.14]# make install  
  • 创建rsync复制脚本

此项功能主要是将server端的目录/tmp/test里的内容,如果修改了(无论是添加、修改、删除文件)能够通过inotify监控到,并通过rsync实时的同步给client的/tmp里,这样,client的/tmp里也同样有一个/tmp/test目录。
其中host是client的ip,src是server端要实时监控的目录,
des是认证的模块名,需要与client一致(des不是客户端的目录,客户端的目录会在客户端配置文件的[web]模块里面指定),
user是建立密码文件里的认证用户(也在[web]模块里指定)

#!/bin/bash  
host=10.10.10.10
src=/tmp/test         
des=web 
user=root 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read file
do 
    /usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des 0/dev/null 2>&1 
    echo "${file} was rsynced" >>/root/rsync.log 2>&1  
done

如果把rsync.log的放到tmp(备份的目录)或发送一直复制的问题,所以建议各位把rsync的日志放到其他的目录下(非备份目录),例如这里的/root/rsync.log
把这个脚本命名为rsync.sh,放到监控的目录里,比如我的就放到/tmp下面,并给予764权限,然后运行这个脚本

[root@nginx tmp]# chmod 764 rsync.sh 
[root@nginx tmp]# sh /tmp/rsync.sh & 
  • 我们还可以把rsync.sh脚本加入到开机启动项里
[root@nginx tmp]# echo "/tmp/rsync.sh" >> /etc/rc.local

但是这里可能会因为我们退出tty而造成这个后台任务中断,可以采用这里的方法:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

[root@nginx tmp]# (/tmp/rsync.sh >/dev/null 2>&1 &)

这样这个后台任务的PPID就为1了,和crond一样

[root@nginx tmp]# ps -ef |grep crond
root      38533      1  0 Dec04 ?        00:00:01 crond
[root@nginx tmp]# ps -ef |grep rsync
root      45117      1  0 18:07 pts/1    00:00:00 /bin/bash /tmp/rsync.sh
root      45119  45117  0 18:07 pts/1    00:00:00 /bin/bash /tmp/rsync.sh

请记住,只有在备份服务器client端的rsync安装并启动rsync之后,再启动rsync.sh脚本,否则有时候会满屏出现:

rsync: failed to connect to 192.168.10.221: Connection refused (111)  
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]  

备份服务器(client)

  • 安装rsync(备份服务器只安装rsync)
[root@nginx-backup ~]# cd /usr/src/  
[root@nginx-backup src]# ll  
total 16  
drwxr-xr-x 2 root root 4096 Jan 26  2010 debug  
drwxr-xr-x 2 root root 4096 Jan 26  2010 kernels  
[root@nginx-backup src]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@nginx-backup src]# tar zxvf rsync-3.0.9.tar.gz  
[root@nginx-backup src]# cd rsync-3.0.9  
[root@nginx-backup rsync-3.0.9]# ./configure --prefix=/usr/local/rsync  
[root@nginx-backup rsync-3.0.9]# make  
[root@nginx-backup rsync-3.0.9]# make install  
  • 建立用户与密码认证文件
[root@nginx-backup rsync-3.0.9]# echo "root:rsync-pwd" > /usr/local/rsync/rsync.passwd 
[root@nginx-backup rsync]# chmod 600 rsync.passwd 

请记住,在server端建立的密码文件,只有密码,没有用户名;而在备份服务端client里建立的密码文件,用户名与密码都有(用户名要和[web]模块里面一致,密码要和服务器端脚本中的密码一致)

  • 建立rsync配置文件
uid = root 
gid = root 
use chroot = no 
max connections = 10 
strict modes = yes 
pid file = /var/run/rsyncd.pid  
lock file = /var/run/rsync.lock  
log file = /var/log/rsyncd.log  
[web]  
path = /tmp/  
comment = web file  
ignore errors  
read only = no 
write only = no 
hosts allow = 10.10.10.10 
hosts deny = *  
list = false 
uid = root 
gid = root 
auth users = root 
secrets file = /usr/local/rsync/rsync.passwd

这里的path = /tmp/就是指目的目录,服务器的文件会备份到客户端的这个目录里,
hosts allow = 10.10.10.10 ,这里的hosts allow就是你服务器的IP地址,
auth users = root ,这里的root就是上一步
echo "root:rsync-pwd" > /usr/local/rsync/rsync.passwd 中的root,
[web]是server服务端里的认证模块名称,需要与主服务器里的一致,以上的配置为我的自己服务器里的配置,以供参考。
把配置文件命名为rsync.conf,放到/usr/local/rsync/目录里

  • 启动rsync
[root@nginx-backup rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf 

如果出现以下问题:

/usr/local/rsync/bin/rsync: error while loading shared libraries: libiconv.so.2: cannot open shared object file:
No such file or directory, 

是因为动态函数库没有加载到内存当中,可以采用下面方法解决

[root@nginx-backup rsync]# whereis libiconv.so.2  
libiconv.so: /usr/local/lib/libiconv.so.2 /usr/local/lib/libiconv.so  

找到所需模块所在的目录,然后把此目录添加到/etc/ld.so.conf里,并更新库文件

[root@nginx-backup rsync]# echo "/usr/local/lib/" >> /etc/ld.so.conf  
 [root@nginx-backup rsync]# ldconfig  
  • 我们可以把rsync脚本加入到开机启动项里
[root@nginx-backup rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local 
  • BTW:在rsync+inotify这种备份方法的时候,遇到了一个问题,那就是主服务已经给备用服务同步完数据了,但主服务器磁盘看见满了,需要把已经备份的文件删除,但同时在备份服务器里保留主服务器里的文件,
    也就是说主服务器里删除文件的时候,备份服务器里不跟着删除文件,我查看了很多英文文档,测试了很多遍,最后找到了一个解决方法,那就是在主服务器里,把rsync.sh这个脚本里第9行的--delete参数给去掉,就可以解决这个问题。

你可能感兴趣的:(rsync+inotify实现服务器之间文件实时同步)