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下载地址

这里主要讲源码安装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

提示

–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'

暂时还没想到更好的解决办法了,后续会补充.

上次更新:
贡献者: iEchoxu