基于inotify实现配置文件热更新

在上一篇文章《Go配置文件热加载 - 发送系统信号》中给大家介绍了在Go语言中 利用发送系统信号更新配置文件 其核心思想就是:新起一个协程,监听linux 的用户自定义信号 USR1 , 当收到该信号类型时,主动更新当前配置文件。 那么接下来,我们将继续完成上一篇文章提到的第二种实现配置文件热更新方式:利用linux提供的inotify 接口实现配置文件自动更新。 1. 关于inotify首先在我们实操之前,让我们先来了解下什么是 inotify。 在 Linux 内核 2.6.13 (June 18, 2005)版本之后,Linux 内核新增了一批文件系统的扩展接口(API),其中之一就是inotify,inotify 提供了一种基于 inode 的监控文件系统事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。 inotify 既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录本身以及目录中的各文件的变化。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作 select、poll 和 epoll 来监视文件系统的变化。 总之,简单来说就是:inotify 为我们从系统层面提供了一种可以监控文件变化的接口,我们可以利用它来监控文件或目录的变化。 inotify常用监控事件inotify 提供常用的监控事件如下: IN_ACCESS 文件被访问时触发事件,例如一个文件正在被read时。 IN_ATTRIB 文件属性(Metadata)发送变化触发的事件,例如文件权限发生变化(使用 chmod 修改),文件所属用户发生变化(使用chown修改),文件时间戳发生变化等。 IN_CLOSE_WRITE 当一个文件写入操作结束文件被关闭时触发。 IN_CLOSE_NOWRITE 当一个文件或目录被打开没有任何写操作,当被关闭时触发。 IN_CREATE 当一个文件或目录被创建时触发。 IN_DELETE 文件或目录被删除时触发。 IN_DELETE_SELF 监控文件或目录本身被删除时触发,而且,如果一个文件或目录被移到其它地方,比如使用mv 命令,也会触发该事件,因为 mv 命令本质上是拷贝一份当前文件,然后删除当前文件的操作。 IN_MODIFY 文件被修改时触发,例如:有写操作( write) 或者文件内容被清空(truncate)操作。不过需要注意的是,IN_MODIFY 可能会连续触发多次。 IN_MOVE_SELF 所监控的文件或目录本身发生移动时触发。 IN_MOVED_FROM 文件或目录移除所监控目录。 IN_MOVED_TO 文件或目录移入所监控目录。 ...

June 21, 2019 · 3 min · jiezi

rsync+inotify实时同步

数据实时同步在生产中有一种需求是,当目录下的文件数据发生变化时,就将数据备份到备份服务器上。实现这样的需求需要做到以下两点:利用监控服务(inotify),监控到要同步服务器的目录文件的变化发现目录数据发生变化就利用rsync服务将数据发送到备份服务器因此,利用rsync+inotify可实现数据的实时同步。Inotify介绍Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界事件机制相符合。Inotify安装环境介绍[root@moli-linux03 ~] uname -r3.10.0-862.2.3.el7.x86_64[root@moli-linux03 ~] cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)安装前提需要2.6.13以后内核版本才能支持inotify软件。2.6.13内核之后版本,在没有安装inotify软件之前,应该有这三个文件。[root@moli-linux03 ~] ll /proc/sys/fs/inotify/总用量 0-rw-r–r–. 1 root root 0 2月 3 12:24 max_queued_events-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_instances-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_watches[root@moli-linux03 ~] 三个文件的说明文件默认值作用说明 max_user_watches8192设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)max_user_instances128设置每个用户可以运行的inotifywait或inotifywatch命令的进程数max_queued_events16384设置inotify实例事件(event)队列可容纳的事件数量注:可以将三个文件的数值调大,监听更大的范围安装方式可选择yum安装或者编译安装,yum安装需要配置有epel源,编译安装需要到github下载源码包。yum安装yum install -y inotify-tools编译安装(源码包地址:https://github.com/rvoicilas/…tar -zxf tar -zxf inotify-tools-3.13.tar.gz ./configuremakemake installinotify主要安装的两个软件inotifywait: (主要) 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用inotifywatch: 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。 说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控inotifywait重要命令参数说明参数说明-m始终保持事件监听-r递归监控目录数据信息变化-q输出信息少(只打印事件信息)-timefmt指定时间输出格式-format打印使用指定的输出类似格式字符串;即实际监控输出内容-e指定监听指定的事件,如果省略,表示所有事件都进行监听 -e[参数] 可以指定的事件类型事件名称说明close_write文件或目录关闭,在写入模式打开之后关闭的。move文件或目录不管移动到或是移出监控目录都触发事件create文件或目录创建在监控目录中delete文件或目录被删除在监控目录中示例测试对一个服务器打开两个终端窗口,终端1执行创建,删除,修改,移动文件等操作,终端2执行inotifywait命令。创建事件[root@终端2 ~] inotifywait -mrq /root/rsync_test –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e create[root@终端1 rsync_test]# touch 1.txt下面显示出事件信息,在终端一执行创建文件操作之后终端二才显示的事件03-02-19 12:48 /root/rsync_test/1.txt 事件信息: CREATE删除事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e delete[root@moli_data ~]# rm -f 1.txt修改事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e close_write[root@moli_data ~]# echo “hahaha” > 2 .txt移动事件move_to把其他目录文件移动到监控目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_to[root@moli_data ~]# mv /etc/passwd .移动事件move_from把监控目录文件移到其他目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_from[root@moli_data ~]# mv 2.txt /tmp inotifywait –timefmt时间参数说明命令参数说明%y年份信息,显示信息为十进制,并且没有世纪信息%m显示月份,显示信息为十进制(范围 01-12 )%d每月的第几天,显示倍息为十进制数(范围是 01-31 )%H小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )%M显示分钟,显示信息为十进制(范围 00-59 )inotifywait –format参数说明命令参数说明%w事件出现时,监控文件或目录的名称信息%f事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空%e显示发生的事件信息,不同的事件信息用逗号进行分隔%T输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息这个格式是通过strftime函数进行匹配时间格式信息的Linux文件同步工具rsync介绍rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。Rsync的特性1)支持拷贝特殊文件如链接,设备等2)可以有排除指定文件或目录同步的功能,相当于打包命令tar3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。核心算法介绍假定在名为和的两台计算机之间同步相似的文件 A 与 B ,其中对文件 A 拥有访问权,对文件 B 拥有访问权。并且假定主机与之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。将这些校验结果发给。通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。发给一串指令来生成文件 A 在上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。结论:rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。rsync命令常用选项选项说明-a(重要)包含-rtplgoD选项-r(重要)同步目录时要加上,类似cp命令的-r选项-v(重要)同步时显示一些信息,让我们知道同步的过程-l保留软链接-L同步软链接时会把源文件给同步-p保持文件的权限属性-o保持文件的属主-g保持文件的属组-D保持设备文件信息-t保持文件的时间属性–delete删除DEST中SRC没有的文件–exclude过滤指定文件,如–exclude “logs” 会把文件名包含logs的文件或者目录过滤掉,不同步-p显示同步过程,比如速率,比-v更加详细-u如果DEST中的文件比SRC新,就不会同步-z传输时压缩rsync的简单示例示例1 将目录下1.txt拷贝到本目录下的2.txt在本地里使用rsync就类似于cp命令[root@moli-linux03 rsync_test]# ls1.txt[root@moli-linux03 rsync_test]# rsync -av 1.txt 2.txtsending incremental file list1.txtsent 87 bytes received 35 bytes 244.00 bytes/sectotal size is 0 speedup is 0.00[root@moli-linux03 rsync_test]# ls1.txt 2.txt示例2 把/etc/passwd文件拷贝到远程主机的/tmp目录下,并改名叫1.txtrsync -av /etc/passwd root@192.168.199.7:/tmp/1.txt示例3 通过ssh同步,指定端口号rsync -av -e “ssh -p 22” /etc/passwd 192.168.199.3:/tmp/test示例4 通过服务进行同步(休息一下…) ...

February 3, 2019 · 2 min · jiezi

lsyncd —— 多机器实时同步文件神器

lsyncd 是一个支持实时、双向、多机器的多模式文件同步工具。使用 Lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。安装在源文件服务器上安装:yum -y install lsyncd配置lsyncd 主配置文件,假设放置在/etc/lsyncd.conf:settings { nodaemon = false, logfile = “/var/log/lsyncd.log”, statusFile = “/var/log/lsyncd.status”, inotifyMode = “CloseWrite”, maxProcesses = 8}– 可以有多个sync,各自的source,各自的target,各自的模式,互不影响。sync { default.rsyncssh, source = “/home/wwwroot/web1/”, host = “111.222.333.444”, targetdir = “/home/wwwroot/web1/”, – 忽略文件路径规则,可用table也可用外部配置文件 – excludeFrom = “/etc/lsyncd_exclude.lst”, exclude = { “.svn”, “Runtime/”, “Uploads/”, }, – maxDelays = 5, delay = 0, – init = false, rsync = { binary = “/usr/bin/rsync”, archive = true, compress = true, verbose = true, _extra = {"–bwlimit=2000"}, },}忽略规则需要忽略同步的文件或文件夹,excludeFrom 选项才配置该文件,exclude 类型的配置不用该配置文件。假设配置文件放在/etc/lsyncd_exclude.lst。.svnRuntime/**Uploads/**免密登录为避免每次都需要手动输入密码,可设置为 SSH 免密登录。启动lsyncd -log Exec /etc/lsyncd.conf参考官方 Wikilsyncd实时同步搭建指南——取代rsync+inotify原文地址: https://shockerli.net/post/li… ...

December 13, 2018 · 1 min · jiezi