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 1>/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参数给去掉,就可以解决这个问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351