七牛數(shù)據(jù)處理架構(gòu)變遷
據(jù)統(tǒng)計(jì),互聯(lián)網(wǎng)數(shù)據(jù)量正以每三年翻一番的速度膨脹,其中,95%以上都是非結(jié)構(gòu)化數(shù)據(jù),且這個(gè)比例仍在不斷提升。如今,互聯(lián)網(wǎng)已全面覆蓋大家生活的方方面面,每個(gè)人的消費(fèi)行為、娛樂(lè)行為和社交行為都將產(chǎn)生海量的圖片、音視頻、網(wǎng)絡(luò)日志等非結(jié)構(gòu)化數(shù)據(jù)。非結(jié)構(gòu)化數(shù)據(jù)的持續(xù)在線及數(shù)據(jù)種類的多樣對(duì)數(shù)據(jù)的處理提出了很高的要求。作為國(guó)內(nèi)最專業(yè)的數(shù)據(jù)管理平臺(tái),七牛已覆蓋國(guó)內(nèi)50%以上的互聯(lián)網(wǎng)用戶。那么,七牛數(shù)據(jù)處理架構(gòu)都經(jīng)過(guò)了哪些演變呢?小編帶你一探究竟。
七牛云存儲(chǔ)的數(shù)據(jù)處理主要分為實(shí)時(shí)處理和異步處理,對(duì)于較小的文件(如圖片),一般推薦使用實(shí)時(shí)處理的方式。
對(duì)于實(shí)時(shí)處理,用戶可簡(jiǎn)單通過(guò)URL對(duì)已有的文件進(jìn)行實(shí)時(shí)處理。當(dāng)用戶將文件上傳到七牛KODO對(duì)象存儲(chǔ)平臺(tái),會(huì)得到相應(yīng)的key,可通過(guò)URL訪問(wèn)。例如http://xxx.com/key,當(dāng)需要對(duì)該文件進(jìn)行實(shí)時(shí)處理時(shí),可以通過(guò)http://xxx.com/key?<fop>/<param1_value>/<param2_name>/<param2_value>/……進(jìn)行處理。具體操作參數(shù)可以參考七牛官方文檔。參數(shù)過(guò)多過(guò)長(zhǎng)時(shí)可以設(shè)置樣式,若涉及操作復(fù)雜多變可以采用管道技術(shù)。
異步請(qǐng)求可以通過(guò)Portal、命令行工具、SDK發(fā)起請(qǐng)求。一般適合處理較大文件,比如較大的音視頻,這種情況下實(shí)時(shí)響應(yīng)的效果并不理想,則可以采用異步持久化處理方式,返回的結(jié)果是處理后的文件在七牛云存儲(chǔ)中的相關(guān)元信息(bucket、key等),用戶可以通過(guò)設(shè)置回調(diào)服務(wù)器地址,將結(jié)果Post到自己的接收服務(wù)器,也可以主動(dòng)查詢數(shù)據(jù)處理狀態(tài)和結(jié)果信息。
上圖描述了簡(jiǎn)單的實(shí)時(shí)處理的基本架構(gòu),用戶可以通過(guò)七牛云存儲(chǔ)的I/O入口發(fā)起請(qǐng)求,判斷出是合法的數(shù)據(jù)處理請(qǐng)求后,就會(huì)將其傳給數(shù)據(jù)處理調(diào)度服務(wù),通過(guò)調(diào)度分發(fā)給計(jì)算處理集群。每個(gè)worker處理的流程為參數(shù)檢查->下載數(shù)據(jù)->結(jié)合原數(shù)據(jù)信息對(duì)參數(shù)進(jìn)行檢查(若數(shù)據(jù)的相關(guān)信息不需要download下來(lái)就可以獲取,那么可以和前面的步驟對(duì)調(diào))->自己編寫(xiě)算法實(shí)現(xiàn)或者調(diào)用工具對(duì)數(shù)據(jù)進(jìn)行處理,比如轉(zhuǎn)碼、圖像縮略等操作->結(jié)果返回(異步請(qǐng)求一般會(huì)持久化保存,通過(guò)對(duì)象存儲(chǔ)服務(wù),將結(jié)果上傳,得到文件上傳后的相關(guān)信息,例如bucket、key等,返回的是文件的相關(guān)信息)。這里可以簡(jiǎn)單的把數(shù)據(jù)處理調(diào)度看做負(fù)載均衡器,請(qǐng)求根據(jù)接口判斷,通過(guò)調(diào)度指向?qū)?yīng)服務(wù),然后將結(jié)果原路返回給用戶。
上面的結(jié)構(gòu)簡(jiǎn)單清晰,但同時(shí)面臨幾個(gè)問(wèn)題:
1.數(shù)據(jù)處理調(diào)度這個(gè)服務(wù)相對(duì)比較重,它不僅僅需要實(shí)現(xiàn)負(fù)載均衡,還需要對(duì)所有處理終端服務(wù)進(jìn)行管理,單臺(tái)計(jì)算型服務(wù)器上可能有多個(gè)服務(wù)worker(多個(gè)圖片處理、音視頻處理服務(wù)worker),隨著業(yè)務(wù)發(fā)展,管理的worker數(shù)量是非常多的。
2.內(nèi)部實(shí)現(xiàn)緩存機(jī)制,使得讀寫(xiě)緩存的流量全部集中在數(shù)據(jù)處理調(diào)度這個(gè)服務(wù)
3.數(shù)據(jù)的處理離不開(kāi)原數(shù)據(jù),一般我們可以在worker中待前面的步驟順利通過(guò)后,調(diào)用七牛的對(duì)象存儲(chǔ)服務(wù)開(kāi)始下載,那么每個(gè)worker都必須配置對(duì)象存儲(chǔ)服務(wù)的地址信息,然后才能download原數(shù)據(jù),這套地址信息對(duì)所有worker都是共用的。前面提到1臺(tái)物理機(jī)器上可能有多個(gè)服務(wù)worker,每個(gè)worker自身有不同的屬性參數(shù)(最起碼端口號(hào)不同),而且可能機(jī)器上的服務(wù)worker有Image Worker也有Video Worker,共用一套配置顯然不能滿足,若每個(gè)worker都將這些普遍共用的信息寫(xiě)入配置,那么維護(hù)起來(lái)非常不方便。因此,七牛的數(shù)據(jù)處理架構(gòu)有了一些演變,就有了如下的架構(gòu)。
首先,將Data Cache獨(dú)立出來(lái),理由非常簡(jiǎn)單,在很多環(huán)節(jié)都需要緩存服務(wù),并且根據(jù)緩存數(shù)據(jù)大小、熱度選擇是SSD或者HDD進(jìn)行緩存,小文件且熱度高適合SSD,大文件且熱度較低適合HDD。
其次,為每臺(tái)服務(wù)器添加了Agent服務(wù)。一臺(tái)服務(wù)器可能有多個(gè)worker且可能是不同種的worker,數(shù)據(jù)處理調(diào)度服務(wù)只需要知道該請(qǐng)求的對(duì)應(yīng)worker存在于哪些機(jī)器即可,剩下的判斷則交由agent處理。因?yàn)檎麄€(gè)計(jì)算集群的服務(wù)器存在性能差異,采用權(quán)重輪詢調(diào)度,這時(shí)某個(gè)worker對(duì)應(yīng)所在的機(jī)器一目了然,也不需要對(duì)worker整體標(biāo)記序號(hào),只需要知道某臺(tái)服務(wù)器有哪些worker。Agent可以承擔(dān)download原數(shù)據(jù)的責(zé)任,相當(dāng)于提取各個(gè)worker的一些公共操作都可以都交給Agent,同時(shí),Agent分擔(dān)了向Data Cache寫(xiě)入數(shù)據(jù)的任務(wù)。
值得一提的是,對(duì)于返回失敗的數(shù)據(jù)也可以緩存。假如請(qǐng)求量巨大,每天100億條請(qǐng)求,確認(rèn)是客戶端請(qǐng)求信息不當(dāng)?shù)腻e(cuò)誤約占5%,那么就有5億錯(cuò)誤請(qǐng)求,即使服務(wù)迭代升級(jí),也會(huì)保持原有接口功能不變。那么,若是同一個(gè)文件的同一個(gè)錯(cuò)誤請(qǐng)求,基本上必然重現(xiàn),這樣的請(qǐng)求實(shí)際上就可以被緩存,一來(lái)用戶那邊獲得快速響應(yīng),二來(lái)減少計(jì)算壓力而且減少拖取數(shù)據(jù)的流量。后來(lái)發(fā)現(xiàn)這個(gè)方案存在一個(gè)瑕疵,就是給Data Cache造成的壓力略微變大,且有部分錯(cuò)誤請(qǐng)求響應(yīng)并沒(méi)有加快,至少為了獲得緩存數(shù)據(jù)而讀盤會(huì)有時(shí)間消耗。先前worker的設(shè)計(jì)是檢查參數(shù)是否合法->download數(shù)據(jù)->結(jié)合原數(shù)據(jù)信息檢查參數(shù)是否合法。這里我們對(duì)錯(cuò)誤請(qǐng)求做了細(xì)化,單獨(dú)屏蔽了download數(shù)據(jù)之前所產(chǎn)生的錯(cuò)誤請(qǐng)求,因?yàn)檫@部分響應(yīng)非常快,本身也沒(méi)有多少計(jì)算,無(wú)需寫(xiě)入緩存。
***,通過(guò)Discover服務(wù)來(lái)監(jiān)控服務(wù)情況的變化,所有的Agent和Worker都需要向Discover上報(bào)心跳狀態(tài),Load Balancer會(huì)從Discover讀取各個(gè)服務(wù)狀態(tài)、服務(wù)相關(guān)信息(地址、權(quán)重等),同時(shí)允許人工通過(guò)Discover修改各個(gè)服務(wù)的狀態(tài)。
異步請(qǐng)求的架構(gòu),則是在整個(gè)實(shí)時(shí)處理架構(gòu)前面加上異步隊(duì)列服務(wù)、異步請(qǐng)求狀態(tài)服務(wù)等,每個(gè)worker的處理結(jié)果需要持久化,返回的是結(jié)果文件持久化保存后的相關(guān)信息。
現(xiàn)在的整個(gè)數(shù)據(jù)處理架構(gòu),看上去中規(guī)中矩,同時(shí)也存在一些弊端,即使做到了可以對(duì)單條請(qǐng)求大致消耗資源的預(yù)估,經(jīng)過(guò)多次數(shù)據(jù)回滾壓力測(cè)試以及峰值比對(duì)確定一臺(tái)服務(wù)器應(yīng)該部署多少個(gè)worker,實(shí)現(xiàn)較為合理的調(diào)度,但機(jī)器上的worker數(shù)量基本上是固定的,無(wú)法跨機(jī)器實(shí)現(xiàn)彈性的實(shí)時(shí)調(diào)度,服務(wù)器的資源仍然不能充分利用。例如,當(dāng)實(shí)時(shí)處理服務(wù)的機(jī)器在非峰值階段,可以將異步請(qǐng)求的服務(wù)worker遷移到該機(jī)器上,分擔(dān)一部分任務(wù),使得每臺(tái)機(jī)器的負(fù)載較為均衡;當(dāng)實(shí)時(shí)請(qǐng)求到達(dá)峰值的時(shí)候,可以遷移部分worker到處理公有隊(duì)列異步請(qǐng)求的機(jī)器(付費(fèi)的私有隊(duì)列用戶不受影響),分擔(dān)部分壓力。
因此,七牛后續(xù)將會(huì)對(duì)整個(gè)數(shù)據(jù)處理的架構(gòu)做一些關(guān)于Container的嘗試,希望打破原有的一些束縛,帶來(lái)比較好的效果,可以把a(bǔ)gent和worker放在一個(gè)Container內(nèi)部,成為1:1的關(guān)系。Container自身具有隔離性,可以依據(jù)系統(tǒng)的資源情況選擇這臺(tái)機(jī)器有多少Container運(yùn)行。當(dāng)某一臺(tái)服務(wù)器資源已經(jīng)接近飽和時(shí),就會(huì)在下一臺(tái)服務(wù)器上啟動(dòng)一個(gè)新的Container繼續(xù)接收請(qǐng)求。一旦某臺(tái)服務(wù)器空閑下來(lái),那么這臺(tái)服務(wù)器就屬于Container待運(yùn)行的機(jī)器,整個(gè)計(jì)算服務(wù)器集群就是個(gè)資源池,worker無(wú)需被機(jī)器束縛,哪里空閑就啟動(dòng)在哪里,再也不用擔(dān)心機(jī)器資源浪費(fèi)了。