精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

vivo大數(shù)據(jù)日志采集Agent設(shè)計實踐

大數(shù)據(jù)
本文通過在vivo的日志采集服務(wù)的設(shè)計實踐經(jīng)驗,為大家提供日志采集Agent在設(shè)計開發(fā)過程中的關(guān)鍵設(shè)計思路。

在企業(yè)大數(shù)據(jù)體系建設(shè)過程中,數(shù)據(jù)采集是其中的首要環(huán)節(jié)。然而,當(dāng)前行業(yè)內(nèi)的相關(guān)開源數(shù)據(jù)采集組件,并無法滿足企業(yè)大規(guī)模數(shù)據(jù)采集的需求與有效的數(shù)據(jù)采集治理,所以大部分企業(yè)都采用自研開發(fā)采集組件的方式。本文通過在vivo的日志采集服務(wù)的設(shè)計實踐經(jīng)驗,為大家提供日志采集Agent在設(shè)計開發(fā)過程中的關(guān)鍵設(shè)計思路。

一、概述

在企業(yè)大數(shù)據(jù)體系的建設(shè)過程中,數(shù)據(jù)的處理一般包含4個步驟:采集、存儲、計算和使用。其中,數(shù)據(jù)采集,是建設(shè)過程中的首要的環(huán)節(jié),也是至關(guān)重要的環(huán)節(jié),如果沒有采集就沒有數(shù)據(jù),更談不上后續(xù)的數(shù)據(jù)處理與使用。所以,我們看到的企業(yè)中的運營報表、決策報表、日志監(jiān)控、審計日志等的數(shù)據(jù)來源都是基于數(shù)據(jù)采集。一般的,我們對數(shù)據(jù)采集的定義是,把各種分散的源頭上的數(shù)據(jù)(可以包括企業(yè)產(chǎn)品的埋點的日志、服務(wù)器日志、數(shù)據(jù)庫、IOT設(shè)備日志等)統(tǒng)一匯聚到大數(shù)據(jù)存儲組件的過程(如下圖所示)。其中,日志文件類型的采集場景,是各種數(shù)據(jù)采集類型中最常見的一種。接下來,將圍繞該場景提出我們的設(shè)計實踐方案。


圖片

通常,日志采集服務(wù)可以分為幾個部分(業(yè)界常見的架構(gòu)如下圖所示):日志采集Agent組件(常見的開源采集Agent組件有Flume、Logstash、Scribe等)、采集傳輸與存儲組件(如kafka、HDFS)、采集管理平臺。Bees采集服務(wù)是vivo自研的日志采集服務(wù),本文章是通過在Bees采集服務(wù)中的關(guān)鍵組件bees-agent的開發(fā)實踐后,總結(jié)出一個通用的日志采集Agent設(shè)計中的核心技術(shù)點和一些關(guān)鍵思考點,希望對大家有用。

圖片

二、特性&能力

  1. 具備基本的日志文件的實時與離線采集能力
  2. 基于日志文件,無侵入式采集日志
  3. 具備自定義的過濾超大日志的能力
  4. 具備自定義的過濾采集、匹配采集、格式化的能力
  5. 具備自定義的限速采集的能力
  6. 具備秒級別的實時采集時效性
  7. 具備斷點續(xù)傳能力,升級和停止不丟數(shù)據(jù)
  8. 具備可視化的、中心化的采集任務(wù)管理平臺
  9. 豐富的監(jiān)控指標(biāo)與告警(包括采集流量、時效性、完整性等)
  10. 低系統(tǒng)資源開銷(包括磁盤、內(nèi)存、CPU及網(wǎng)絡(luò)等)

三、設(shè)計原則

  1. 簡單優(yōu)雅
  2. 健壯穩(wěn)定

四、關(guān)鍵設(shè)計

目前業(yè)界流行的日志采集Agent組件,開源的有Flume、Logstash、Scribe、FileBeats、Fluentd等,自研的有阿里的Logtail。它們都有不錯的性能與穩(wěn)定性,如果想要快速上手,可以不妨使用它們。但是一般大企業(yè)會有個性化的采集需求,比如采集任務(wù)大規(guī)模管理、采集限速、采集過濾等,還有采集任務(wù)平臺化、任務(wù)可視化的需求,為了滿足上面這些需求我們自研了一個日志采集Agent。

在做一切的設(shè)計和開發(fā)之前,我們設(shè)定了采集Agent最基本的設(shè)計原則,即簡單優(yōu)雅、健壯穩(wěn)定。圖片


日志文件采集的一般流程會包括:文件的發(fā)現(xiàn)與監(jiān)聽、文件讀取,日志內(nèi)容的格式化、過濾、聚合與發(fā)送。當(dāng)我們開始著手開始設(shè)計這樣一個日志采集Agent時,會遇到不少關(guān)鍵的難點問題,比如:日志文件在哪里?如何發(fā)現(xiàn)日志文件新增?如何監(jiān)聽日志內(nèi)容追加?如何識別一個文件?宕機(jī)重啟怎么辦?如何斷點續(xù)傳?等等問題,接下來,我們針對日志采集Agent設(shè)計過程中遇到的關(guān)鍵問題,為大家一一解答。(注:下文出現(xiàn)的文件路徑與文件名都為演示樣例非真實路徑)

4.1 日志文件發(fā)現(xiàn)與監(jiān)聽

Agent要如何知道采集哪些日志文件呢?

最簡單的設(shè)計,就是在Agent的本地配置文件中,把需要采集的日志文件路徑都一一羅列進(jìn)去,比如 /home/sample/logs/access1.log、/home/sample/logs/access2.log、/home/sample/logs/access3.log 等,這樣Agent通過讀取配置文件得到對應(yīng)的日志文件列表,這樣就能遍歷文件列表讀取日志信息。但是實際情況是,日志文件是動態(tài)生成的,像一般tomcat的業(yè)務(wù)日志,每個小時都會滾動生成一個新的的日志文件,日志名字通常會帶上時間戳,命名類似 /data/sample/logs/access.2021110820.log,所以采用直接配置固定的文件列表方式是行不通的。

所以,我們想到可以使用一個文件夾路徑和日志文件名使用正則表達(dá)式或者通配符來表示(為了方便,下文統(tǒng)一使用通配符來表示)。機(jī)器上的日志一般固定存在某一個目錄下,比如  /data/sample/logs/ 下,文件名由于某種規(guī)則是滾動產(chǎn)生的(比如時間戳),類似 access.2021110820.log、access.2021110821.log、access.2021110822.log,我們可以簡單粗暴使用 access.*.log 的通配方法來匹配這一類的日志,當(dāng)然實際情況可以根據(jù)你需要的匹配粒度去選擇你的正則表達(dá)式。有了這個通配符方法,我們的Agent就能的匹配滾動產(chǎn)生的一批日志文件了。

如何持續(xù)發(fā)現(xiàn)和監(jiān)聽到新產(chǎn)生的日志文件呢?

由于新的日志文件會由其他應(yīng)用程序(比如Nginx、Tomcat等)持續(xù)的按小時動態(tài)產(chǎn)生的,Agent如何使用通配符快速去發(fā)現(xiàn)這個新產(chǎn)生的文件呢?

最容易想到的,是使用輪詢的設(shè)計方案,即是通過一個定時任務(wù)來檢查對應(yīng)目錄下的日志文件是否有增加,但是這種簡單的方案有個問題,就是如果輪詢間隔時間太長,比如間隔設(shè)置為10s、5s,那么日志采集的時效性滿足不了我們的需求;如果輪詢間隔時間太短,比如500ms,大量的無效的輪詢檢查又會消耗許多CPU資源。幸好,Linux內(nèi)核給我們提供一種高效的文件事件監(jiān)聽機(jī)制:Linux Inotify機(jī)制。該機(jī)制可監(jiān)聽任意文件的操作,比如文件創(chuàng)建、文件刪除和文件內(nèi)容變更,內(nèi)核會給應(yīng)用層一個對應(yīng)的事件通知。Inotify這種的事件機(jī)制比輪詢機(jī)制高效的多,也不存在CPU空跑浪費系統(tǒng)資源的情況。在java中,使用java.nio.file.WatchService,可以參考如下核心代碼:

/**
* 訂閱文件或目錄的變更事件
*/
public synchronized BeesWatchKey watchDir(File dir, WatchEvent.Kind<?>... watchEvents) throws IOException {
if (!dir.exists() && dir.isFile()) {
throw new IllegalArgumentException("watchDir requires an exist directory, param: " + dir);
}
Path path = dir.toPath().toAbsolutePath();
BeesWatchKey beesWatchKey = registeredDirs.get(path);
if (beesWatchKey == null) {
beesWatchKey = new BeesWatchKey(subscriber, dir, this, watchEvents);
registeredDirs.put(path, beesWatchKey);
logger.info("successfully watch dir: {}", dir);
}
return beesWatchKey;
}

public synchronized BeesWatchKey watchDir(File dir) throws IOException {
WatchEvent.Kind<?>[] events = {
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY
};
return watchDir(dir, events);
}

綜合以上思考,日志文件的發(fā)現(xiàn)和日志內(nèi)容變更的監(jiān)聽,我們使用的是"inotify機(jī)制為主+輪詢機(jī)制兜底"、"通配符"的設(shè)計方案,如下圖所示:

圖片

4.2 日志文件的唯一標(biāo)識

要設(shè)計日志文件的唯一標(biāo)識,如果直接使用日志文件的名稱是行不通的,日志文件名可能被頻繁重復(fù)使用,比如,一些應(yīng)用程序使用的日志框架在輸出日志時,對于當(dāng)前應(yīng)用正在輸出的日志命名是不帶任何時間戳信息的,比如固定是 access.log,只有等到當(dāng)前小時寫入文件完畢時,才把文件重命名為 access.2021110820.log,此時新生產(chǎn)的日志文件命名也是 access.log,該文件名對于采集Agent來說是重復(fù)的,所以文件名是無法作為文件唯一標(biāo)識。

我們想到使用Linux操作系統(tǒng)上的文件inode號作為文件標(biāo)識符。Unix/Linux文件系統(tǒng)使用inode號來識別不同文件,即使移動文件或重命名文件,inode號是保持不變的,創(chuàng)建一個新文件,會給這個新文件分配一個新的不重復(fù)的inode號,這樣就能與現(xiàn)有磁盤上的其他文件很好區(qū)分。我們使用 ls -i access.log 可以快速查看該文件的inode號,如下代碼塊所示:

ls -i access.log
62651787 access.log

一般來說,使用系統(tǒng)的inode號作為標(biāo)識,已經(jīng)能滿足大多數(shù)的情況了,但是為了更嚴(yán)謹(jǐn)?shù)目紤],還可以進(jìn)一步升級方案。因為Linux 的inode號存在復(fù)用的情況,這里的"復(fù)用"要和"重復(fù)"區(qū)別一下,在一臺機(jī)器上的所有文件不會同一時刻出現(xiàn)重復(fù)的兩個inode號,但是當(dāng)文件刪除后,另一個新文件創(chuàng)建時,這個文件的inode號是可能復(fù)用之前刪除文件的inode號的,代碼邏輯處理不好,很可能造成日志文件漏采集,這一點是要注意的。為了規(guī)避這個問題,我們把文件的唯一標(biāo)識設(shè)計為" 文件inode與文件簽名組合",這里的文件簽名使用的是該文件內(nèi)容前128字節(jié)的Hash值,代碼參考如下:

public static String signFile(File file) throws IOException {
String filepath = file.getAbsolutePath();
String sign = null;
RandomAccessFile raf = new RandomAccessFile(filepath, "r");
if (raf.length() >= SIGN_SIZE) {
byte[] tbyte = new byte[SIGN_SIZE];
raf.seek(0);
raf.read(tbyte);
sign = Hashing.sha256().hashBytes(tbyte).toString();
}
return sign;
}

關(guān)于inode再補(bǔ)充點小知識。Linux inode是會滿的,inode的信息存儲本身也會消耗一些硬盤空間,因為inode號只是inode內(nèi)容中的一小部分,inode內(nèi)容主要是包含文件的元數(shù)據(jù)信息:如文件的字節(jié)數(shù)、文件數(shù)據(jù)block的位置、文件的讀寫執(zhí)行權(quán)限、文件的時間戳等,可以用stat命令,查看某個文件完整的inode信息(stat access.log)。因為這樣的設(shè)計,操作系統(tǒng)是將硬盤分成兩個區(qū)域的:一個是數(shù)據(jù)區(qū),存放文件數(shù)據(jù);另一個是inode區(qū),存放inode所包含的信息。每個inode節(jié)點的大小,一般是128字節(jié)或256字節(jié)。查看每個硬盤分區(qū)的inode總數(shù)和已經(jīng)使用的數(shù)量,可以使用df -i命令。由于每個文件都必須有一個inode,如果一個日志機(jī)器上,日志文件小而且數(shù)量太多,是有可能發(fā)生操作系統(tǒng)inode用完了即是inode區(qū)磁盤滿了,但是我們使用的數(shù)據(jù)區(qū)硬盤還未存滿的情況。這時,就無法在硬盤上創(chuàng)建新文件。所以在日志打印規(guī)范上是要避免產(chǎn)生大量的小日志文件的。


圖片


4.3 日志內(nèi)容的讀取

發(fā)現(xiàn)并且能有效監(jiān)聽日志文件后,我們應(yīng)該如何去讀取這個日志文件中實時追加的日志內(nèi)容呢?日志內(nèi)容的讀取,我們期望從日志文件中把每一行的日志內(nèi)容逐行讀取出來,每一行以\n或者\r為分隔符。很顯然,我們不能直接簡單采用InputStreamReader去讀取,因為Reader只能按照字符從頭到尾讀取整個日志文件,不適合讀取實時追加日志內(nèi)容的情況;最合適的選擇應(yīng)該是使用RandomAccessFile。RandomAccessFile它為代碼開發(fā)者提供了一個可供設(shè)置的指針,通過指針開發(fā)者可以訪問文件的隨機(jī)位置,參考下圖:

圖片

通過這種方式,當(dāng)某一時刻出現(xiàn)線程讀取到文件末尾時,只需要記錄當(dāng)前的位置,線程就進(jìn)入等待狀態(tài),直到有新的日志內(nèi)容寫入后,線程又重新啟動,啟動后可以接著上次的尾部往下讀取,代碼參考如下。另外,在進(jìn)程掛或者宕機(jī)恢復(fù)后,也會用到RandomAccessFile來從指定點位開始讀取,不需要從整個文件頭部重新讀取。關(guān)于斷點續(xù)傳的能力后文會提到。


RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] buffer;
private void readFile() {
if ((raf.length() - raf.getFilePointer()) < BUFFER_SIZE) {
buffer = new byte[(int) (raf.length() - raf.getFilePointer())];
} else {
buffer = new byte[BUFFER_SIZE];
}
raf.read(buffer, 0, buffer.length);
}

4.4 實現(xiàn)斷點續(xù)傳

機(jī)器宕機(jī)、Java進(jìn)程OOM重啟、Agent升級重啟等這些是常有的事,那么如何在這些情況下保障采集數(shù)據(jù)的正確呢?這個問題主要考慮的是采集Agent斷點續(xù)傳的能力。一般的,我們在采集過程中需要記錄當(dāng)前的采集點位(采集點位,即RandomAccessFile中最后的指針指向的位置,一個整型數(shù)值),當(dāng)Agent把對應(yīng)緩沖區(qū)的數(shù)據(jù)成功發(fā)送到kafka后,此時可以先把最新點位的數(shù)值更新到內(nèi)存,并且通過一個定時任務(wù)(默認(rèn)是3s)持久化內(nèi)存中的采集點位數(shù)值到本地的磁盤的點位文件中。這樣,當(dāng)出現(xiàn)進(jìn)程停止,重新啟動時,加載本次磁盤文件中的采集點位,并使用RandomAccessFile移動到對應(yīng)的點位,實現(xiàn)了從上一次停止的點位繼續(xù)往下采集的能力,Agent可以恢復(fù)到原有的狀態(tài),從而實現(xiàn)了斷點續(xù)傳,有效規(guī)避重復(fù)采集或者漏采集的風(fēng)險。

Agent針對的每一個采集任務(wù)會有一個對應(yīng)的點位文件,一個Agent如果有多個采集任務(wù),將會對應(yīng)多個點位文件。一個點位文件存儲的內(nèi)容格式為JSON數(shù)組(如下圖所示)。其中file表示任務(wù)所采集的文件的名字,inode即文件的inode,pos即position的縮小,表示點位的數(shù)值;


[
{
"file": "/home/sample/logs/bees-agent.log",
"inode": 2235528,
"pos": 621,
"sign": "cb8730c1d4a71adc4e5b48931db528e30a5b5c1e99a900ee13e1fe5f935664f1"
}
]

4.5 實時數(shù)據(jù)發(fā)送

前面主要介紹了,日志文件的實時的發(fā)現(xiàn)、實時的日志內(nèi)容變更監(jiān)聽、日志內(nèi)容的讀取等設(shè)計方案,接下來介紹Agent的數(shù)據(jù)發(fā)送。

最簡單的模型是,Agent通過Kafka Client把數(shù)據(jù)直接發(fā)送到Kafka分布式消息中間件,這也是一種簡潔可行的方案。實際上在Bees的采集鏈路架構(gòu)中,在Agent與Kafka的數(shù)據(jù)鏈路中我們增加了一個"組件bees-bus“(如下圖所示)。

bees-bus組件主要起到匯聚數(shù)據(jù)的作用,類似于Flume在采集鏈路中聚合的角色。Agent基于Netty開源框架實現(xiàn)NettyRpcClient與Bus之間通訊實現(xiàn)數(shù)據(jù)發(fā)送。網(wǎng)絡(luò)傳輸部分展開講內(nèi)容較多,非本文章重點就此帶過(具體可參考Flume NettyAvroRpcClient實現(xiàn))。

這里稍微補(bǔ)充下,我們引入bees-bus的目的主要有以下幾個:

  1. 收斂來自于Agent過多的網(wǎng)絡(luò)連接數(shù),避免所有Agent直連Kafka broker對其造成較大的壓力;
  2. 數(shù)據(jù)匯聚到Bus后,Bus具備流量多路輸出的能力,可以實現(xiàn)跨機(jī)房Kafka數(shù)據(jù)容災(zāi);
  3. 在遇到流量陡增的情況下, 會導(dǎo)致topic分區(qū)所在broker機(jī)器磁盤IO繁忙進(jìn)而導(dǎo)致數(shù)據(jù)反壓到客戶端, 由于kafka副本遷移比較耗時所以出現(xiàn)問題后恢復(fù)較慢,Bus可以起到一層緩沖層的作用。

圖片

4.6 離線采集能力

除了上面常見的實時日志采集的場景外(一般是日志采集到kafka這類消息中間件),Bees采集還有一個離線日志采集的場景。所謂離線日志采集,一般是指把日志文件是采集到HDFS下(參考下圖)。

這些日志數(shù)據(jù)是用于下游的Hive離線數(shù)倉建設(shè)、離線報表分析使用。該場景數(shù)據(jù)時效性沒有那么強(qiáng),一般是按天為單位使用數(shù)據(jù)(我們常說的T+1數(shù)據(jù)),所以日志數(shù)據(jù)采集無需像實時日志采集一樣,實時的一行一行的采集。離線采集一般可以按照固定時間一個批次采集。我們默認(rèn)是每隔一小時定時采集上個小時產(chǎn)生的一個完整的小時日志文件,比如在21點的05分,采集Agent則開始采集上個小時產(chǎn)生的日志文件(access.2021110820.log),該文件保存了20點內(nèi)產(chǎn)生的完整的(20:00~20:59)日志內(nèi)容。

圖片

實現(xiàn)離線的采集能力,我們的Agent通過集成HDFS Client的基本能力來實現(xiàn),HDFS Client中使用 FSDataOutputStream 可以快速的完成一個文件PUT到HDFS的目錄下。

尤其要關(guān)注的一點是,離線采集需要特別的增加了一個限流采集的能力。由于離線采集的特點是,在整點左右的時刻,所有的機(jī)器上的Agent會幾乎同時全量開啟采集,如果日志量大、采集速度過快,可能會造成該時刻公司網(wǎng)絡(luò)帶寬被快速占用飆升,超出全網(wǎng)帶寬上限,進(jìn)一步會影響其他業(yè)務(wù)的正常服務(wù),引發(fā)故障;還有一個需要關(guān)注的就是離線采集整點時刻對機(jī)器磁盤資源的需求是很大,通過限流采集,可以有效削平對磁盤資源的整點峰值,避免影響其他服務(wù)。

4.7 日志文件清理策略

業(yè)務(wù)日志源源不斷的產(chǎn)生落到機(jī)器的磁盤上,單個小時的日志文件大小,小的可能是幾十MB,大的可以是幾十GB,磁盤很有可能在幾小時內(nèi)被占滿,導(dǎo)致新的日志無法寫入造成日志丟失,另一方面可能導(dǎo)致更致命的問題,linux 操作系統(tǒng)報 “No space left on device 異常",引發(fā)其他進(jìn)程的各種故障;所以機(jī)器上的日志文件需要有一個清理的策略。

我們采用的策略是,所有的機(jī)器都默認(rèn)啟動了一個shell的日志清理腳本,定期檢查固定目錄下的日志文件,規(guī)定日志文件的生命周期為6小時,一旦發(fā)現(xiàn)日志文件是6小時以前的文件,則會對其進(jìn)行刪除(執(zhí)行 rm 命令)。

因為日志文件的刪除,不是由日志采集Agent自身發(fā)起和執(zhí)行的,那么可能出現(xiàn)”采集速度跟不上刪除速度(采集落后6小時)“的情況。比如日志文件還在采集,但是刪除腳本已經(jīng)檢測到該文件生命周期已達(dá)6小時準(zhǔn)備對其進(jìn)行刪除;這種情況,我們只需要做好一點,保證采集Agent對該日志文件的讀取句柄是正常打開的,這樣的話,即使日志清理進(jìn)程對該文件執(zhí)行了rm操作(執(zhí)行rm后只是將該文件從文件系統(tǒng)的目錄結(jié)構(gòu)上解除鏈接 unlink,實際文件還未從磁盤徹底刪除),采集Agent持續(xù)打開的句柄,依然能正常采集完此文件;這種"采集速度跟不上刪除速度"是不能長時間存在,也有磁盤滿的風(fēng)險,需要通過告警識別出來,根本上來說,需要通過負(fù)載均衡或者降低日志量的方法,來減少單機(jī)器日志長時間采集不過來的情況。

4.8 系統(tǒng)資源消耗與控制

Agent采集進(jìn)程是隨著業(yè)務(wù)進(jìn)程一起部署在一個機(jī)器上的,共同使用業(yè)務(wù)機(jī)器的資源(CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)),所以在設(shè)計時,要考慮控制好Agent采集進(jìn)程對機(jī)器資源的消耗,同時要做好對Agent進(jìn)程對機(jī)器資源消耗的監(jiān)控。一方面保障業(yè)務(wù)有穩(wěn)定的資源可以正常運行;另外可以保障Agent自身進(jìn)程正常運作。通常我們可以采用以下方案:

1. 針對CPU的消耗控制。

我們可以較方便采用Linux系統(tǒng)層面的CPU隔離的方案來控制,比如TaskSet;通過TaskSet命令,我們可以在采集進(jìn)程啟動時,設(shè)定采集進(jìn)程綁定在某個限定的CPU核心上面(進(jìn)程綁核,即設(shè)定進(jìn)程與CPU親和性,設(shè)定以后Linux調(diào)度器就會讓這個進(jìn)程/線程只在所綁定的核上面去運行);這樣的設(shè)定之后,可以保障采集進(jìn)程與業(yè)務(wù)進(jìn)程在CPU的使用上面互相不影響。

2. 針對內(nèi)存的消耗控制。

由于采集Agent采用java語言開發(fā)基于JVM運行,所以我們可以通過JVM的堆參數(shù)配置即可控制;bees-agent一般默認(rèn)配置512MB,理論上最低值可以是64MB,可以根據(jù)實際機(jī)器資源情況和采集日志文件大小來配置;事實上,Agent的內(nèi)存占用相對穩(wěn)定,內(nèi)存消耗方面的風(fēng)險較小。

3.針對磁盤的消耗控制。

由于采集Agent是一個IO密集型進(jìn)程,所以磁盤IO的負(fù)載是我們需要重點保障好的;在系統(tǒng)層面沒有成熟的磁盤IO的隔離方案,所以只能在應(yīng)用層來實現(xiàn)。我們需要清楚進(jìn)程所在磁盤的基準(zhǔn)性能情況,然后在這個基礎(chǔ)上,通過Agent自身的限速采集能力,設(shè)置采集進(jìn)程的峰值的采集速率(比如:3MB/s、5MB/s);除此之外,還需要做好磁盤IO負(fù)載的基礎(chǔ)監(jiān)控與告警、采集Agent采集速率大小的監(jiān)控與告警,通過這些監(jiān)控告警與值班分析進(jìn)一步保障磁盤IO資源。

4.針對網(wǎng)絡(luò)的消耗控制。

這里說的網(wǎng)絡(luò),重點要關(guān)注是跨機(jī)房帶寬上限。避免同一時刻,大批量的Agent日志采集導(dǎo)致跨機(jī)房的帶寬到達(dá)了上限,引發(fā)業(yè)務(wù)故障。所以,針對網(wǎng)絡(luò)帶寬的使用也需要有監(jiān)控與告警,相關(guān)監(jiān)控數(shù)據(jù)上報到平臺匯總計算,平臺通過智能計算后給Agent下發(fā)一個合理的采集速率。

4.9 自身日志監(jiān)控

為了更好的監(jiān)控線上所有的Agent的情況,能夠方便地查看這些Agent進(jìn)程自身的log4j日志是很有必要的。為了達(dá)成這一目的,我們把Agent自身產(chǎn)生的日志采集設(shè)計成一個普通的日志采集任務(wù),就是說,采集Agent進(jìn)程自身,自己采集自己產(chǎn)生的日志,于是就可以把所有Agent的日志通過Agent采集匯聚到下游Kafka,再到Elasticsearch存儲引擎,最后通過Kibana或其他的日志可視化平臺可以查看。

圖片

4.10 平臺化管理

目前的生產(chǎn)環(huán)境Agent實例數(shù)量已經(jīng)好幾萬,采集任務(wù)數(shù)量有上萬個。為了對這些分散的、數(shù)據(jù)量多的Agent進(jìn)行有效的集中的運維和管理,我們設(shè)計了一個可視化的平臺,管理平臺具備以下Agent控制能力:Agent 的現(xiàn)網(wǎng)版本查看,Agent存活心跳管理,Agent采集任務(wù)下發(fā)、啟動、停止管理,Agent采集限速管理等;需要注意的是,Agent與平臺的通訊方式,我們設(shè)計采用簡單的HTTP通訊方式,即Agent以定時心跳的方式(默認(rèn)5分鐘)向平臺發(fā)起HTTP請求,HTTP請求體中會包含Agent自身信息,比如idc、ip、hostname、當(dāng)前采集任務(wù)信息等,而HTTP返回體的內(nèi)容里會包含平臺向Agent下發(fā)的任務(wù)信息,比如哪個任務(wù)啟動、哪個任務(wù)停止、任務(wù)的具體參數(shù)變更等。

圖片


五、與開源能力對比

bees-agent與flume-agent對比

  1. 內(nèi)存需求大大降低。bees-agent 采用無 Channel 設(shè)計,大大節(jié)省內(nèi)存開銷,每個 Agent 啟動 ,JVM 堆棧最低理論值可以設(shè)置為64MB;
  2. 實時性更好。bees-agent 采用Linux inotify事件機(jī)制,相比 Flume Agent 輪詢機(jī)制,采集數(shù)據(jù)的時效性可以在1s以內(nèi);
  3. 日志文件的唯一標(biāo)識,bees-agent使用inode+文件簽名,更準(zhǔn)確,不會出現(xiàn)日志文件誤采重采;
  4. 用戶資源隔離。bees-agent 不同 Topic 的日志采集任務(wù),采用不同的線程隔離采集,互相無影響;
  5. 真正的優(yōu)雅退出。bees-agent 在正常采集過程中,隨時使用平臺的"停止命令"讓 Agent 優(yōu)雅退出,不會出現(xiàn)無法退出的尷尬情況,也能保證日志無任何丟失;
  6. 更豐富的指標(biāo)數(shù)據(jù)。bees-agent 包括采集速率、采集總進(jìn)度,還有 機(jī)器信息、JVM 堆情況、類數(shù)量、JVM GC次數(shù)等;
  7. 更豐富的定制化能力。bees-agent 具備關(guān)鍵字匹配采集能力、日志格式化能力、平臺化管理的能力等;

圖片


六、總結(jié)

前文介紹了vivo日志采集Agent在設(shè)計過程中的一些核心技術(shù)點:包括日志文件的發(fā)現(xiàn)與監(jiān)聽、日志文件的唯一標(biāo)識符設(shè)計、日志文件的實時采集與離線采集的架構(gòu)設(shè)計、日志文件的清理策略、采集進(jìn)程對系統(tǒng)資源的消耗控制、平臺化管理的思路等,這些關(guān)鍵的設(shè)計思路覆蓋了自研采集agent大部分的核心功能,同時也覆蓋了其中的難點痛點,能讓后續(xù)的開發(fā)環(huán)節(jié)更加暢通。當(dāng)然,還有一些高階的采集能力未涵蓋本文介紹在內(nèi),比如"如何做好日志采集數(shù)據(jù)的完整性對賬","數(shù)據(jù)庫類型的場景的采集設(shè)計"等,大家可以繼續(xù)探索解決方案。

從2019年起,vivo大數(shù)據(jù)業(yè)務(wù)的日志采集場景就是由Bees數(shù)據(jù)采集服務(wù)支撐。bees-agent在生產(chǎn)環(huán)境持續(xù)服務(wù),至今已有3年多的穩(wěn)定運行的記錄,有數(shù)萬個bees-agent實例正在運行,同時在線支撐數(shù)萬個日志文件的采集,每天采集PB級別的日志量。實踐證明,bees-agent的穩(wěn)定行、健壯性、豐富的功能、性能與合理的資源情況,都符合最開始設(shè)計的預(yù)期,本文的設(shè)計思路的也一再被證實行之有效。

責(zé)任編輯:龐桂玉 來源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2023-10-20 15:08:28

pod日志采集

2019-07-24 09:21:06

大數(shù)據(jù)采集采集系統(tǒng)大數(shù)據(jù)

2016-09-29 12:59:54

大數(shù)據(jù)采集系統(tǒng)

2024-01-25 08:59:52

大數(shù)據(jù)vivo架構(gòu)

2024-05-07 07:58:10

數(shù)據(jù)架構(gòu)大數(shù)據(jù)中間件架構(gòu)

2017-12-20 15:10:09

HBaseHadoop數(shù)據(jù)

2022-02-18 11:13:53

監(jiān)控架構(gòu)系統(tǒng)

2022-03-31 11:18:00

數(shù)據(jù)運維短視頻

2023-03-09 09:31:58

架構(gòu)設(shè)計vivo

2023-02-09 08:08:01

vivoJenkins服務(wù)器

2022-08-31 17:01:56

大數(shù)據(jù)工具數(shù)據(jù)治理

2018-10-17 10:49:49

Kubernetes存儲處理

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2016-10-07 18:58:56

2023-10-16 07:39:02

ELKpod日志

2023-02-15 21:57:39

2020-07-10 08:50:37

大數(shù)據(jù)銀行技術(shù)

2023-04-25 10:27:47

2016-08-02 16:06:18

大數(shù)據(jù)系統(tǒng)數(shù)據(jù)采集

2022-09-14 23:14:10

vivoPulsar大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品99久久久久久董美香 | 国产精品白嫩白嫩大学美女| 亚洲性色av| 久久精品夜色噜噜亚洲aⅴ| 国产一区二区三区视频在线播放| 欧美成人a视频| 久久久久久久久网| 五月激情丁香婷婷| 尤物精品在线| 中文字幕欧美日韩va免费视频| 精品国产鲁一鲁一区二区三区| 国产美女福利在线观看| 97se狠狠狠综合亚洲狠狠| 国产精品久久久久高潮| 九九九在线视频| 你懂的一区二区三区| 欧美日韩精品在线观看| 亚洲国产精品毛片| 免费观看黄一级视频| 麻豆精品网站| 亚洲色图25p| 国产情侣久久久久aⅴ免费| 日韩大片免费观看| 亚洲日穴在线视频| 国新精品乱码一区二区三区18| 亚洲毛片一区二区三区| 亚洲一级特黄| 久久久精品国产亚洲| 国产又粗又猛又爽视频| 97久久亚洲| 欧美日韩高清在线播放| 中文精品无码中文字幕无码专区| 艳母动漫在线看| 精品亚洲成a人在线观看| 欧美专区第一页| 精品午夜福利视频| 99久久99久久精品国产片果冰| 日韩精品免费在线播放| 俄罗斯黄色录像| 国产一区二区三区免费在线 | 久久久999久久久| 综合激情网站| 亚洲欧洲国产一区| 成人h动漫精品一区| 亚洲一区二区免费在线观看| 色狠狠一区二区三区香蕉| 欧美另类videos| av网站无病毒在线| 国产日韩成人精品| 精品综合久久| 亚洲 欧美 自拍偷拍| 国产成人一区在线| 99r国产精品视频| 一级片一区二区三区| 蜜臀久久99精品久久久久宅男| 欧美一级在线亚洲天堂| 国产亚洲第一页| 欧美网站在线| 国内精品久久影院| 最新一区二区三区| 日韩1区2区| 久久精品2019中文字幕| 丝袜美腿小色网| 在线看片不卡| 欧美精品18videos性欧| 麻豆疯狂做受xxxx高潮视频| 欧美性色综合| 91极品女神在线| 激情视频网站在线观看| 日本美女一区二区| 成人黄色av播放免费| 999av视频| 成人h动漫精品一区二| 精品免费二区三区三区高中清不卡| 香港三日本三级少妇66| 久久久久久久电影| 亚洲欧美日韩国产yyy| 里番在线观看网站| 一级做a爱片久久| 国产网站免费在线观看| 777午夜精品电影免费看| 欧美美女一区二区在线观看| 91精品国产高清91久久久久久| 麻豆国产欧美一区二区三区r| 亚洲欧洲免费视频| av黄色免费在线观看| 国内精品99| 日本亚洲欧美成人| 91国偷自产中文字幕久久| 床上的激情91.| 欧洲成人一区二区| a级网站在线播放| 欧美日韩美女在线| www.日本一区| caoporm在线视频| 韩国av免费观看| 久久久久国产精品一区三寸| 俺去了亚洲欧美日韩| 91中文字幕永久在线| 国产精品对白| 上原亚衣av一区二区三区| 免费精品99久久国产综合精品应用| 日韩深夜视频| 欧美一区日韩一区| 亚洲av无码一区二区三区观看| 不卡中文字幕| 97精品免费视频| 天堂а√在线中文在线新版| 麻豆免费精品视频| 久久国产精品一区二区三区| 免费在线看a| 欧美性猛交xxxx富婆| 中文字幕 91| 国产激情在线免费观看| 99精品国产一区二区三区| 97视频在线看| 国产免费高清av| 久久久精品欧美丰满| 国产激情片在线观看| 亚洲成人精品在线播放| 中文在线最新版地址| 成人av免费观看| 国产精品高潮呻吟视频| 97超碰国产在线| 免费视频一区二区三区在线观看| 91中文字幕在线观看| 欧美xxx.com| 黄色成人在线播放| 日本wwwxx| 日韩av一二三四| jizz性欧美23| 亚洲精选一区二区| 日韩高清dvd碟片| 精久久久久久| 136fldh精品导航福利| 性一交一乱一精一晶| 自拍偷在线精品自拍偷无码专区 | 午夜在线视频一区二区区别| 欧美在线视频你懂得| 亚洲一区二区三区香蕉| 97最新国自产拍视频在线完整在线看| 岛国一区二区三区| 青草视频在线观看视频| 一二三四视频在线中文| 亚洲国产小视频| 国产97免费视频| 久久精品国产**网站演员| 亚洲欧美日韩精品久久久| 欧美va在线观看| 国产亚洲视频在线观看| 国产日韩在线免费观看| 国产丝袜美腿一区二区三区| 成人在线免费观看网址| 国产高清在线a视频大全| 精品国产三级a在线观看| 久久这里只有精品免费| 亚洲日韩中文字幕一区| 成人av网址在线| 蜜桃91精品入口| 暖暖成人免费视频| 精品无人区乱码1区2区3区在线| 国产一区在线观看免费| 国内一区二区视频| 91麻豆天美传媒在线| 国产成人久久精品一区二区三区| 亚洲精品中文字幕女同| 夜夜爽妓女8888视频免费观看| 国产美女在线观看一区| 日韩亚洲一区在线播放| 久久久国产精品网站| 在线综合欧美| 国外色69视频在线观看| 香蕉av在线播放| 中文字幕人成不卡一区| 毛片毛片毛片毛片毛| 亚洲国产1区| 蜜桃导航-精品导航| av久久网站| 久久艳片www.17c.com | 亚洲精品网站在线播放gif| 中文字幕黄色片| 国产精品久久久久久久久晋中 | 久久久美女毛片| 日本超碰在线观看| 狠狠干成人综合网| 欧美xxxx黑人又粗又长精品| 懂色aⅴ精品一区二区三区| 最新日韩中文字幕| 国产 欧美 自拍| 色综合久久久久综合体桃花网| 四虎国产成人精品免费一女五男| 国产精品伊人色| 情侣黄网站免费看| 中国精品18videos性欧美| 久久av免费一区| 成人国产精品一区二区网站| 5252色成人免费视频| 亚洲成a人v欧美综合天堂麻豆| 精品国产污网站| 中文字幕第315页| 亚洲成人www| 天堂网av2018| 91一区二区在线观看| 国产永久免费网站| 香蕉国产精品偷在线观看不卡| 99精品视频网站| 亚洲另类av| www.成人av.com| 青青在线精品| 欧美在线视频观看| 欧美aaaaaaa| 中文字幕亚洲天堂| 天堂av在线免费观看| 欧美一区三区二区| 欧美高清69hd| 欧美三级欧美成人高清www| 欧美黑人一级片| 国产精品久久久久婷婷| 在线不卡av电影| 成人app下载| 日本在线视频播放| 蜜臀a∨国产成人精品| 国产免费黄色av| 136国产福利精品导航网址| 亚洲一区二区三区在线观看视频| 亚洲精品国产setv| 精品福利影视| 国产调教精品| 99re视频在线| 欧美高清hd| 91欧美日韩一区| 岛国一区二区| 国产精品美乳一区二区免费 | 国产一区二区三区黄| 欧美国产亚洲精品| 成人网欧美在线视频| 成人全视频免费观看在线看| 国产精品27p| 欧美人体一区二区三区| 亲子乱一区二区三区电影| av伦理在线| 欧美日韩亚洲视频| 国产高清免费在线| 欧美一区二区三区红桃小说| 国产富婆一区二区三区 | 精品欧美一区二区久久久伦 | 日韩电影大全在线观看| 蜜臀久久99精品久久一区二区| 久久久久se| 在线日韩一区| 欧美专区一二三| 成人动漫免费在线观看| 亚洲精品电影在线一区| 手机在线一区二区三区| 亚洲一区二区在| 欧美va亚洲va日韩∨a综合色| 中文字幕中文字幕在线中一区高清| 水蜜桃精品av一区二区| 裸体裸乳免费看| 欧美精品日韩| 缅甸午夜性猛交xxxx| 亚洲国产精品一区制服丝袜| 狠狠爱免费视频| 日韩二区三区在线观看| 亚洲一区二区三区精品在线| 人成免费在线视频| 中文字幕不卡在线观看| 少妇视频一区二区| 亚洲美女视频在线| 国产对白videos麻豆高潮| 精品福利在线看| 亚洲成人av网址| 91精品国产丝袜白色高跟鞋| 黄色美女一级片| 亚洲欧美国产精品| 日韩在线免费电影| 欧美高跟鞋交xxxxxhd| 国产极品在线观看| 国产精品久久999| 精品一区二区三区中文字幕| 精品乱码一区二区三区| 日韩高清欧美| 国产一区二区三区在线免费| 夜夜爽av福利精品导航| 中文字幕有码av| 高清成人在线观看| 婷婷色一区二区三区| 亚洲欧洲中文日韩久久av乱码| 日韩av一二三区| 欧美亚洲丝袜传媒另类| 精品区在线观看| 国产午夜精品全部视频播放| 99福利在线| 日韩av第一页| 一区二区三区四区精品视频 | 国产成人手机在线| 亚洲片在线观看| 日本三级在线观看网站| 国产精品96久久久久久| 91亚洲无吗| 亚洲一区高清| 国产精品尤物| 免费国偷自产拍精品视频| 国产亚洲综合在线| 国产在线视频在线观看| 欧美日韩和欧美的一区二区| 特级丰满少妇一级aaaa爱毛片| 久久精品国产2020观看福利| 毛片电影在线| 99爱精品视频| 婷婷综合网站| 亚洲精品一二三四五区| 成人动漫精品一区二区| 男女性高潮免费网站| 在线观看成人小视频| 少妇高潮一区二区三区69| 久青草国产97香蕉在线视频| 欧美成人精品三级网站| 黑人中文字幕一区二区三区| 欧美一区二区三区久久精品| 一本岛在线视频| 久久久久国产精品厨房| 动漫精品一区一码二码三码四码| 欧美剧情片在线观看| 国产特黄在线| 欧美洲成人男女午夜视频| 国产精品对白久久久久粗| 国产精品igao激情视频| 国产原创一区二区| 毛片视频免费播放| 在线观看区一区二| 韩日在线视频| 热99在线视频| 亚洲精华一区二区三区| 国产免费观看高清视频| 不卡的av电影在线观看| 久久久久性色av无码一区二区| 欧美精品久久久久久久多人混战| 国产女主播在线直播| 日本久久亚洲电影| 精品影片在线观看的网站| 精品少妇人妻av免费久久洗澡| 国产成人自拍高清视频在线免费播放| 潘金莲一级黄色片| 欧美久久久久久久久久| 免费在线看黄色| 91精品在线观| 欧美精品1区| 久久无码专区国产精品s| 亚洲一区二区不卡免费| 亚洲免费一级片| 97在线免费视频| 色狼人综合干| 欧美电影免费观看完整版| 后进极品白嫩翘臀在线视频| 韩国日本不卡在线| 日韩有码中文字幕在线| 成年人观看网站| 国产日本亚洲高清| 中文字幕精品在线观看| 久久久成人精品| 秋霞影院一区| 五十路熟女丰满大屁股| 久久免费精品国产久精品久久久久 | 在线免费观看日韩视频| www国产精品视频| 精品久久亚洲| av女优在线播放| 91美女片黄在线观看91美女| 国产精品成人久久久| 久久精品国产久精国产思思| 亚洲国产中文在线| 久久国产成人精品国产成人亚洲| 91色九色蝌蚪| 一本色道久久综合无码人妻| 精品少妇v888av| 希岛爱理av免费一区二区| 中国黄色片免费看| 亚洲一区二区三区在线| 亚洲色欧美另类| 国产在线视频不卡| 国产精品啊啊啊| 日韩中文字幕有码| 欧美一区二区美女| 涩涩视频在线免费看| 一区二区日本| 99久久综合精品| 91亚洲欧美激情| 午夜精品久久久久久久久久久久| 欧美军人男男激情gay| 亚洲欧美激情一区二区三区| 日韩欧美在线视频观看| 老司机午夜在线| 欧洲精品在线一区| 国产一区二区看久久| 9i精品福利一区二区三区| 欧美成人精品xxx| 国产欧美一区二区三区精品观看 | 国产精品不卡一区| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 |