黃云祥 朱艷輝 姜杉彪 譚鵬
【摘 要】文章采用分布式計算結(jié)構(gòu)設計并實現(xiàn)了一個文件監(jiān)控系統(tǒng),使用Go語言進行開發(fā),采用了Redis開源數(shù)據(jù)庫進行數(shù)據(jù)存儲。該系統(tǒng)實現(xiàn)了實時監(jiān)控大批量服務器上的多個目錄,提高了管理大量服務器的效率和互聯(lián)網(wǎng)企業(yè)的經(jīng)濟效益。
【關鍵詞】分布式;文件監(jiān)控;服務器;Go語言
【中圖分類號】TP393.07 【文獻標識碼】A 【文章編號】1674-0688(2016)08-0020-03
0 引言
隨著計算機和互聯(lián)網(wǎng)的發(fā)展與普及,當今社會快速向信息化方向前進,大量互聯(lián)網(wǎng)企業(yè)應運而生。它們給我們的生活帶來了極大的便利,而在這些便利的背后是成千上萬的服務器支撐著。隨著互聯(lián)網(wǎng)用戶人數(shù)的快速增長,服務器數(shù)量也快速增長,對每一臺服務器上的軟件環(huán)境進行逐一檢查的難度越來越大。即使運維人員加班加點完成了檢查,也難免會出現(xiàn)疏忽,此時就需要有一個分布式的文件監(jiān)控系統(tǒng)來完成這項工作。
在文件監(jiān)控領域,各個平臺上都有各自的監(jiān)控技術。在Windows環(huán)境下,操作系統(tǒng)提供了Read Directo-
ries Changes W這一API來獲取文件系統(tǒng)的變更事件[1];在Linux環(huán)境下,從2003發(fā)布Linux2.6內(nèi)核開始,新增了Inotify內(nèi)核特性用于捕獲文件系統(tǒng)變更事件[2];在BSD、Linux、Macintosh等平臺上,還可以利用KQu-
eue和EPoll的高性能并發(fā)同時監(jiān)聽多個句柄來實現(xiàn)監(jiān)控[3]。
1 系統(tǒng)功能分析
1.1 文件監(jiān)控
文件監(jiān)控是最為核心的需求,要求能做到對設定的文件及目錄進行實時的監(jiān)控。被監(jiān)控的文件及目錄有任何改動,包括內(nèi)容的修改、文件的替換等,都需要進行及時的記錄、反饋等一系列的后續(xù)操作。
1.2 文件對比
文件對比功能相對于文件監(jiān)控而言只是輔助功能,主要面向文本文件類型,例如文本文檔、配置文件,腳本文件等?;谠谂渲脮r提供的模板文件,對相應目標文件進行內(nèi)容級別的匹配對比。這個功能的主要使用場景是監(jiān)控大部分內(nèi)容一樣,但是小部分內(nèi)容必須不一樣的文件,典型的例子就是網(wǎng)絡配置文件,配置中網(wǎng)關網(wǎng)絡地址、DNS等內(nèi)容是一樣的,但是網(wǎng)絡地址肯定是不一致的。針對這種情況,如果只是簡單地計算MD5值,系統(tǒng)肯定會報告文件不一致的錯誤,但是顯然這應該被認為是一致的。
1.3 網(wǎng)絡通信
由于客戶端數(shù)量很多,因此需要一個服務端對客戶端的信息進行匯總和進一步加工。但是,客戶端分布在許多的服務器上,因此必須借助計算機網(wǎng)絡技術讓客戶端與服務端可以溝通和交流各自的信息。
1.4 輔助工具
由于主要的使用場景是服務器,而服務器為了提高效率通常沒有提供圖形用戶界面(GUI,Graphical User Interface),所有操作都通過終端(Computer Terminal)完成,因此需要提供命令提示界面(CLI,Command-Line Interface)。需要有客戶端比對、配置工具、日志分析工具等功能。
2 系統(tǒng)設計與實現(xiàn)
2.1 技術介紹
本系統(tǒng)采用Go語言進行開發(fā),采用了分布式架構(gòu)。利用Go語言內(nèi)建的HTTP服務支持進行通信。數(shù)據(jù)庫的選擇上,為了保持系統(tǒng)的高效率,使用了基于內(nèi)存進行操作的Redis數(shù)據(jù)庫。
2.1.1 Go語言
Go語言是一門開源的編程語言,由Alphabet公司旗下子公司——Google公司(簡稱Google)于2007年開始設計。Go語言在設計之初就是作為一門系統(tǒng)編程的通用語言,它擁有強類型與垃圾回收機制,并且明確提供了對并行編程語言級別的支持。目前,Go語言在生成可執(zhí)行的二進制文件時依然采用傳統(tǒng)的編譯與鏈接模型[4]。
2.1.2 Redis數(shù)據(jù)庫
Redis是一個Key-Value存儲系統(tǒng)。和Mem Cached類似,它支持存儲的value類型相對更多,包括String(字符串)、List(鏈表)、Set(集合)、Zset(Sorted Set,有序集合)和Hash(哈希類型)。這些數(shù)據(jù)類型都支持Push/Pop、Add/Remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支持各種不同方式的排序。與MemCached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別是Redis會周期性地把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現(xiàn)了Master-Slave(主從)同步[5]。
2.2 數(shù)據(jù)庫的設計
存儲不同類型的數(shù)據(jù)主要依靠Key的前綴進行區(qū)分,表1是數(shù)據(jù)庫中存儲數(shù)據(jù)類型與對應前綴的說明。
2.3 客戶端(被監(jiān)控端)的設計
客戶端的整體流程圖如圖1所示。
2.3.1 文件監(jiān)控
文件監(jiān)控模塊的主要工作是監(jiān)控文件與文件夾,在文件與文件夾被修改時及時進行響應并采取后續(xù)措施。為了提高文件監(jiān)控模塊的效率,在模塊中使用了大量的子線程。通常每一個子線程在執(zhí)行完畢之后會直接退出,除了監(jiān)聽系統(tǒng)消息的子線程(簡稱監(jiān)聽線程)。監(jiān)聽線程的主要作用是監(jiān)聽操作系統(tǒng)的消息,例如文件變動信號、進程退出信號等。文件監(jiān)控模塊的流程圖如圖2所示。
2.3.2 文件檢查
文件檢查模塊是文件監(jiān)控模塊的輔助模塊,設計這個輔助模塊的原因有2個方面:一是系統(tǒng)API在提供文件變動信號時粒度非常小,例如修改信號的觸發(fā)條件只是對磁盤進行了寫入操作,哪怕打開一個文件沒有修改任何內(nèi)容直接進行保存也會觸發(fā)修改信號。二是為了提供模糊匹配的功能,這樣能保證一份模板能夠適用于所有客戶端機器上的相應文件。文件檢查模塊主要提供了2個檢查方案:MD5方案與模板匹配方案。
MD5方案是使用MD5信息摘要算法對文件進行處理,生成一串長度為32的字符串。這一串字符串唯一表示這一份文件,如果這一份文件內(nèi)容有改動,通過MD5信息摘要算法得出的字符串也會不一樣,因此使用MD5表示一份文件的可靠性非常高。
模板匹配方案需要預先使用正則表達式編寫模板,在文件變化時先把文件內(nèi)容與對應模板進行模糊匹配,忽略掉模板中設置的可變內(nèi)容,這個方案主要適用于文本類文件。
2.3.3 API
客戶端的APIs模塊主要以HTTP服務的形式,向外提供一些接口用以獲取客戶端數(shù)據(jù)和控制客戶端的行為。
2.3.4 通信
客戶端的通信模塊主要用來向服務端請求或發(fā)送各種數(shù)據(jù),例如請求客戶端配置數(shù)據(jù)、請求文件模板數(shù)據(jù)、發(fā)送文件改動消息等。
2.4 服務端(監(jiān)控端)的設計
服務端的整體流程圖如圖3所示。
2.4.1 統(tǒng)計
統(tǒng)計模塊被設計用來統(tǒng)合客戶端發(fā)送的信息,并且在對信息進行必要的加工處理之后存儲到數(shù)據(jù)庫中落地,當用戶需要查詢時,從數(shù)據(jù)庫中取出對應信息反饋給用戶。統(tǒng)計模塊主要由服務端的APIs模塊根據(jù)客戶端請求的路由與請求的內(nèi)容進行相應方法的調(diào)用。
2.4.2 管理
服務端的管理模塊分為2個,一個是客戶端管理,另一個是數(shù)據(jù)庫管理??蛻舳斯芾砟K主要是根據(jù)用戶的操作,借助服務端的通信模塊與目標客戶端進行通信,并調(diào)用客戶端提供的API來完成用戶的操作。指令主要分為數(shù)據(jù)類指令和控制類指令。數(shù)據(jù)類指令主要是向目標客戶端獲取某文件或文件夾的MD5等指令;控制類指令是刷新文件或文件夾的MD5等指令。數(shù)據(jù)庫管理模塊采用了連接池的設計,使用連接池來管理服務端與數(shù)據(jù)庫之間的連接,能夠極大地提高數(shù)據(jù)庫連接使用的效率,避免了反復建立與關閉數(shù)據(jù)庫連接所耗費的時間。
2.4.3 API
服務端的APIs模塊以HTTP服務的形式向外提供了一套接口用來管理客戶端、獲取客戶端數(shù)據(jù)等,同時還為輔助工具提供了接口。
2.4.4 通信
服務端的通信模塊主要用來向客戶端提供的API請求數(shù)據(jù)或發(fā)送指令,例如請求被監(jiān)控文件目錄,請求文件或文件夾的MD5值等。
2.5 輔助工具的設計
2.5.1 日志分析
志分析的工具名為log,由于分布式文件監(jiān)控系統(tǒng)的使用場景含有大量的服務器,客戶端運行在這些服務器上時隨時隨地都會向服務端發(fā)送請求,由此會產(chǎn)生大量的日志數(shù)據(jù)。日志分析工具提供了時間點、時間段查詢,按日志等級、文件名稱、文件路徑等進行篩選的功能。
2.5.2 文件比較
文件比較的工具名為compare,分布式文件監(jiān)控系統(tǒng)主要是監(jiān)控文件的變化,如果需要比較2臺服務器之間的內(nèi)容是否一致,甚至比較多臺服務器的內(nèi)容是否一致則需要手動獲取各服務器上的數(shù)據(jù)再進行一一比較。為了簡化用戶的操作,設計了文件比較工具。
文件比較工具需要指定2個客戶端和需要比較的路徑。在2個客戶端中,第一個客戶端需要顯式的指定一個,而第二個客戶端可以使用“*”號指定所有客戶端,也可以顯式指定某一個客戶端。需要比較的路徑可以指定一個或多個路徑,也可以指定“*”號用來表示比較所有文件及文件夾。當需要比較的路徑被指定為“*”號時,會先獲取第一個客戶端的監(jiān)控目錄,并以此為待比較路徑做比較。
2.5.3 客戶端配置
客戶端配置的工具名為config,由于在分布式文件監(jiān)控系統(tǒng)的數(shù)據(jù)交換場景中,大量使用了JSON進行數(shù)據(jù)交換,客戶端配置也是使用JSON。JSON數(shù)據(jù)對于數(shù)據(jù)交換有非常大的優(yōu)勢,解析和構(gòu)造也非常方便,但是如果需要手動生成較為復雜JSON數(shù)據(jù)還是很麻煩的,因此設計了客戶端配置工具進行輔助??蛻舳伺渲霉ぞ咛峁┝?個子命令(Subcommands)用來幫助用戶修改客戶端的配置,還提供了一個help子命令方便用戶隨時獲取幫助。
2.5.4 客戶端管理
客戶端管理的工具名為manage,該工具主要是管理客戶端的一些操作,包括刷新指定客戶端的MD5、測試客戶端的連通性、刪除客戶端保存在數(shù)據(jù)庫的數(shù)據(jù)等,此外還提供了一個顯示所有客戶端的子命令。
3 結(jié)語
本系統(tǒng)設計基于分布式架構(gòu)的設計思路,將繁雜的計算工作分布到每一臺被監(jiān)控的服務器上,借助Go語言內(nèi)建的HTTP服務進行通信。在監(jiān)控實現(xiàn)上,借助了開源項目fsnotify的幫助,能同時在Windows、Linux、Macintosh、IOS、android等平臺上進行監(jiān)控。
就目前而言,系統(tǒng)已經(jīng)具備了以下優(yōu)勢和特點:①利用分布式架構(gòu)的優(yōu)勢,將大量重復運算分散到了所有客戶端上;②利用Go語言跨平臺的特性,分布式文件監(jiān)控系統(tǒng)中涉及調(diào)用系統(tǒng)API的操作全部進行了平臺適配,使用時完全無感;③利用多線程的優(yōu)勢,提供了高并發(fā)的API服務,提高了程序的運行效率;④使用連接池對連接進行管理,從而減少了建立和斷開連接的次數(shù),節(jié)約了時間;⑤除了配置以外,客戶端程序和服務端程序不需要人工干預即可完成文件監(jiān)控;⑥適應所有服務器的運行環(huán)境,采用字符界面,使用命令行進行操作。
參 考 文 獻
[1]嚴志敏.TOF基礎服務高性能緩存系統(tǒng)的設計與實現(xiàn)
[D].西安:西安電子科技大學,2013.
[2]閆飛翔.wIMS中間件平臺集群方案的設計與實現(xiàn)[J].電信工程技術與標準化,2011(9):86-89.
[3]吳海慶.基于AWS云計算的社交游戲平臺和自動伸縮技術研究[D].上海:復旦大學,2013.
[4]崔巍峰.開源軟件在教育信息化支撐平臺中的選擇與應用[J].中國電化教育,2014(6):75-79.
[5]佚名.大數(shù)據(jù)時代的9大Key-Value存儲數(shù)據(jù)[EB/OL].http://blog.csdn.net/capricornliug/article/details/8846673,2013-04-24.
[6]佚名.windows下文件的監(jiān)控——ReadDirectoryCha-ngesW函數(shù)的使用[EB/OL].http://blog.csdn.net/wo-shinia/article/details/8162983,2012-11-08.
[7]必應網(wǎng)典.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.
[責任編輯:鐘聲賢]