NFS+inotify+rsync实现实时同步
在 Linux 中实时同步文件的方法。
描述
本文主要是讲在本地通过inotify+rsync进行增量备份,至于异地备份采用的是上篇文章中提到的NFS.
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
rsync安装及配置
安装rsync
这里主要讲源码安装rsync
wget -c https://download.samba.org/pub/rsync/rsync-3.1.3.tar.gz
tar -zxvf rsync-3.1.3.tar.gz
cd rsync-3.1.3
./configure
make
make install
其实linux发行版都自带了rsync.
配置rsync
rsync配置文件是/etc/rsyncd.conf
,默认这个文件不存在,所以需要自行创建.
sudo vim /etc/rsyncd.conf
在里面添加
motd file=/etc/rsyncd.welcome # 编辑欢迎信息
uid = nobody
gid = nobody
user chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[backup]
path = /home/xujh/software/hexo # 备份源
ignore errors
read only = no
write only = no
list = false
hosts allow = *
uid = root
gid = root
auth users = backup
secrets file = /etc/rsyncd.passwd # auto users的密码保存文件
编辑密码保存文件:
sudo vim /etc/rsyncd.passwd
在里面添加
backup:Rsync123
给密码保存文件赋予权限:
sudo chmod 600 /etc/rsyncd.passwd
编辑rsync欢迎信息(非必须):
sudo vim /etc/rsyncd.welcome
在里面添加自定义信息:
Hi,Rsync!
启动rsync
sudo /usr/bin/rsync --daemon
inotify安装及配置
安装inotify
sudo apt-get install inotify-tools
编写自动同步脚本
创建日志记录目录:
mkdir -p /home/xujh/rsynclog
创建需要排除的目录list
echo "public" >>/home/xujh/software/hexo/exclude.list
脚本内容如下:
vim /home/xujh/software/hexo/rsyncInotify.sh
添加如下内容:
#!/bin/bash
# rsync+inotify本地异地实时备份
# author:xujh
# cd $des目的是挂载NFS共享目录,结合上篇autofs配置
src=/home/xujh/software/hexo
des=/home/xujh/hexobak/
des1=/home/xujh/docNFS/hexobak/
cd $des1
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,create,delete,attrib,close_write,move $src | while read files
do
/usr/bin/rsync -vzrtopg --exclude-from="/home/xujh/software/hexo/exclude.list" $src $des
/usr/bin/rsync -vzrtopg --exclude-from="/home/xujh/software/hexo/exclude.list" $src $des1
echo "${files} was rsynced" >> /home/xujh/rsynclog/rsyncInotify.log 2>&1
done
TIP
–exclude-from排除exclude.list里的目录不同步.
后台运行同步脚本
chmod 755 /home/xujh/software/hexo/rsyncInotify.sh
sh /home/xujh/software/hexo/rsyncInotify.sh &
开启启动rsync和运行rsyncInotify.sh
echo “/usr/bin/rsync –daemon” >>/etc/rc.local
echo “/home/xujh/software/hexo/rsyncInotify.sh &” >>/etc/rc.local
本方案不足之处:
- 功能没有sersync强大
- 如果把rsyncInotify.sh放在后台执行就会让autofs失去了作用,因为会一直挂载NFS共享目录
- 因为我的备份主要是些静态文件,且我并不想一直让rsyncInotify.sh在后台运行,所以我的做法是
- 手动执行rsyncInotify.sh,等备份完停止脚本,这样autofs就能起到作用了.
简单描述下我的操作步骤:
- 博客写完,执行hexod发布博客;
- 通过hexor(执行rsyncInotify.sh的别名)执行同步;
- 通过hexoe(echolog.sh别名)写入到src/backup.log,目的是触发inotifywait。
附上echolog.sh
#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "backup at ${time} " >>/home/xujh/software/hexo/backuplog.txt
定义别名
vim ~/.bashrc
添加
alias pycharm='nohup ~/software/pycharm-2018.1.2/bin/pycharm.sh > pycahrmout.file 2>&1 &'
alias hexod='cd ~/software/hexo && bash hexod.sh'
alias hexou='cd ~/software/hexo && bash getImgName.sh'
alias hexor='sh /home/xujh/software/hexo/rsyncInotify.sh'
alias hexoe='sh /home/xujh/software/hexo/echolog.sh'
暂时还没想到更好的解决办法了,后续会补充.