黄云祥 朱艳辉 姜杉彪 谭鹏
【摘 要】文章采用分布式计算结构设计并实现了一个文件监控系统,使用Go语言进行开发,采用了Redis开源数据库进行数据存储。该系统实现了实时监控大批量服务器上的多个目录,提高了管理大量服务器的效率和互联网企业的经济效益。
【关键词】分布式;文件监控;服务器;Go语言
【中图分类号】TP393.07 【文献标识码】A 【文章编号】1674-0688(2016)08-0020-03
0 引言
随着计算机和互联网的发展与普及,当今社会快速向信息化方向前进,大量互联网企业应运而生。它们给我们的生活带来了极大的便利,而在这些便利的背后是成千上万的服务器支撑着。随着互联网用户人数的快速增长,服务器数量也快速增长,对每一台服务器上的软件环境进行逐一检查的难度越来越大。即使运维人员加班加点完成了检查,也难免会出现疏忽,此时就需要有一个分布式的文件监控系统来完成这项工作。
在文件监控领域,各个平台上都有各自的监控技术。在Windows环境下,操作系统提供了Read Directo-
ries Changes W这一API来获取文件系统的变更事件[1];在Linux环境下,从2003发布Linux2.6内核开始,新增了Inotify内核特性用于捕获文件系统变更事件[2];在BSD、Linux、Macintosh等平台上,还可以利用KQu-
eue和EPoll的高性能并发同时监听多个句柄来实现监控[3]。
1 系统功能分析
1.1 文件监控
文件监控是最为核心的需求,要求能做到对设定的文件及目录进行实时的监控。被监控的文件及目录有任何改动,包括内容的修改、文件的替换等,都需要进行及时的记录、反馈等一系列的后续操作。
1.2 文件对比
文件对比功能相对于文件监控而言只是辅助功能,主要面向文本文件类型,例如文本文档、配置文件,脚本文件等。基于在配置时提供的模板文件,对相应目标文件进行内容级别的匹配对比。这个功能的主要使用场景是监控大部分内容一样,但是小部分内容必须不一样的文件,典型的例子就是网络配置文件,配置中网关网络地址、DNS等内容是一样的,但是网络地址肯定是不一致的。针对这种情况,如果只是简单地计算MD5值,系统肯定会报告文件不一致的错误,但是显然这应该被认为是一致的。
1.3 网络通信
由于客户端数量很多,因此需要一个服务端对客户端的信息进行汇总和进一步加工。但是,客户端分布在许多的服务器上,因此必须借助计算机网络技术讓客户端与服务端可以沟通和交流各自的信息。
1.4 辅助工具
由于主要的使用场景是服务器,而服务器为了提高效率通常没有提供图形用户界面(GUI,Graphical User Interface),所有操作都通过终端(Computer Terminal)完成,因此需要提供命令提示界面(CLI,Command-Line Interface)。需要有客户端比对、配置工具、日志分析工具等功能。
2 系统设计与实现
2.1 技术介绍
本系统采用Go语言进行开发,采用了分布式架构。利用Go语言内建的HTTP服务支持进行通信。数据库的选择上,为了保持系统的高效率,使用了基于内存进行操作的Redis数据库。
2.1.1 Go语言
Go语言是一门开源的编程语言,由Alphabet公司旗下子公司——Google公司(简称Google)于2007年开始设计。Go语言在设计之初就是作为一门系统编程的通用语言,它拥有强类型与垃圾回收机制,并且明确提供了对并行编程语言级别的支持。目前,Go语言在生成可执行的二进制文件时依然采用传统的编译与链接模型[4]。
2.1.2 Redis数据库
Redis是一个Key-Value存储系统。和Mem Cached类似,它支持存储的value类型相对更多,包括String(字符串)、List(链表)、Set(集合)、Zset(Sorted Set,有序集合)和Hash(哈希类型)。这些数据类型都支持Push/Pop、Add/Remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与MemCached一样,为了保证效率,数据都是缓存在内存中。区别是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了Master-Slave(主从)同步[5]。
2.2 数据库的设计
存储不同类型的数据主要依靠Key的前缀进行区分,表1是数据库中存储数据类型与对应前缀的说明。
2.3 客户端(被监控端)的设计
客户端的整体流程图如图1所示。
2.3.1 文件监控
文件监控模块的主要工作是监控文件与文件夹,在文件与文件夹被修改时及时进行响应并采取后续措施。为了提高文件监控模块的效率,在模块中使用了大量的子线程。通常每一个子线程在执行完毕之后会直接退出,除了监听系统消息的子线程(简称监听线程)。监听线程的主要作用是监听操作系统的消息,例如文件变动信号、进程退出信号等。文件监控模块的流程图如图2所示。
2.3.2 文件检查
文件检查模块是文件监控模块的辅助模块,设计这个辅助模块的原因有2个方面:一是系统API在提供文件变动信号时粒度非常小,例如修改信号的触发条件只是对磁盘进行了写入操作,哪怕打开一个文件没有修改任何内容直接进行保存也会触发修改信号。二是为了提供模糊匹配的功能,这样能保证一份模板能够适用于所有客户端机器上的相应文件。文件检查模块主要提供了2个检查方案:MD5方案与模板匹配方案。
MD5方案是使用MD5信息摘要算法对文件进行处理,生成一串长度为32的字符串。这一串字符串唯一表示这一份文件,如果这一份文件内容有改动,通过MD5信息摘要算法得出的字符串也会不一样,因此使用MD5表示一份文件的可靠性非常高。
模板匹配方案需要预先使用正则表达式编写模板,在文件变化时先把文件内容与对应模板进行模糊匹配,忽略掉模板中设置的可变内容,这个方案主要适用于文本类文件。
2.3.3 API
客戶端的APIs模块主要以HTTP服务的形式,向外提供一些接口用以获取客户端数据和控制客户端的行为。
2.3.4 通信
客户端的通信模块主要用来向服务端请求或发送各种数据,例如请求客户端配置数据、请求文件模板数据、发送文件改动消息等。
2.4 服务端(监控端)的设计
服务端的整体流程图如图3所示。
2.4.1 统计
统计模块被设计用来统合客户端发送的信息,并且在对信息进行必要的加工处理之后存储到数据库中落地,当用户需要查询时,从数据库中取出对应信息反馈给用户。统计模块主要由服务端的APIs模块根据客户端请求的路由与请求的内容进行相应方法的调用。
2.4.2 管理
服务端的管理模块分为2个,一个是客户端管理,另一个是数据库管理。客户端管理模块主要是根据用户的操作,借助服务端的通信模块与目标客户端进行通信,并调用客户端提供的API来完成用户的操作。指令主要分为数据类指令和控制类指令。数据类指令主要是向目标客户端获取某文件或文件夹的MD5等指令;控制类指令是刷新文件或文件夹的MD5等指令。数据库管理模块采用了连接池的设计,使用连接池来管理服务端与数据库之间的连接,能够极大地提高数据库连接使用的效率,避免了反复建立与关闭数据库连接所耗费的时间。
2.4.3 API
服务端的APIs模块以HTTP服务的形式向外提供了一套接口用来管理客户端、获取客户端数据等,同时还为辅助工具提供了接口。
2.4.4 通信
服务端的通信模块主要用来向客户端提供的API请求数据或发送指令,例如请求被监控文件目录,请求文件或文件夹的MD5值等。
2.5 辅助工具的设计
2.5.1 日志分析
志分析的工具名为log,由于分布式文件监控系统的使用场景含有大量的服务器,客户端运行在这些服务器上时随时随地都会向服务端发送请求,由此会产生大量的日志数据。日志分析工具提供了时间点、时间段查询,按日志等级、文件名称、文件路径等进行筛选的功能。
2.5.2 文件比较
文件比较的工具名为compare,分布式文件监控系统主要是监控文件的变化,如果需要比较2台服务器之间的内容是否一致,甚至比较多台服务器的内容是否一致则需要手动获取各服务器上的数据再进行一一比较。为了简化用户的操作,设计了文件比较工具。
文件比较工具需要指定2个客户端和需要比较的路径。在2个客户端中,第一个客户端需要显式的指定一个,而第二个客户端可以使用“*”号指定所有客户端,也可以显式指定某一个客户端。需要比较的路径可以指定一个或多个路径,也可以指定“*”号用来表示比较所有文件及文件夹。当需要比较的路径被指定为“*”号时,会先获取第一个客户端的监控目录,并以此为待比较路径做比较。
2.5.3 客户端配置
客户端配置的工具名为config,由于在分布式文件监控系统的数据交换场景中,大量使用了JSON进行数据交换,客户端配置也是使用JSON。JSON数据对于数据交换有非常大的优势,解析和构造也非常方便,但是如果需要手动生成较为复杂JSON数据还是很麻烦的,因此设计了客户端配置工具进行辅助。客户端配置工具提供了5个子命令(Subcommands)用来帮助用户修改客户端的配置,还提供了一个help子命令方便用户随时获取帮助。
2.5.4 客户端管理
客户端管理的工具名为manage,该工具主要是管理客户端的一些操作,包括刷新指定客户端的MD5、测试客户端的连通性、删除客户端保存在数据库的数据等,此外还提供了一个显示所有客户端的子命令。
3 结语
本系统设计基于分布式架构的设计思路,将繁杂的计算工作分布到每一台被监控的服务器上,借助Go语言内建的HTTP服务进行通信。在监控实现上,借助了开源项目fsnotify的帮助,能同时在Windows、Linux、Macintosh、IOS、android等平台上进行监控。
就目前而言,系统已经具备了以下优势和特点:①利用分布式架构的优势,将大量重复运算分散到了所有客户端上;②利用Go语言跨平台的特性,分布式文件监控系统中涉及调用系统API的操作全部进行了平台适配,使用时完全无感;③利用多线程的优势,提供了高并发的API服务,提高了程序的运行效率;④使用连接池对连接进行管理,从而减少了建立和断开连接的次数,节约了时间;⑤除了配置以外,客户端程序和服务端程序不需要人工干预即可完成文件监控;⑥适应所有服务器的运行环境,采用字符界面,使用命令行进行操作。
参 考 文 献
[1]严志敏.TOF基础服务高性能缓存系统的设计与实现
[D].西安:西安电子科技大学,2013.
[2]闫飞翔.wIMS中间件平台集群方案的设计与实现[J].电信工程技术与标准化,2011(9):86-89.
[3]吴海庆.基于AWS云计算的社交游戏平台和自动伸缩技术研究[D].上海:复旦大学,2013.
[4]崔巍峰.开源软件在教育信息化支撑平台中的选择与应用[J].中国电化教育,2014(6):75-79.
[5]佚名.大数据时代的9大Key-Value存储数据[EB/OL].http://blog.csdn.net/capricornliug/article/details/8846673,2013-04-24.
[6]佚名.windows下文件的监控——ReadDirectoryCha-ngesW函数的使用[EB/OL].http://blog.csdn.net/wo-shinia/article/details/8162983,2012-11-08.
[7]必应网典.Inotify[EB/OL].http://www.bing.com/k-nows/search?q=inotify,2016-06-07.
[8]佚名.fsnotify[EB/OL].https://github.com/fsnotify/fsnotify,2016-06-07.
[责任编辑:钟声贤]