这里参考这篇文章: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参数给去掉,就可以解决这个问题。