七牛雲:基於Go開發的大數據平臺


內容來源:2017年8月5日,七牛雲大數據高級工程師黨合萱在「Gopher 杭州 meetup」進行《基於Go的大數據平臺》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。

閱讀字數:2610 | 7分鐘閱讀程序員

嘉賓演講視頻及PPT回顧: suo.im/1h4oJc

摘要

大數據一直是咱們在談論的話題,無論你數據到底有多大?黨合萱將給你們帶來全新的大數據處理思路。golang

什麼是Pandora

Pandora是七牛大數據團隊及整個系列產品的代號,咱們的目標是提供簡單、開放、高效的一站式大數據平臺。數據庫

系統設計分析與架構

構建系統的挑戰

在最開始作這個系統的時候,咱們先梳理一下有可能會遇到的問題。一個好的系統不只要解決當下的問題,更要考慮到將來可預期時間裏業務上或者數據規模上可能面臨的一些挑戰。緩存

上圖中左邊的三點是咱們在業務上須要考慮的點,右邊的三點則是咱們從具體實現和架構上去考慮的地方。微信

能夠看到最核心的地方在於系統須要具有高吞吐、低延遲的能力。網絡

如上圖所示,在這個系統當中,最核心的部分是紅色和藍色的框圖部分。藍色部分主要是負責從消息隊列中拉取數據出來,而後通過紅色master模塊進行任務分配和調度,把拉出來的數據導入到下游的各個業務模塊中去。架構

最右邊的綠色模塊是咱們的監控系統,這個監控系統從最上層的業務指標、鏈路性能,以及機器的健康情況均可以作收集和監控。而黃色框圖部分則是對業務和監控指標作可視化的展現。併發

圖中的最頂部是咱們提供給用戶的一個可視化的界面,用戶能夠在這個界面中進行一些鼠標式的拖拽來建立一個工做流。這個工做流的導出部分體如今導出系統中就是作數據的拉取、處理和推送的工做。運維

多種上下游適配

業務架構

咱們從kafka裏面拉取數據,將數據進行必定的處理以後推送到下游的各個不一樣的系統中去,因爲下游系統各不相同,因此在這個過程當中咱們要考慮一下這幾種下游系統在哪些方面有着異同。分佈式

導出模型

導出模型有兩種,一種是最基本的通用導出模型。接到任務以後要從上游取數據,通過處理或者過濾後把這個數據推送到下面去。

另外一種是雲存儲導出模型,它在通用導出模型中新增了兩步,即把拉取到的文件存放在本地,而後進行一些壓縮,上傳到雲存儲。這樣能夠有效地減小文件個數,同時減小云存儲空間的使用,而且可以下降用戶的成本。

高吞吐/低延遲問題探究

這個問題解決起來是比較困難的,尤爲是在數據量較大的時候,高吞吐和低延遲各自都有一些困難的點。根據咱們的實踐經驗來看,吞吐量方面遇到最大的問題就是資源的利用率不夠高,或者上下游系統吞吐能力不一致,存在短板效應。

低延遲問題在不少的狀況下實際上是對服務穩定性要求,所以咱們要注意規避服務熱點。

除了這些以外,若是不能及時發現上下游系統間的負載變化也會致使某一環節被打爆。而越是複雜的系統,問題也就越容易在某個不經意的環節出現。

數據預取

Export server在向下遊推數據的時候會預先從上游拉數據回來,由此保證網絡最大的利用率,同時也減小了等待時間,提高導出效率。

預取時若是無數據可取,則休眠1s再取數據,既然?(後續還)沒有數據則休眠時間加倍,一直到32s爲止,過程當中若是取到數據,則休眠時間重置爲1s,該機制有效減小了對底層存儲的請求數量。

數據推送協議優化

咱們優化了export service與logdb之間的數據推送協議。最開始使用的是Json,可是它的序列化和反序列化的性能較差,下游系統中CPU的使用率很是高,影響服務的總體性能。

通過調研以後咱們將Json格式換成了Protobuf。經觀察發現帶寬消耗減小了近一半,吞吐量提高了,CPU的資源消耗也下降了一半以上。

資源優化使用

kodo導出爲了達到節省存儲空間的目的,在導出前的converter這一步使用了parquet壓縮,能夠有8比1的壓縮比。效果很好,但缺點也一樣明顯。

缺陷就在於消耗大量CPU影響服務,只有在文件較大的狀況下才有更好的壓縮比。咱們對它作了一些優化,控制併發,優化壓縮過程的內存使用,並精確控制CPU使用。

高可用與水平擴展

master/server架構

master/server間採用golang rpc通訊。server上報心跳證實本身存活,並彙報所執行任務的狀況。master向server週期性下發任務,server管理自身任務決定哪些要執行哪些要丟棄。

master高可用

master自身無狀態,身份信息註冊在zookeeper。master failover時主備自動切換。主master丟鎖會自殺,備master搶鎖成爲主master。

server高可用

server註冊自身,防止單機重複運行。server註冊每個任務,防止任務被重複執行。server高可用,節點故障時任務會被調度到其餘正常節點。

水平擴展

資源不足時加入新的機器做爲新server,新server從zk上獲取master身份信息,並上報心跳給master。其餘任務被調度至新server。

自動化運維

系統熱點自動感知與調整

一方面利用日誌對服務作審計、趨勢預測,宏觀上離線式的預知一段時間內的熱點所在。另外一方面依靠服務自身的狀態反饋實時微調,修正宏觀預測結果。

線上系統現狀

每日處理超過千億數據點、百TB級別的數據量。線上導出延遲在1分鐘之內,較少的人工介入。秒級擴容,實時的可視化監控系統,易用的報警系統,自動生成線上日報。

Go的應用

咱們用Golang作了些什麼

流式計算、離線計算、日誌檢索、時序數據庫等一整套服務的核心代碼都使用Golang開發。

簡單、高效、的數據接入工具logkit,除了pandora以外能夠接入多種數據庫、kafka、機器metric信息等等。以及全套監控工具。

爲何選擇Golang

Golang易上手,入門快。下降程序員的心智負擔,能夠集中精力在業務上。更簡單高效的併發模型自然的支持分佈式服務的編寫,有豐富的庫可供咱們調用。七牛是國內第一批在go語言方面進行實踐的公司,公司內部基於golang的rpc、緩存系統等都已經打磨的很成熟。

今天的分享就到這裏,謝謝你們!

相關文章
相關標籤/搜索