今年三月,Netflix在博客中推出了一系列文章,介紹了該公司設(shè)計(jì)的一個(gè)運(yùn)維指標(biāo)處理平臺(tái),名為Mantis。在這個(gè)平臺(tái)上可進(jìn)行細(xì)粒度、設(shè)備級(jí)別的事件推送,并捕獲運(yùn)維相關(guān)的指標(biāo)。它使得Netflix能夠構(gòu)建具備極細(xì)粒度、實(shí)時(shí)的數(shù)據(jù)觀察應(yīng)用,通過(guò)這些應(yīng)用能夠深刻地了解Netflix終端用戶(hù)的設(shè)備與AWS服務(wù)之間的互操作,這些功能包括運(yùn)維方面的儀表板,以及通過(guò)SPS的分析實(shí)現(xiàn)的單個(gè)節(jié)目級(jí)別的警告功能。
Netflix現(xiàn)有的服務(wù)級(jí)別監(jiān)控系統(tǒng)并不適用于理解與診斷在具體某個(gè)特定用戶(hù)、設(shè)備和娛樂(lè)節(jié)目的環(huán)境中,與設(shè)備級(jí)別行為相關(guān)的問(wèn)題。這些用戶(hù)、設(shè)備與節(jié)目的組合形成了一種資產(chǎn),而數(shù)據(jù)的捕獲、轉(zhuǎn)換、報(bào)表生成以及警告就是基于這些資產(chǎn)進(jìn)行的。由Mantis所驅(qū)動(dòng)的異常檢測(cè)功能讓工程人員能夠跟蹤每種資產(chǎn)的各種事件,使他們能夠快速地對(duì)生產(chǎn)環(huán)境中的問(wèn)題進(jìn)行響應(yīng),并得知受到影響的用戶(hù)群體。而這些能力是作用在一個(gè)高處理量、高基數(shù)的實(shí)時(shí)流處理以及批量數(shù)據(jù)處理的環(huán)境中實(shí)現(xiàn)的。
Mantis與Netflix現(xiàn)有的基礎(chǔ)設(shè)施實(shí)現(xiàn)了良好的集成,允許開(kāi)發(fā)者及其應(yīng)用提交用于生成事件、處理事件和查詢(xún)事件的各種作業(yè)。這些事件來(lái)自于約20種不同的數(shù)據(jù)源,包括Zuul和API等服務(wù)、個(gè)性化和點(diǎn)播服務(wù)、以及設(shè)備日志數(shù)據(jù)等等。事件生成者與調(diào)用者之間的解耦實(shí)現(xiàn)了這兩者之間的隔離,為生產(chǎn)環(huán)境中的異常檢測(cè)和修復(fù)提供了更大的靈活性。
該系統(tǒng)的架構(gòu)基于Apache Mesos設(shè)計(jì),它提供了一種處于應(yīng)用開(kāi)發(fā)者與EC2服務(wù)器集群之間的抽象層,作為流處理作業(yè)計(jì)算資源的共享池。應(yīng)用開(kāi)發(fā)者可通過(guò)一系列API或某個(gè)圖形用戶(hù)界面對(duì)作業(yè)進(jìn)行配置,并可在之后對(duì)作業(yè)的配置進(jìn)行編輯,以及查詢(xún)當(dāng)前各項(xiàng)指標(biāo)。應(yīng)用開(kāi)發(fā)者可以基于這些數(shù)據(jù)構(gòu)建自己的應(yīng)用程序,同時(shí)又與Mantis的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)保持了解耦。
Mantis作業(yè)具備不同的消息保證級(jí)別,遵循Kafka語(yǔ)義,例如“最多一次”可保證傳遞,以及“至少一次”可保證傳遞。曾有人向Mantis的工程師Neeraj Joshi詢(xún)問(wèn)Mantis為何不使用其他架構(gòu)方案,包括Spark Streaming。Joshi指出,
基于Kafka的實(shí)現(xiàn)對(duì)于資源的調(diào)度具備更多的控制能力,因此我們可以選擇更智能的分配方式,例如binpack算法等等(同時(shí)也讓我們能夠?qū)ψ鳂I(yè)的處理進(jìn)行擴(kuò)展)。
Mantis的設(shè)計(jì)中包括一個(gè)master/agent的集群模型,并使用了Frenzo。Frenzo是一個(gè)資源管理器,它最近剛剛成為一個(gè)開(kāi)源項(xiàng)目,作為一個(gè)Java的調(diào)度器庫(kù),它可以通過(guò)在Mesos工作集群中新增與刪除實(shí)例的方式實(shí)現(xiàn)自動(dòng)伸縮。伸縮的標(biāo)準(zhǔn)取決于資源使用率指標(biāo)、作業(yè)的調(diào)度時(shí)間,以及通過(guò)資源使用率儀表板對(duì)作業(yè)進(jìn)行的人工操作等等。Fenzo可基于作業(yè)調(diào)度時(shí)間以及當(dāng)前的資源使用情況動(dòng)態(tài)地分配EC2實(shí)例。作業(yè)管理器可提供元數(shù)據(jù)保留、SLA、部署位置、作業(yè)拓?fù)浣Y(jié)構(gòu)以及生命周期等信息。
Mantis能夠執(zhí)行的任務(wù)包括流處理、具有背壓感知性的非阻塞性作業(yè)、數(shù)據(jù)轉(zhuǎn)換以及異步結(jié)果存儲(chǔ)。對(duì)于基本的轉(zhuǎn)換/聚合等用例,作業(yè)可以定義為一個(gè)單獨(dú)的階段。而對(duì)于高處理量、高基數(shù)的事件流,也可以將作業(yè)定義為多個(gè)階段進(jìn)行分片與處理等操作。
Netflix的工程師Nick Mahilani提到了Mantis的作業(yè)定制化、用戶(hù)自定義的作業(yè)以及內(nèi)部的實(shí)現(xiàn)細(xì)節(jié):
系統(tǒng)提供了一些可重用的作業(yè),用戶(hù)在提交這些作業(yè)時(shí)能夠傳遞不同的參數(shù)集。舉例來(lái)說(shuō),某些作業(yè)通過(guò)不同參數(shù)可連接至不同的來(lái)源、根據(jù)不同的key進(jìn)行分組、或基于閥值參數(shù)進(jìn)行異常檢測(cè)。某些作業(yè)還能夠接受被動(dòng)態(tài)編譯為模板作業(yè)的參數(shù)……
用戶(hù)可自行開(kāi)發(fā)以作業(yè)方式進(jìn)行提交的新應(yīng)用,他們可專(zhuān)注于作業(yè)本身的編寫(xiě),而無(wú)需考慮擴(kuò)展或資源設(shè)置方面的問(wèn)題。在實(shí)現(xiàn)Mantis作業(yè)時(shí)需要引入Mantis運(yùn)行時(shí)庫(kù),并實(shí)現(xiàn)某個(gè)Java接口。該作業(yè)將被傳遞一個(gè)RxJava Observable
據(jù)報(bào)告顯示,在處理運(yùn)維用例時(shí),Mantis能夠充分利用服務(wù)器上的網(wǎng)卡,同時(shí)保持很少的CPU占用。
查看英文原文:Operational Data Stream and Batch Processing at Netflix with Mantis