專利名稱:一種日志分布式收集及存儲(chǔ)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種日志分布式收集及存儲(chǔ)方法。
背景技術(shù):
在分布式網(wǎng)絡(luò)與高性能系統(tǒng)中,一定時(shí)間內(nèi),從多個(gè)節(jié)點(diǎn)收集并處理的數(shù)據(jù)是很多的,單個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)處理能力有限,怎樣提高高流量數(shù)據(jù)收集、處理及存儲(chǔ)能力,是一個(gè)亟待解決的問題。目前,普遍采用syslog-ng日志收集服務(wù)器來收集處理日志。當(dāng)多個(gè)客戶端將日志發(fā)送給中央日志服務(wù)端時(shí),由服務(wù)端統(tǒng)一寫入數(shù)據(jù)庫(kù)。但是syslog-ng將大量數(shù)據(jù)寫入命名管道時(shí),如果正好在讀取管道的數(shù)據(jù),這樣寫操作會(huì)阻塞。而且syslog-ng作為日志服務(wù)器集中往數(shù)據(jù)庫(kù)寫日志時(shí),事務(wù)到達(dá)頻繁,大量的數(shù)據(jù)庫(kù)IO操作,會(huì)成為系統(tǒng)性能的瓶頸,影響系統(tǒng)的實(shí)時(shí)性和可用性。
發(fā)明內(nèi)容
本發(fā)明的目的是為了克服現(xiàn)有技術(shù)的缺陷,提供一種日志分布式收集及存儲(chǔ)方法,通過該方法改善客戶端與日志服務(wù)器傳輸?shù)男剩纳迫罩痉?wù)器與數(shù)據(jù)庫(kù)操作的吞吐量。一種日志分布式收集及存儲(chǔ)方法,其具體流程為各客戶端節(jié)點(diǎn)收集的日志緩存在一個(gè)數(shù)組容器中,Protobuf序列化后通過回調(diào)函數(shù)發(fā)送給遠(yuǎn)程日志收集服務(wù)器,一次大量發(fā)送比通過管道多次少量發(fā)送要高效,采用tcp/ip協(xié)議進(jìn)行數(shù)據(jù)交互,發(fā)送端對(duì)數(shù)據(jù)序列化,接收端對(duì)數(shù)據(jù)反序列化;為了維護(hù)長(zhǎng)連接,客戶端定期發(fā)送心跳包判斷日志服務(wù)端是否在線,若在線則日志服務(wù)端對(duì)心跳包響應(yīng);調(diào)度器I對(duì)連接來的fd統(tǒng)一調(diào)度,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,調(diào)度器2從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。本發(fā)明技術(shù)方案帶來的有益效果通過本發(fā)明將日志進(jìn)行分布式收集及存儲(chǔ)不僅改善了客戶端與日志服務(wù)器傳輸?shù)男剩€改善了日志服務(wù)器與數(shù)據(jù)庫(kù)操作的吞吐量,提高了系統(tǒng)的實(shí)時(shí)性和可用性。
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講, 在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其它的附圖。圖1是本發(fā)明方法的整體流程圖;圖2是本發(fā)明中調(diào)度器I對(duì)客戶端發(fā)送來的數(shù)據(jù)進(jìn)行處理的流程圖;圖3是本發(fā)明中調(diào)度器2將調(diào)度器I處理好的數(shù)據(jù)發(fā)送給遠(yuǎn)程終端系統(tǒng)的流程圖。
具體實(shí)施例方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本發(fā)明提供的一種日志分布式收集及存儲(chǔ)方法,其所要解決的問題是將客戶端日志能快速的發(fā)給遠(yuǎn)程日志收集服務(wù)器,日志收集服務(wù)器能有效的往數(shù)據(jù)庫(kù)寫日志。整個(gè)發(fā)明流程圖如圖1所不。各客戶端節(jié)點(diǎn)收集的日志緩存在一個(gè)數(shù)組容器中,Protobuf序列化后通過回調(diào)函數(shù)發(fā)送給遠(yuǎn)程日志收集服務(wù)器,在以下四種情況下,發(fā)送回調(diào)函數(shù)將被調(diào)用。I)當(dāng)緩存數(shù)量達(dá)到數(shù)據(jù)高水位級(jí)別時(shí)。2 )當(dāng)緩存時(shí)間達(dá)到時(shí)間高水位級(jí)別時(shí)。3)當(dāng)緩存數(shù)量達(dá)到數(shù)據(jù)臨界水位時(shí)。4)當(dāng)緩存時(shí)間達(dá)到時(shí)間臨界水位時(shí)。其中,數(shù)據(jù)高水位發(fā)送數(shù)據(jù)操作,使得輸出緩 沖區(qū)的數(shù)據(jù)量在此級(jí)別或者更高時(shí),發(fā)送回調(diào)函數(shù)將被調(diào)用。數(shù)據(jù)臨界水位發(fā)送數(shù)據(jù)操作,使得輸出緩沖區(qū)的數(shù)據(jù)量在此級(jí)別,并且時(shí)間間隔達(dá)到一定時(shí),發(fā)送回調(diào)函數(shù)將被調(diào)用。時(shí)間高水位發(fā)送數(shù)據(jù)操作,時(shí)間間隔在此級(jí)別或者更高時(shí),發(fā)送回調(diào)函數(shù)將被調(diào)用。 時(shí)間臨界水位發(fā)送數(shù)據(jù)操作,時(shí)間間隔在此級(jí)別,并且輸出緩沖區(qū)的數(shù)據(jù)量達(dá)到一定時(shí),發(fā)送回調(diào)函數(shù)將被調(diào)用。發(fā)送數(shù)據(jù)先緩存在數(shù)組容量里,一次大量發(fā)送比通過管道多次少量發(fā)送要高效。采用tcp/ip協(xié)議進(jìn)行數(shù)據(jù)交互,發(fā)送端對(duì)數(shù)據(jù)序列化,接收端對(duì)數(shù)據(jù)反序列化。為了維護(hù)長(zhǎng)連接,客戶端定期發(fā)送心跳包判斷日志服務(wù)端是否在線,若在線則日志服務(wù)端對(duì)心跳包響應(yīng)。調(diào)度器I對(duì)連接來的fd (file descriptor)統(tǒng)一調(diào)度,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,調(diào)度器2從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。其中,調(diào)度器I對(duì)客戶端發(fā)送來的數(shù)據(jù)進(jìn)行處理,其處理流程如圖2所示,具體為主線程負(fù)責(zé)監(jiān)聽客戶端的建立連接請(qǐng)求,然后將這次連接設(shè)置為非阻塞。將返回的fd輪詢放入不同的處理數(shù)據(jù)線程隊(duì)列中,以達(dá)到負(fù)載均衡。完成此操作后,通過管道發(fā)送一個(gè)字節(jié)通知process_data_thread線程。process_data_thread線程負(fù)責(zé)處理已經(jīng)建立好連接的讀寫等事件,先將數(shù)據(jù)反序列化,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,交給調(diào)度器2來統(tǒng)一調(diào)度。其中,調(diào)度器2主要負(fù)責(zé)將調(diào)度器I處理好的數(shù)據(jù)發(fā)送給遠(yuǎn)程終端系統(tǒng),具體流程如圖3所示,具體為
發(fā)送線程Send_data_thread從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。每一個(gè)發(fā)送線程Send_data_thread實(shí)際通信的遠(yuǎn)程終端負(fù)載數(shù)Sn_load,圖3中虛線框部分起的作用是,維護(hù)每一個(gè)線程Send_data_thread實(shí)際通信的n_load數(shù),以達(dá)到負(fù)載均衡。以下主要對(duì)虛線框部分進(jìn)行詳細(xì)說明。每一臺(tái)計(jì)算機(jī)遠(yuǎn)程終端的fd和ip地址等信息存儲(chǔ)在peer_add的結(jié)構(gòu)體中,遠(yuǎn)程終端與發(fā)送線程Send_data_thread通信活動(dòng)連接的peer_add放在active堆中,心跳包檢測(cè)超時(shí)的遠(yuǎn)程終端peer_add放在inactive鏈表中,由線程Work_thread來維護(hù)。active堆是一個(gè)最小堆,每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)著一個(gè)發(fā)送線程Send_data_thread,節(jié)點(diǎn)存儲(chǔ)有相應(yīng)的peer_add結(jié)構(gòu)、負(fù)載數(shù)n_load,。堆按照負(fù)載數(shù)n load排序,在最小堆中父節(jié)點(diǎn)n_load小于兒子節(jié)點(diǎn)的n_load。inactive鏈表里存儲(chǔ)的是心跳超時(shí)的遠(yuǎn)程終端ip, Work_thread進(jìn)程定時(shí)ping這些超時(shí)的遠(yuǎn)程終端,如果ping得通,還得重新發(fā)起新的連接,并將建立起連接的peer_add結(jié)構(gòu),交給active中n_load小的節(jié)點(diǎn),動(dòng)態(tài)調(diào)節(jié)每個(gè)send_data_thread的n_load數(shù),并更新堆。通過本發(fā)明不僅改善了客戶端與日志服務(wù)器傳輸?shù)男?,還改善了日志服務(wù)器與數(shù)據(jù)庫(kù)操作的吞吐量。以上對(duì)本發(fā)明實(shí)施 例所提供的一種日志分布式收集及存儲(chǔ)方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。
權(quán)利要求
1.一種日志分布式收集及存儲(chǔ)方法,其特征在于,該方法具體為各客戶端節(jié)點(diǎn)收集的日志緩存在一個(gè)數(shù)組容器中,ProtobUf序列化后通過回調(diào)函數(shù)發(fā)送給遠(yuǎn)程日志收集服務(wù)器,一次大量發(fā)送比通過管道多次少量發(fā)送要高效,采用tcp/ip協(xié)議進(jìn)行數(shù)據(jù)交互,發(fā)送端對(duì)數(shù)據(jù)序列化,接收端對(duì)數(shù)據(jù)反序列化;為了維護(hù)長(zhǎng)連接,客戶端定期發(fā)送心跳包判斷日志服務(wù)端是否在線,若在線則日志服務(wù)端對(duì)心跳包響應(yīng);調(diào)度器I對(duì)連接來的fd統(tǒng)一調(diào)度,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,調(diào)度器2從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,發(fā)送回調(diào)函數(shù)將被調(diào)用的情形為當(dāng)緩存數(shù)量達(dá)到數(shù)據(jù)高水位級(jí)別時(shí);當(dāng)緩存時(shí)間達(dá)到時(shí)間高水位級(jí)別時(shí);當(dāng)緩存數(shù)量達(dá)到數(shù)據(jù)臨界水位時(shí);當(dāng)緩存時(shí)間達(dá)到時(shí)間臨界水位時(shí);其中,數(shù)據(jù)高水位是指發(fā)送數(shù)據(jù)操作,使得輸出緩沖區(qū)的數(shù)據(jù)量在此級(jí)別或者更高時(shí);數(shù)據(jù)臨界水位是指發(fā)送數(shù)據(jù)操作,使得輸出緩沖區(qū)的數(shù)據(jù)量在此級(jí)別,并且時(shí)間間隔達(dá)到一定時(shí);時(shí)間高水位是指發(fā)送數(shù)據(jù)操作,時(shí)間間隔在此級(jí)別或者更高時(shí);時(shí)間臨界水位是指發(fā)送數(shù)據(jù)操作,時(shí)間間隔在此級(jí)別,并且輸出緩沖區(qū)的數(shù)據(jù)量達(dá)到一定時(shí)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,調(diào)度器I對(duì)客戶端發(fā)送來的數(shù)據(jù)進(jìn)行處理的流程為主線程負(fù)責(zé)監(jiān)聽客戶端的建立連接請(qǐng)求,然后將這次連接設(shè)置為非阻塞;將返回的fd輪詢放入不同的處理數(shù)據(jù)線程隊(duì)列中,以達(dá)到負(fù)載均衡;完成此操作后,通過管道發(fā)送一個(gè)字節(jié)通知process_data_thread線程,process_data_thread線程負(fù)責(zé)處理已經(jīng)建立好連接的讀寫事件,先將數(shù)據(jù)反序列化,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,交給調(diào)度器2來統(tǒng)一調(diào)度。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,調(diào)度器2負(fù)責(zé)將調(diào)度器I處理好的數(shù)據(jù)發(fā)送給遠(yuǎn)程終端系統(tǒng),具體為發(fā)送線程Send_data_thread從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,每一個(gè)發(fā)送線程Send_data_thread實(shí)際通信的遠(yuǎn)程終端負(fù)載數(shù)為n_load。
6.根據(jù)權(quán)利要求1或4所述的方法,其特征在于,每一臺(tái)計(jì)算機(jī)遠(yuǎn)程終端的fd和ip地址等信息存儲(chǔ)在peer_add的結(jié)構(gòu)體中,遠(yuǎn)程終端與發(fā)送線程Send_data_thread通信活動(dòng)連接的peer_add放在active堆中,心跳包檢測(cè)超時(shí)的遠(yuǎn)程終端peer_add放在inactive鏈表中,由線程Work_thread來維護(hù)。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,active堆是一個(gè)最小堆,每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)著一個(gè)發(fā)送線程Send_data_thread,節(jié)點(diǎn)存儲(chǔ)有相應(yīng)的peer_add結(jié)構(gòu)、負(fù)載數(shù)n_load,堆按照負(fù)載數(shù)n_load排序,在最小堆中父節(jié)點(diǎn)n_load小于兒子節(jié)點(diǎn)的n_load。
8.根據(jù)權(quán)利要求6所述的方法,其特征在于,inactive鏈表里存儲(chǔ)的是心跳超時(shí)的遠(yuǎn)程終端ip,ffork_thread進(jìn)程定時(shí)ping這些超時(shí)的遠(yuǎn)程終端,如果ping得通,還得重新發(fā)起新的連接,并將建立起連接的peer_add結(jié)構(gòu),交給avtive中n_load小的節(jié)點(diǎn),動(dòng)態(tài)調(diào)節(jié)每個(gè)send_data_thread的n_load數(shù),并更新堆。
全文摘要
本發(fā)明公開了一種日志分布式收集及存儲(chǔ)方法,該方法采用tcp/ip協(xié)議進(jìn)行數(shù)據(jù)交互,發(fā)送端對(duì)數(shù)據(jù)序列化,接收端對(duì)數(shù)據(jù)反序列化。為了維護(hù)長(zhǎng)連接,客戶端定期發(fā)送心跳包判斷日志服務(wù)端是否在線,若在線則日志服務(wù)端對(duì)心跳包響應(yīng)。調(diào)度器1對(duì)連接來的fd(file descriptor)統(tǒng)一調(diào)度,并將處理好的數(shù)據(jù)放在數(shù)據(jù)緩存池中,調(diào)度器2從數(shù)據(jù)緩存池中取一定數(shù)量數(shù)據(jù)后,發(fā)送給遠(yuǎn)程終端,計(jì)算機(jī)遠(yuǎn)程終端收到數(shù)據(jù)后,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。通過本發(fā)明不僅改善了客戶端與日志服務(wù)器傳輸?shù)男?,還改善了日志服務(wù)器與數(shù)據(jù)庫(kù)操作的吞吐量,提高了系統(tǒng)的實(shí)時(shí)性和可用性。
文檔編號(hào)H04L29/08GK103036961SQ20121052464
公開日2013年4月10日 申請(qǐng)日期2012年12月7日 優(yōu)先權(quán)日2012年12月7日
發(fā)明者柯宗貴, 柯宗慶, 楊育斌, 張道磊 申請(qǐng)人:藍(lán)盾信息安全技術(shù)股份有限公司