七牛云:基于Go開發(fā)的大數(shù)據(jù)平臺
時間:2023-05-31 19:15:01 | 來源:網(wǎng)站運營
時間:2023-05-31 19:15:01 來源:網(wǎng)站運營
七牛云:基于Go開發(fā)的大數(shù)據(jù)平臺:
內(nèi)容來源:2017年8月5日,七牛云大數(shù)據(jù)高級工程師黨合萱在“Gopher 杭州 meetup”進行《基于Go的大數(shù)據(jù)平臺》演講分享。IT 大咖說作為獨家視頻合作方,經(jīng)主辦方和講者審閱授權(quán)發(fā)布。
閱讀字數(shù):2610 | 7分鐘閱讀
觀看嘉賓完整演講視頻及PPT,請點擊:
http://t.cn/EyW4QVs摘要
大數(shù)據(jù)一直是我們在談?wù)摰脑掝},不管你數(shù)據(jù)到底有多大?黨合萱將給大家?guī)砣碌拇髷?shù)據(jù)處理思路。
什么是Pandora
Pandora是七牛大數(shù)據(jù)團隊及整個系列產(chǎn)品的代號,我們的目標是提供簡單、開放、高效的一站式大數(shù)據(jù)平臺。
系統(tǒng)設(shè)計分析與架構(gòu)
構(gòu)建系統(tǒng)的挑戰(zhàn)在最開始做這個系統(tǒng)的時候,我們先梳理一下有可能會遇到的問題。一個好的系統(tǒng)不僅要解決當下的問題,更要考慮到未來可預(yù)期時間里業(yè)務(wù)上或者數(shù)據(jù)規(guī)模上可能面臨的一些挑戰(zhàn)。
上圖中左邊的三點是我們在業(yè)務(wù)上需要考慮的點,右邊的三點則是我們從具體實現(xiàn)和架構(gòu)上去考慮的地方。
可以看到最核心的地方在于系統(tǒng)需要具備高吞吐、低延遲的能力。
如上圖所示,在這個系統(tǒng)當中,最核心的部分是紅色和藍色的框圖部分。藍色部分主要是負責從消息隊列中拉取數(shù)據(jù)出來,然后經(jīng)過紅色master模塊進行任務(wù)分配和調(diào)度,把拉出來的數(shù)據(jù)導(dǎo)入到下游的各個業(yè)務(wù)模塊中去。
最右邊的綠色模塊是我們的監(jiān)控系統(tǒng),這個監(jiān)控系統(tǒng)從最上層的業(yè)務(wù)指標、鏈路性能,以及機器的健康狀況都可以做收集和監(jiān)控。而黃色框圖部分則是對業(yè)務(wù)和監(jiān)控指標做可視化的展示。
圖中的最頂部是我們提供給用戶的一個可視化的界面,用戶可以在這個界面中進行一些鼠標式的拖拽來創(chuàng)建一個工作流。這個工作流的導(dǎo)出部分體現(xiàn)在導(dǎo)出系統(tǒng)中就是做數(shù)據(jù)的拉取、處理和推送的工作。
多種上下游適配
業(yè)務(wù)架構(gòu)我們從kafka里面拉取數(shù)據(jù),將數(shù)據(jù)進行一定的處理之后推送到下游的各個不同的系統(tǒng)中去,由于下游系統(tǒng)各不相同,所以在這個過程中我們要考慮一下這幾種下游系統(tǒng)在哪些方面有著異同。
導(dǎo)出模型導(dǎo)出模型有兩種,一種是最基本的通用導(dǎo)出模型。接到任務(wù)之后要從上游取數(shù)據(jù),經(jīng)過處理或者過濾后把這個數(shù)據(jù)推送到下面去。
另一種是云存儲導(dǎo)出模型,它在通用導(dǎo)出模型中新增了兩步,即把拉取到的文件存放在本地,然后進行一些壓縮,上傳到云存儲。這樣可以有效地減少文件個數(shù),同時減少云存儲空間的使用,并且能夠降低用戶的成本。
高吞吐/低延遲問題探究
這個問題解決起來是比較困難的,尤其是在數(shù)據(jù)量較大的時候,高吞吐和低延遲各自都有一些困難的點。根據(jù)我們的實踐經(jīng)驗來看,吞吐量方面遇到最大的問題就是資源的利用率不夠高,或者上下游系統(tǒng)吞吐能力不一致,存在短板效應(yīng)。
低延遲問題在很多的情況下其實是對服務(wù)穩(wěn)定性要求,因此我們要注意規(guī)避服務(wù)熱點。
除了這些之外,如果不能及時發(fā)現(xiàn)上下游系統(tǒng)間的負載變化也會導(dǎo)致某一環(huán)節(jié)被打爆。而越是復(fù)雜的系統(tǒng),問題也就越容易在某個不經(jīng)意的環(huán)節(jié)出現(xiàn)。
數(shù)據(jù)預(yù)取
Export server在向下游推數(shù)據(jù)的時候會預(yù)先從上游拉數(shù)據(jù)回來,由此保證網(wǎng)絡(luò)最大的利用率,同時也減少了等待時間,提升導(dǎo)出效率。
預(yù)取時如果無數(shù)據(jù)可取,則休眠1s再取數(shù)據(jù),既然?(后續(xù)還)沒有數(shù)據(jù)則休眠時間加倍,一直到32s為止,過程中如果取到數(shù)據(jù),則休眠時間重置為1s,該機制有效減少了對底層存儲的請求數(shù)量。
數(shù)據(jù)推送協(xié)議優(yōu)化
我們優(yōu)化了export service與logdb之間的數(shù)據(jù)推送協(xié)議。最開始使用的是Json,但是它的序列化和反序列化的性能較差,下游系統(tǒng)中CPU的使用率非常高,影響服務(wù)的整體性能。
經(jīng)過調(diào)研之后我們將Json格式換成了Protobuf。經(jīng)觀察發(fā)現(xiàn)帶寬消耗減少了近一半,吞吐量提升了,CPU的資源消耗也降低了一半以上。
資源優(yōu)化使用
kodo導(dǎo)出為了達到節(jié)省存儲空間的目的,在導(dǎo)出前的converter這一步使用了parquet壓縮,可以有8比1的壓縮比。效果很好,但缺點也同樣明顯。
缺陷就在于消耗大量CPU影響服務(wù),只有在文件較大的情況下才有更好的壓縮比。我們對它做了一些優(yōu)化,控制并發(fā),優(yōu)化壓縮過程的內(nèi)存使用,并精確控制CPU使用。
高可用與水平擴展
master/server架構(gòu)master/server間采用golang rpc通信。server上報心跳證明自己存活,并匯報所執(zhí)行任務(wù)的情況。master向server周期性下發(fā)任務(wù),server管理自身任務(wù)決定哪些要執(zhí)行哪些要丟棄。
master高可用master自身無狀態(tài),身份信息注冊在zookeeper。master failover時主備自動切換。主master丟鎖會自殺,備master搶鎖成為主master。
server高可用server注冊自身,防止單機重復(fù)運行。server注冊每一個任務(wù),防止任務(wù)被重復(fù)執(zhí)行。server高可用,節(jié)點故障時任務(wù)會被調(diào)度到其他正常節(jié)點。
水平擴展資源不足時加入新的機器作為新server,新server從zk上獲取master身份信息,并上報心跳給master。其他任務(wù)被調(diào)度至新server。
自動化運維
系統(tǒng)熱點自動感知與調(diào)整一方面利用日志對服務(wù)做審計、趨勢預(yù)測,宏觀上離線式的預(yù)知一段時間內(nèi)的熱點所在。另一方面依靠服務(wù)自身的狀態(tài)反饋實時微調(diào),修正宏觀預(yù)測結(jié)果。
線上系統(tǒng)現(xiàn)狀
每日處理超過千億數(shù)據(jù)點、百TB級別的數(shù)據(jù)量。線上導(dǎo)出延遲在1分鐘以內(nèi),較少的人工介入。秒級擴容,實時的可視化監(jiān)控系統(tǒng),易用的報警系統(tǒng),自動生成線上日報。
Go的應(yīng)用
我們用Golang做了些什么流式計算、離線計算、日志檢索、時序數(shù)據(jù)庫等一整套服務(wù)的核心代碼都使用Golang開發(fā)。
簡單、高效、的數(shù)據(jù)接入工具logkit,除了pandora之外可以接入多種數(shù)據(jù)庫、kafka、機器metric信息等等。以及全套監(jiān)控工具。
為什么選擇GolangGolang易上手,入門快。降低程序員的心智負擔,可以集中精力在業(yè)務(wù)上。更簡單高效的并發(fā)模型天然的支持分布式服務(wù)的編寫,有豐富的庫可供我們調(diào)用。七牛是國內(nèi)第一批在go語言方面進行實踐的公司,公司內(nèi)部基于golang的rpc、緩存系統(tǒng)等都已經(jīng)打磨的很成熟。
今天的分享就到這里,謝謝大家!
編者:IT大咖說,轉(zhuǎn)載請標明版權(quán)和出處