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

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_logout18 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
dorsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src  $user@$node1::$dstecho "${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上放一个东西,或者新建一个目录,删除一个东西,如果存储节点能够自动同步过去,那么就正常了。。。。

转载于:https://www.cnblogs.com/liaojiafa/p/6033520.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言扫地雷游戏的题目简介,C语言程序设计课程设计(论文)-扫地雷游戏.doc...

C语言程序设计课程设计(论文)-扫地雷游戏辽 宁 工 业 大 学C语言程序设计 课程设计(论文)题目: 扫地雷游戏院(系): 软件学院专业班级: 电子商务091班学 号:学生姓名:指导教师:教师职称: 助 教起止时间:2009…

关于地图中轨迹的平滑移动的实现

很多人应该都有类似的经历,叫完车,想看看车离我还有多远距离?但手机屏幕上的车不是一动不动,就是一跳一跳的漂移。 目前市面上大多产品“轨迹平滑移动”做的并不好。 市面上只有快的打车和一号专车实现了平滑移动,那…

查看centos中的用户和用户组

1、用户列表文件:/etc/passwd/ 2、用户组列表文件:/etc/group 3、查看系统中有哪些用户: cut -d : -f 1 /etc/passwd 4、查看可以登录系统的用户: cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 5、查看用户操作…

【Android】关于参数的传递问题

最近遇到了一个bug,在debug条件下可以看出更改后的值,但是在最终显示的结果中确实没有更改的值。经过很多次的调试后,才发现最后的原因竟然是因为参数传递的时候并没有将更改后的值传递给最终变量。 这时才意识到java中只存在值传递&#xff…

android按钮响应事件吗,Android 按钮响应事件的几种方式

目录1.在布局中指定onClick属性布局代码android:id"id/btn1"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"button1"android:onClick"click"/>android:id"id/btn2"andr…

Android 开源优秀 Library 推荐

之后的每月会推荐一些优秀的开源 Android libraries,不仅仅是学习,也可以方便的使用到项目中,避免重复的造轮子。 PageIndicatorView 如果你需要在 ViewPager 中指明当前处于哪个画面中,PageIndicatorView是你的不二选择。而且真…

Vue2.0王者荣耀助手

vue-gok vue2.0-王者荣耀助手 项目使用的是带玩游戏平台提供的API,由于腾讯公司王者荣耀游戏关闭了查看其它人的战绩功能,带玩平台受其影响,已将API暂时关闭,所以无法获得稳定的 DAIWAN-API-TOKEN ,所以会出现DAIWAN-API-TOKEN令…

访问对象的属性和方法

class Person(object):name ""age 0height 0weight 0def run(self):print("run")def eat(self,food):print("eat"food)def openDoor(self):print("我已经打开了门")def fillEle(self):print("我已经把大象装进了冰箱")de…

Android mc怎么和win10联机,我的世界手机版/win10版联机完美互通方法

我的世界手机版玩家想要更加方便的操作?0.12.1更新之后,你除了能使用手柄进行方便的操作之外,现在你能完全摆脱小屏幕蹩脚的操作了!win10版在9月9日进行了重大更新,我们能直接使用win10的电脑玩我的世界,而…

十大基础算法

做为程序员,以下着十大10大基础实用算法是必须知道的。

[HNOI2004]L语言

1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1507 Solved: 666[Submit][Status][Discuss]Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章T是由若干小写字…

对象的初始状态(构造函数)

class Person(object):# name ""# age 0# height 0# weight 0def run(self):print("run")def eat(self,food):print("eat"food)def __init__(self,name,age,height,weight):# print(name,age,weight,height)print("这里是init")sel…

【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)

2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2477 Solved: 1382[Submit][Status][Discuss]Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母…

android加法服务类,iOS越来越像Android:苹果简单做加法远离精致

原标题:iOS越来越像Android:苹果简单做加法远离精致刚刚结束的WWDC2016的主题演讲中,苹果为我们带来了最新的iOS 10系统,官方称本次iOS 10的推出有着多大10项的重要更新,在用户体验、界面、Siri、地图以及音乐方面都有着不少的变化…

JDK源码学习之Arraylist与LinkedList

ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍。 下图是Java集合类所涉及的类图。 一.ArrayList 从上面的集合类图可以看出,ArrayList实现了List接口。ArrayList是顺序的集合容器,容器中可以存放null…

学习记录4

学习了python基本数据类型,附学习笔记图及操作图 转载于:https://www.cnblogs.com/bgd140206127/p/6549229.html

self 实例对象-代码详细解释

self代表类的实例,而非类哪个对象调用方法,那么该方法中的self就代表那个对象self.__calss__ 代表类名class Person(object):def run(self):print("run")print(self.__class__)p self.__class__("tt",30,10,20)print(p)def eat(sel…

CString之GetBuffer与ReleaseBuffer

我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能。 GetBuffer()主要作用是将字符串的缓冲区长度锁定; ReleaseBuffer()则是解除对缓冲区的锁定,这样使得CString对象在以后的代…

mac 编译android系统,mac 编译 Android 系统杂记

挂载android分区sudo hdiutil attach ~/android_code/android7.dmg.sparseimage -mountpoint /Volumes/android原放入U盘:echo 188jinghao | sudo -S hdiutil attach ~/android7.dmg.sparseimage -mountpoint /Volumes/android放入机械硬盘sudo hdiutil attach /Vol…

Java开发必须熟悉的Linux命令总结

身为一个Java开发人员,这些常用的Linux命令必须掌握。即使平时开发过程中没有使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服务器机器交互,就要通过she…