有按相應(yīng)的規(guī)則將數(shù)據(jù)流進(jìn)行劃分之后,才能獲知其含義;網(wǎng)卡數(shù)據(jù)的數(shù)據(jù)包頭包括:以太頭、IP頭和TCP頭。
[0035]更為具體地,TCP頭的格式定義如下:
[0036]---Source Port是源端口,16位。
[0037]---Destinat1n Port是目的端口,16位。
[0038]---Sequence Number是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號,32位。
[0039]---Acknowledgment Number是確認(rèn)序列號,32位。
[0040]---Data Off set 是數(shù)據(jù)偏移,4位。
[0041 ]---標(biāo)志位:6位。
[0042]---Checksum 是校驗和,16 位。
[0043]---Urgent Pointers是緊急指針,16位,只有URG標(biāo)志位被設(shè)置時該字段才有含義,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移。
[0044]也就是說,通過解析TCP頭中定義的目的端口可以確定相應(yīng)的虛擬機(jī)。
[0045]步驟S201,解析網(wǎng)卡數(shù)據(jù)的狀態(tài)信息,得到用于建立連接的握手狀態(tài)數(shù)據(jù)包。
[0046]其中,用于建立連接的握手狀態(tài)數(shù)據(jù)包包括:用于建立TCP/IP連接的握手狀態(tài)數(shù)據(jù)包和用于建立數(shù)據(jù)庫連接的握手狀態(tài)數(shù)據(jù)包。
[0047]在本發(fā)明實施例中,網(wǎng)卡數(shù)據(jù)不僅包含有請求數(shù)據(jù)包,還包含有表示狀態(tài)的信息,狀態(tài)信息指連接所處的階段,是握手階段還是已連接階段。在進(jìn)行TCP/IP連接時,需要經(jīng)過三次握手,才可以完成TCP/IP連接。在進(jìn)行數(shù)據(jù)庫連接時,需要經(jīng)過一次握手才可以完成數(shù)據(jù)庫連接。
[0048]在本步驟中,通過對網(wǎng)卡數(shù)據(jù)的狀態(tài)信息進(jìn)行解析,可以得到用于建立連接的握手狀態(tài)數(shù)據(jù)包,通過統(tǒng)計握手狀態(tài)數(shù)據(jù)包的個數(shù),可以確定連接是否建立成功。
[0049]步驟S202,在根據(jù)握手狀態(tài)數(shù)據(jù)包確定連接建立成功后,根據(jù)預(yù)設(shè)協(xié)議,對數(shù)據(jù)流繼續(xù)進(jìn)行解析,得到請求數(shù)據(jù)包。
[0050]其中,預(yù)設(shè)協(xié)議為MySQL協(xié)議,在利用步驟S201得到握手狀態(tài)數(shù)據(jù)包后,根據(jù)握手狀態(tài)數(shù)據(jù)包確定MySQL服務(wù)的客戶端與虛擬機(jī)(MySQL服務(wù)的服務(wù)端)之間的連接建立成功后,根據(jù)MySQL協(xié)議對網(wǎng)卡數(shù)據(jù)進(jìn)行解析,具體指按照協(xié)議規(guī)則對網(wǎng)卡數(shù)據(jù)劃分,從而確定網(wǎng)卡數(shù)據(jù)各部分的含義,例如是請求數(shù)據(jù)還是握手?jǐn)?shù)據(jù)等,得到對應(yīng)的請求數(shù)據(jù)包,并識別出請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī)。
[0051]步驟S203,對數(shù)據(jù)流的特定字節(jié)進(jìn)行解析得到請求數(shù)據(jù)包的類型信息。
[0052]具體地,MySQL協(xié)議定義了數(shù)據(jù)流的第一個字節(jié)表示請求數(shù)據(jù)包的類型,請求數(shù)據(jù)包的類型包括:讀請求、寫請求、查詢請求等。每種類型的請求數(shù)據(jù)包都有唯一的標(biāo)志位,根據(jù)該標(biāo)志位可以確定請求數(shù)據(jù)包所屬的類型,例如當(dāng)?shù)谝粋€字節(jié)的數(shù)值為3時,表示該請求數(shù)據(jù)包類型是:查詢請求。
[0053]步驟S204,對數(shù)據(jù)包頭進(jìn)行解析得到目的端口信息,根據(jù)目的端口信息識別出請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī)。
[0054]在步驟S200中,抓取了實體機(jī)的網(wǎng)卡數(shù)據(jù),該網(wǎng)卡數(shù)據(jù)包括數(shù)據(jù)包頭和數(shù)據(jù)流,其中,數(shù)據(jù)包頭攜帶有虛擬機(jī)的目的端口信息,一般情況下,虛擬機(jī)的目的端口信息封裝在TCP頭中,根據(jù)TCP協(xié)議對TCP頭進(jìn)行解析,可以得到虛擬機(jī)的目的端口信息,根據(jù)該目的端口信息可以識別出請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī),例如,通過解析TCP頭得到目的端口信息為3306,則可以根據(jù)該目的端口信息識別出請求數(shù)據(jù)包對應(yīng)的是a虛擬機(jī),從而可以準(zhǔn)確地將請求日志信息寫入到虛擬機(jī)對應(yīng)的日志文件中。
[0055]步驟S205,根據(jù)請求數(shù)據(jù)包攜帶的信息,向請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī)的日志文件中寫入請求日志信息。
[0056]其中,請求數(shù)據(jù)包攜帶有對數(shù)據(jù)進(jìn)行執(zhí)行的操作等,例如,客戶端想要寫入數(shù)據(jù)A=I,則該請求數(shù)據(jù)包攜帶有信息:A= I,在根據(jù)步驟S204識別出請求數(shù)據(jù)包對應(yīng)的虛擬機(jī)后,將數(shù)據(jù)信息、請求數(shù)據(jù)包的類型信息、請求時間等寫入到請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī)的日志文件中。
[0057]在本發(fā)明優(yōu)選實施例中,還可以通過解析網(wǎng)卡數(shù)據(jù)的上下文信息,得到請求數(shù)據(jù)包。
[0058]這里解析網(wǎng)卡數(shù)據(jù)的上下文信息,主要是為了確定是否已建立連接,例如,通過解析網(wǎng)卡數(shù)據(jù)得到上一次接收的是握手?jǐn)?shù)據(jù),握手?jǐn)?shù)據(jù)包有幾個,從而確定連接是否建立完成,以確定網(wǎng)卡數(shù)據(jù)中是否包含有請求數(shù)據(jù)包。
[0059]根據(jù)本發(fā)明上述實施例提供的方法,通過抓取實體機(jī)的網(wǎng)卡接收到的網(wǎng)卡數(shù)據(jù),可以得到對所有虛擬機(jī)所執(zhí)行的操作,解析網(wǎng)卡數(shù)據(jù)的狀態(tài)信息,得到用于建立連接的握手狀態(tài)數(shù)據(jù)包,在根據(jù)握手狀態(tài)數(shù)據(jù)包確定連接建立成功后,根據(jù)預(yù)設(shè)協(xié)議,對數(shù)據(jù)流繼續(xù)進(jìn)行解析,得到請求數(shù)據(jù)包,以僅將對虛擬機(jī)的操作記錄到日志文件中,避免在日志文件中寫入與操作無關(guān)的信息,對數(shù)據(jù)流的特定字節(jié)進(jìn)行解析得到請求數(shù)據(jù)包的類型信息,對數(shù)據(jù)包頭進(jìn)行解析得到目的端口信息,根據(jù)目的端口信息識別出請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī),根據(jù)請求數(shù)據(jù)包攜帶的信息,向請求數(shù)據(jù)包所對應(yīng)的虛擬機(jī)的日志文件中寫入請求日志信息,僅通過一次寫入操作,便可向所有虛擬機(jī)的日志文件中寫入請求日志信息,克服了因所有的虛擬機(jī)都向?qū)嶓w機(jī)的磁盤寫日志,而造成加重的實體機(jī)負(fù)擔(dān)的缺陷,避免對實體機(jī)CPU的性能、實體機(jī)磁盤的性能造成影響,且便于對日志信息進(jìn)行管理。
[0060]圖3示出了根據(jù)本發(fā)明一個實施例的全量日志抓取裝置的功能框圖。用于抓取一個實體機(jī)所承載的多個虛擬機(jī)的請求日志信息,如圖3所示,該裝置包括:抓取模塊300、解析模塊310和寫入模塊320。
[0061 ]抓取模塊300,適于抓取實體機(jī)的網(wǎng)卡接收到的網(wǎng)卡數(shù)據(jù)。
[0062]—般情況下,一臺實體機(jī)會模擬多臺虛擬機(jī),因此,實體機(jī)會為所模擬的多臺虛擬機(jī)分配相應(yīng)的端口,所有虛擬機(jī)的數(shù)據(jù)等都經(jīng)過實體機(jī)的網(wǎng)卡,因此可以通過解析網(wǎng)卡數(shù)據(jù)得到數(shù)據(jù)對應(yīng)的虛擬機(jī)。
[0063]其中,網(wǎng)卡數(shù)據(jù)包括:數(shù)據(jù)包頭和數(shù)據(jù)流,數(shù)據(jù)流是指一組有順序的、有起點和終點的字節(jié)集合,程序從鍵盤接收數(shù)據(jù)或向文件中寫數(shù)據(jù),以及在網(wǎng)絡(luò)連接上進(jìn)行數(shù)據(jù)的讀寫操作,都可以使用數(shù)據(jù)流來完成,從數(shù)據(jù)流并不能直觀獲知網(wǎng)卡數(shù)據(jù)的含義,只有按相應(yīng)的規(guī)則將數(shù)據(jù)流進(jìn)行劃分之后,才能獲知其含義;網(wǎng)卡數(shù)據(jù)的數(shù)據(jù)包頭包括:以太頭、IP頭和TCP頭。
[0064]更為具體地,TCP頭的格式定義如下:
[0065]---Source Port是源端口,16位。
[0066]---Destinat1n Port是目的端口,16位。
[0067]---Sequence Number是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號,32位。
[0068]---Acknowledgment Number是確認(rèn)序列號,32位。
[0069]---Data Offset是數(shù)據(jù)偏移,4位。
[0070]---標(biāo)志位:6位。
[0071]---Checksum 是校驗和,16 位。
[0072]---Urgent Pointers是緊急指針,16位,只有URG標(biāo)志位被設(shè)置時該字段才有含義,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移。
[0073]也就是說,通過解析TCP頭中定義的目的端口可以確定相應(yīng)的虛擬機(jī)。
[0074]解析模塊310,適于根據(jù)預(yù)設(shè)協(xié)議,對網(wǎng)卡數(shù)據(jù)進(jìn)行解析,得到請求數(shù)據(jù)包