七牛雲:基於Go開發的大資料平臺

IT大咖說發表於2019-03-04
七牛雲:基於Go開發的大資料平臺
內容來源:2017年8月5日,七牛雲大資料高階工程師黨合萱在“Gopher 杭州 meetup”進行《基於Go的大資料平臺》演講分享。IT 大咖說(微信id:itdakashuo)作為獨家視訊合作方,經主辦方和講者審閱授權釋出。

閱讀字數:2610 | 7分鐘閱讀

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

摘要

大資料一直是我們在談論的話題,不管你資料到底有多大?黨合萱將給大家帶來全新的大資料處理思路。

什麼是Pandora

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

七牛雲:基於Go開發的大資料平臺

系統設計分析與架構

構建系統的挑戰

在最開始做這個系統的時候,我們先梳理一下有可能會遇到的問題。一個好的系統不僅要解決當下的問題,更要考慮到未來可預期時間裡業務上或者資料規模上可能面臨的一些挑戰。

七牛雲:基於Go開發的大資料平臺

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

可以看到最核心的地方在於系統需要具備高吞吐、低延遲的能力。

七牛雲:基於Go開發的大資料平臺

如上圖所示,在這個系統當中,最核心的部分是紅色和藍色的框圖部分。藍色部分主要是負責從訊息佇列中拉取資料出來,然後經過紅色master模組進行任務分配和排程,把拉出來的資料匯入到下游的各個業務模組中去。

最右邊的綠色模組是我們的監控系統,這個監控系統從最上層的業務指標、鏈路效能,以及機器的健康狀況都可以做收集和監控。而黃色框圖部分則是對業務和監控指標做視覺化的展示。

圖中的最頂部是我們提供給使用者的一個視覺化的介面,使用者可以在這個介面中進行一些滑鼠式的拖拽來建立一個工作流。這個工作流的匯出部分體現在匯出系統中就是做資料的拉取、處理和推送的工作。

多種上下游適配

業務架構

七牛雲:基於Go開發的大資料平臺

我們從kafka裡面拉取資料,將資料進行一定的處理之後推送到下游的各個不同的系統中去,由於下游系統各不相同,所以在這個過程中我們要考慮一下這幾種下游系統在哪些方面有著異同。

匯出模型

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

七牛雲:基於Go開發的大資料平臺

另一種是雲端儲存匯出模型,它在通用匯出模型中新增了兩步,即把拉取到的檔案存放在本地,然後進行一些壓縮,上傳到雲端儲存。這樣可以有效地減少檔案個數,同時減少雲端儲存空間的使用,並且能夠降低使用者的成本。

高吞吐/低延遲問題探究

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

低延遲問題在很多的情況下其實是對服務穩定性要求,因此我們要注意規避服務熱點。

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

資料預取

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管理自身任務決定哪些要執行哪些要丟棄。

七牛雲:基於Go開發的大資料平臺

master高可用

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

七牛雲:基於Go開發的大資料平臺

server高可用

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

水平擴充套件

資源不足時加入新的機器作為新server,新server從zk上獲取master身份資訊,並上報心跳給master。其他任務被排程至新server。

自動化運維

系統熱點自動感知與調整

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

線上系統現狀

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

Go的應用

我們用Golang做了些什麼

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

簡單、高效、的資料接入工具logkit,除了pandora之外可以接入多種資料庫、kafka、機器metric資訊等等。以及全套監控工具。

為什麼選擇Golang

Golang易上手,入門快。降低程式設計師的心智負擔,可以集中精力在業務上。更簡單高效的併發模型天然的支援分散式服務的編寫,有豐富的庫可供我們呼叫。七牛是國內第一批在go語言方面進行實踐的公司,公司內部基於golang的rpc、快取系統等都已經打磨的很成熟。

今天的分享就到這裡,謝謝大家!


相關文章