现实中,服务器可能会因为各种原因而crash掉,从而造成数据丢失或者服务的暂时不可用。为了提高服务的可用性以及数据的安全性,就需要对数据进行备份,以便数据恢复或者服务的动态切换(将访问请求动态重定向到备份服务器)。
常见的备份方法是定时的rsync任务或者远程拷贝。但这种方式,如果定时的间隔较大,那么服务器宕掉后,还是会丢失部分数据,动态切换的服务也不是宕机前的最新状态。为了支持实时数据同步,Linux 2.6.13 内核中新引入文件系统变化通知机制inotify,一旦对文件系统有改动,就会触发相关事件任务。通过结合rsync,inotify能够很好地完成实时同步任务。
主服务器:1.1.1.1 备份服务器:0.0.0.0
配置步骤:
1. 主服务器,备份服务器上安装rsync:
sudo yum install rsync
2. 主服务器上安装inotify-tools:
sudo yum install inotify-tools
3. 备份服务器上添加配置文件/etc/rsyncd.conf
readonly=no
chroot=no
uid=root
gid=root
hosts allow=1.1.1.1
hosts deny=0.0.0.0/32
max connections=10
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
auth users=tongbu
secrets file=/etc/rsync.pass
[website1]
path=/home/yongfeng/apps/website1.org/webroot/upload
[website2]
path=/home/yongfeng/apps/website2.com/webroot/upload
[website3]
path=/home/yongfeng/apps/website3.com/webroot/upload
以及配置文件/etc/rsync.pass
tongbu:somesecurepassword
给密码文件赋权:
sudo chmod 400 /etc/rsync.pass
(注:tongbu就是用户名,与rsyncd.conf中auth users的值一致。somesecurepassword是密码,会在后面主服务器上的配置密码文件用到)
4. 在备份服务器上创建需要的目录:
sudo mkdir -p /home/yongfeng/apps/website1.org/webroot/upload
sudo mkdir -p /home/yongfeng/apps/website2.com/webroot/upload
sudo mkdir -p /home/yongfeng/apps/website3.com/webroot/upload
5. 在主服务器上添加配置文件/etc/rsync-client.pass:
somesecurepassword
赋权限:
chmod 600 /etc/rsync-client.pass
6. 在主服务器上添加要执行的脚本/home/autoscript/rsyncInotify.sh:
#!/bin/sh
src[0]='/var/www/apps/website1.org/webroot/upload,website1'
src[1]='/var/www/apps/website2.com/webroot/upload,website2'
src[2]='/var/www/apps/website3.com/webroot/upload,website3'
for item in ${src[@]}; do
fromdir=`echo $item | awk -F"," '{print $1}'`
module=`echo $item | awk -F"," '{print $2}'`
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T%w%f' --event modify,delete,move,create,attrib ${fromdir} | while read file event
do
echo $event'-'$file
rsync -avz --delete --password-file=/etc/rsync-client.pass ${fromdir}'/' tongbu@0.0.0.0::${module}
echo "*******************************"
done &
done
赋可执行权限:
sudo chmod +x rsyncInotify.sh
7. 在备份服务器的防火墙中添加规则以允许rsync服务请求---可通过直接编辑文件/etc/sysconfig/iptables,在文件中添加一行内容:
-A INPUT -s 1.1.1.1 -p tcp -m tcp --dport 873 -j ACCEPT
8. 备份服务器启动rsync服务:
sudo /usr/bin/rsync --daemon
9. 主服务器启动rsync+inotify服务:
sudo /home/autoscript/tongbu/rsyncInotify.sh
10. 在备份服务器上将rsync服务设置为开机自启动服务---直接编辑配置文件/etc/rc.d/rc.local,添加一行内容:
/usr/bin/rsync --daemon
11. 在主服务器上将rsyncInotify.sh设置为开始自启动---直接编辑配置文件/etc/rc.d/rc.local,添加一行内容:
/home/autoscript/tongbu/rsyncInotify.sh >> /home/autoscript/tongbu/tongbu.log
存在的问题
1.由于rsync命令并没有提供start, stop或者restart等选项,所以想关闭rsync服务,可直接使用sudo pkill rsync杀死rsync服务进程(额,这样是不是过分了点?但我想到的最简便的方法就是这个了)
2.同样rsyncInotify.sh也存在这样的问题,即使使用sudo pkill rsyncInotify.sh杀死了进程还不够,因为rsyncInotify.sh脚本中调用了inotifywait命令,所以还得sudo pkill inotifywait,否则可能会因为inotifywait进程开得太多,而无法正常运行rsyncInotify.sh。
参考文献