Rsync+inotify实时备份数据

rsync在同步数据的时候,需要扫描所有文件后进行对比,然后进行差量传输,如果文件达到了百万或者千万级别以上是,扫描文件的时间也很长,而如果只有少量的文件变更了,那么此时rsync是非常低效的。所以此时需要一个实时监控文件变化的软件结合rsync来做实时数据备份。

what's inotify

inotify是一个强大的,细粒度的,异步的文件系统事件监控机制,linux内核从2.6.13开始加了这个功能,可以通过监控文件系统添加,删除,修改移动等事件,利用这个接口,第三方软件可以监控文件系统添加,删除,修改移动等事,inotify-tools就是这样的一个第三方软件。

install it

安全前首先确认内核大于2.6.13以上,以下重新编译内核加入inotify的支持,具体方法请自查。

[root@salt ~]# uname -r
2.6.32-504.el6.x86_64
[root@salt ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Nov 4 02:53 max_queued_events
-rw-r--r-- 1 root root 0 Nov 4 02:53 max_user_instances
-rw-r--r-- 1 root root 0 Nov 4 02:53 max_user_watches

如果 ll 后显示有三个,那么说明支持inotify了。

既然系统支持,那么接下来安装它 。

官网地址是:https://github.com/rvoicilas/inotify-tools

我这里的下载地址是:https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

[root@salt tmp]# tar zxf inotify-tools-3.14.tar.gz
[root@salt tmp]# cd inotify-tools-3.14
[root@salt inotify-tools-3.14]# ./configure --prefix=/usr/local/inotifytools && make && make install [root@salt inotify-tools-3.14]# cd /usr/local/inotifytools/
[root@salt inotifytools]# ls
bin include lib share
[root@salt inotifytools]# ll bin/inotifywa*
-rwxr-xr-x. 1 root root 44319 Nov 4 03:00 bin/inotifywait
-rwxr-xr-x. 1 root root 41425 Nov 4 03:00 bin/inotifywatch

安装好inotify-tools,会生成inotifywait 或者 inotifywatch 两个指令,

  • inotifywait用于等待文件或者文件集上的特定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树
  • inotifywatch用于收集被监控的文件系统统计数据,包括整个inotify时间发生多少次等信息。
inotify 相关参数

inotify定义了一些接口参数,用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此根据实际情况调节其大小,下面介绍下这些参数:

  • /proc/sys/fs/inotify/max_queued_events 表示调用了inotify_init时分配到inotify_instance中可排队的event数最大值,超过这值就会被丢弃,但会出发IN_Q_QVRFLOW事件
  • /proc/sys/fs/inotify/max_user_instances 表示每一个real_user ID可创建的inotify instances数量上限。
  • /proc/sys/fs/inotify/max_user_watches 表示每个inotify 实例相关联的watchs上限,也就是inotify实例监控最大文件的数量,如果文件数量巨大,这个值也需要调高。如我们修改成8百万
[root@localhost inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_user_watches
8192
[root@localhost inotify-tools-3.14]# echo "3000000" > /proc/sys/fs/inotify/max_user_watches
[root@localhost inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_user_watches
3000000
inotifywait 相关参数

inotifywait是一个监控等待事件,可以配合shell脚本来使用它,下面说下常用的几个参数:

  • -m (--monitor) 表示处于一直保持时间监听的状态
  • -r (--recursive) 表示递归查询目录
  • -d (--daemon) 守护进程运行
  • -q (--quiet) 表示打印出监控事件
  • -c (--event) 通过此参数可以指定要监控的事件,常见的事件有modify,delete,create和attrib等等

    man inotifywait可以查询到更多的参数

公司应用案例:rsync+inotify搭建实时同步系统

网站架构简单概要

这是一个应用商店业务,前端haproxy负载均衡,中间nginx作为web服务节点,网站数据访问都到后端存储节点,后端存储节点与公司app发布节点通过rsync+inotify进行同步,此时你也许会问了,为什么不直接把APP放在后端存储节点了呢,我们当时是这样考虑:

  • 存储节点是有多台服务器,如果要上传app的话,就得上传很多台服务器,我们通过inotify+rsync就可以上传到发布机上,自己自动同步到多台后端存储服务器了,这样就实现了上传到一台,同步到多台的效果。
  • 服务器都在阿里云,发布机在内网,公司需要访问的话,直接访问内部发布机即可,避免访问阿里云的服务器,占用它的带宽资源。

所以下面就通过inotify+rsync来实现app文件的自动同步了

环境介绍:

以下为实验环境,但是其生产情况和这类似。只不过是服务器数量多了几台罢了。

  • 192.168.141.3 发布机 安装inotify+rsync
  • 192.168.141.4 存储节点 rsync服务端模式

我们在刚才的操作中,已经在192.168.141.3上的发布机安装好了rsync+inotify的,192.168.141.4上把rsync配置成服务器模式,发布机配制成客户端模式,这样发布机上一有东西都自动同步到存储节点。

在存储节点(192.168.141.4)上配置rsync
[root@localhost ~]# useradd store        # 往store家目录下同步数据
[root@localhost ~]# cat /etc/rsyncd.conf
uid = nobody
gid = nobody
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
[appstore]
path = /home/store
comment = app file
ignore errors
read only = no
write only = no
hosts allow = *
list = false
uid = root
gid = root
auth users = store
secrets file = /etc/server.pass
[root@localhost ~]# cat /etc/server.pass
store:123..aa
[root@localhost ~]# chmod 600 /etc/server.pass
[root@localhost ~]# ll /etc/server.pass
-rw-------. 1 root root 14 Nov 5 01:42 /etc/server.pass # 千万不要忘记600权限
在发布机(192.168.141.3)上的配置

确保inotify安装正确后,我们首先手动测试下看rsync能不能够正常传输东西

[root@localhost ~]# rsync -vzrtopg --delete --progress /home/store store@192.168.141.4::appstore
Password:
sending incremental file list
store/
store/.bash_logout
18 100% 0.00kB/s 0:00:00 (xfer#1, to-check=7/9)
....一堆东西

显然,上面的状态说明rsync正常工作的,接下来写一个脚本,实现rsync+inotify结合工作

[root@localhost ~]# cat syncapp.sh
#!/bin/bash
node1="192.168.141.4" # 如果有多个服务端,可以node2=xx,node3=xxx,总之自由发挥吧
src=/home/store/ # 确保目录存在
dst=appstore
user=store
/usr/local/inotifytools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read file
do
rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user@$node1::$dst
echo "${file} was rsynced" >> /var/log/rsyncd.log 2&>1
done

脚本相关参数如下:

  • --timefmt 指定时间的输出格式
  • --format 指定变化文件的详细信息
  • -e close_write,delete,create,attrib 需要注意的这个close_write,表示等文件写完以后在触发rsync同步,
  • -e modify,delete,create,attrib
测试是否正常工作

我们在发布机下的/home/store上放一个东西,或者新建一个目录,删除一个东西,如果存储节点能够自动同步过去,那么就正常了。。。。

通过rsync搭建一个远程备份系统(二)的更多相关文章

  1. 通过rsync搭建一个远程备份系统(一)

    前言 我公司是电子商务公司,全部是linux系统,每天的网站数都在增加,为了保证安全,需要建立一个远程容灾系统,将网站数据每天凌晨1点备份到远程服务器上,由于数据量大,每天进行进行增量备份,仅仅备份当 ...

  2. 为自己搭建一个分布式 IM 系统二【从查找算法聊起】

    前言 最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的. 言归正传,上周更新了 cim 第一版:没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 3 ...

  3. 阿里云有奖体验:用PolarDB-X搭建一个高可用系统

    体验简介 场景将提供一台配置了CentOS 8.5操作系统和安装部署PolarDB-X集群的ECS实例(云服务器).通过本教程的操作,带您体验如何使用PolarDB-X搭建一个高可用系统,通过直接ki ...

  4. 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!

    不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...

  5. 用django搭建一个简易blog系统(翻译)(二)

    03. Starting the blog app 在这部分,将要为你的project创建一个blog 应用,通过编辑setting.py文件,并把它添加到INSTALLED_APPS. 在你的命令行 ...

  6. ubuntu下配置rsync,实现远程备份

    rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本.主页地址为: http://rsync.samba.o ...

  7. 流媒体技术的应用,如何搭建一个SimpleNVR流媒体服务系统

    Onvif/RTSP流媒体服务 SimpleNVR Onvif/RTSP流媒体服务是一款软硬一体音视频流媒体服务软件.它是在5G.AI.云计算.大数据.物联网等网络技术大规模商用后,用户要求视频随时随 ...

  8. linux 中部署 rsync 实现文件远程备份及 同步

    客户端:数据源:服务端:数据接收方 rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html 手动测试用“通过远程外壳访问"里的语法: 参考1 ...

  9. 用django搭建一个简易blog系统(翻译)(四)

    12. Create the templates 你需要做三件事来去掉TemplateDoesNotExist错误 第一件,创建下面目录 * netmag/netmag/templates * net ...

随机推荐

  1. JavaScript精要

    写在开篇之前 这个系列都文章算是我最近研究了JavaScript(以后简称js)大半个月的一点心得吧.记得以前看过罗小平的一本书叫<Delphi精要>,我也就姑且起名叫<JavaSc ...

  2. HTML5+JS 《五子飞》游戏实现(五)移动棋子

    上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位 ...

  3. [C#解惑] #2 对象的初始化顺序

    谜题 在上一篇C#解惑中,我们提到了对象的初始化顺序.当我们创建一个子类的实例时,总是会先执行基类的构造函数,然后再执行子类的构造函数.那么实例字段是什么时候初始化的呢?静态构造函数和静态字段呢?今天 ...

  4. 比较Windows Azure 网站(Web Sites), 云服务(Cloud Services)and 虚机(Virtual Machines)

    Windows Azure提供了几个部署web应用程序的方法,比如Windows Azure网站.云服务和虚拟机.你可能无法确定哪一个最适合您的需要,或者你可能清楚的概念,比如IaaS vs PaaS ...

  5. 学习Google Protocol buffer之语法

    上一篇结尾的时候问了几个问题,其实主要就是这个protoBuffer协议的语法,弄清楚语法后边才好开展工作嘛,不然大眼而对小眼儿,互相不认识,就没法玩耍了.其实就是学习怎么用google提供的这套 p ...

  6. HTTP Pipeline

    什么是HTTP Pipeline http管线化是一项实现了多个http请求但不需要等待响应就能够写进同一个socket的技术,仅有http1.1规范支持http管线化,1.0并不支持:采用管线化的请 ...

  7. oracle 10g编程

    一.概述 1.sql语言特点 sql语言采用集合操作方式,对数据的处理是成组进行的,而不是一条一条处理,听过使用集合操作方式,可以家加快数据的处理速度. 执行sql语句时每次只能发送并处理一条语句.如 ...

  8. Spring中配置和读取多个Properties文件

    一个系统中通常会存在如下一些以Properties形式存在的配置文件 1.数据库配置文件demo-db.properties: database.url=jdbc:mysql://localhost/ ...

  9. poj1182 带权并查集

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 60225   Accepted: 17656 Description ...

  10. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...