1. 程式人生 > >創業公司如何構建一個分散式檔案儲存系統

創業公司如何構建一個分散式檔案儲存系統

有時候初創企業需要快速搭建一個檔案儲存平臺,滿足企業內專案的圖片、視訊、文字等檔案的儲存;並且即使在讀寫檔案的時候,磁碟壞了、伺服器宕機了、交換機壞了、機櫃掉電了甚至機房掛了,使用者還能正常訪問。你同時可能希望公司業務快速增長後,訪問量猛增的時候能夠儘量少的或者不開發程式碼,通過擴容硬體就能解決問題。為了解決這些問題,我們設計了自己的儲存系統WFS。 最基本的分散式檔案儲存系統需要滿足以下幾個原則: 1、伸縮性 伸縮性是指系統可以根據需求和成本調整自身處理能力的一種能力。伸縮性常常意味著系統可以改變自己的處理能力以滿足更多使用者訪問、處理更多資料而不會對使用者體驗造成任何影響,伸縮性不僅需要伸(即擴容),有時候還需要縮(即縮容) 2、可用性 無論是非預期的服務異常還是正常的服務程式維護,都要保證7X24小時內,服務的可用性。一般都是使用SLA(Service Level Agrement)測量系統的高可用性,就是大家經常看到的幾個9,比如某知名網站做到4個9以上的可用性,是啥概念呢,就是故障發生到恢復的時間,也就是服務不可用的時間一天內不超過8.66秒,一年內不超過52.56分鐘。 衡量一個系統架構設計是否滿足高可用的目標,就是假設系統中任何一臺或者多臺伺服器宕機時,以及出現各種不可預期的問題時候,系統整體是否依然可用。 3、避免過度設計 避免過度設計, 早期先構建一個比較合理的抽象架構,滿足基本的業務需求,然後迭代的增加新的功能需求;不是一開始就設計好全部功能以應對自己認為可能會出現的功能。好的設計方法一定是可以在後期逐漸新增新功能特性,而不是一開始就開發一個超級大的系統。 有哪些關鍵的技術點和難點要注意呢? 網路、磁碟、伺服器任何一個環節出問題的時候,應該不影響系統的正常使用。 網路斷了有備用網路可用切換。 磁碟壞了有備用磁碟可用,換了新磁碟後資料可用自動恢復。 伺服器宕機後有備用伺服器可以使用,伺服器恢復正常後,伺服器上的資料可以自動同步。 系統架構:
Client: 主要是提供了訪問檔案的API介面,例如:上傳檔案、下載檔案、刪除檔案、判斷檔案是否存在等功能;使用TCP傳輸,私有協議。 NameServer:  主要是起到排程作用,管理所有的DataServer服務,客戶端訪問哪個DataServer,是由NameServer決定的;NameServer服務記錄了所有的Group和DataServer伺服器的狀態,磁碟使用率等資訊;每個NameServer之間是完全對等的。 Storage Cluster: 儲存叢集,有多個Group組成;理論上Storage Cluster裡的Group是可以無限擴容的,當一個Group儲存滿的時候可以再擴容一個Group,只需要購置硬體,不需要新開發程式。 Group:  邏輯卷。有多個DataServer組成。 DataServer: 資料儲存叢集,主要是提供資料儲存的服務;接收上傳檔案和下載檔案的請求,並把接收的檔案儲存在GlusterFS叢集上,元資訊儲存在DC叢集上。 IdServer:  提供生成唯一檔案ID的服務。 DC叢集: 儲存檔案的元資訊資料,由快取和資料庫組成。 GlusterFS叢集: 儲存真正的檔案資料。底層儲存檔案使用GlusterFS 管理所有的檔案。 描述:
該檔案儲存系統借鑑了FastDFS一些架構思想,但是與FastDFS又有很大的不同。 檔案儲存系統是主要由N+1個NameServer節點和多個DataServer節點組成;NameServer通過心跳對DataServer的狀態進行監測,DataServer會通過心跳,把本身的狀態同步給NameServer,包括存活時長、磁碟狀態、伺服器狀態等;每個DataServer都要主動連線每個NameServer,實時上報自己狀態,每個NameServer的資訊是對等的,每個NameServer都可以提供服務,所以某個NameServer掛掉後Client可繼續訪問其他NameServer;同理如果一臺DataServer掛掉後,NameServer會監測到,把他剔除出去;每個DataServer對應一個GlusterFs的掛載點,一個掛載點對應一個GlusterFS的一個卷。 寫檔案流程:

如圖所示,客戶端首先向NameServer發起寫請求,NameServer需要根據Group,以及每個Group上的DataServer的容量、負載、狀態等情況來選擇一個可寫的DataServer;接著,客戶端向選擇的DataServer寫資料,DataServer首先會去IdServer獲取一個檔案ID,然後把資料寫到GlusterFS裡,GlusterFS 負責儲存檔案資料,並同步到備份磁碟;檔案資料寫成功後,DataServer負責把檔案Meta資訊寫入DC;這些操作完成後給客戶端返回操作結果。如果中間發生任何錯誤,客戶端可以嘗試從第一步開始重試。DataServer支援流式寫資料。 每個寫操作過程中NameServer會記錄Group資訊,標示檔案儲存到哪個Group上;DataServer上會記錄檔案ID,並把檔案ID返回給客戶端,客戶端根據檔案ID訪問檔案。 讀檔案流程:


客戶端讀取檔案的時候,首先訪問NameServer,NameServer查找出檔案所在的Group,然後在Group裡選取出一個DataServer;客戶端得到可以讀取檔案的DataServer資訊,連線DataServer根據檔案ID讀取檔案資料。 伸縮性: 這裡的伸縮可以支援兩種伸縮, 一種是可以Group內進行伸縮,即支援擴容DataServer伺服器,達到承載更多業務能力。 另一種是可以對Group進行伸縮,即支援擴容一個Group,達到承載更多業務的能力。 可用性: NameServer和DataServer都是有多臺伺服器組成,保證其中一臺伺服器宕機不影響系統的正常使用。 討論: 1、資料的去重問題? 可以對檔案進行MD5或者SHA1等做Hash演算法,計算其指紋,檔案寫入前可以先去去重系統查詢是否存在指紋,如果存在基本可以認為是重複檔案了。 2、GlusterFS本身支援叢集了,為什麼還要構造 NameServer和DataServer 1)降低GlusterFS叢集太大造成的風險。 2)DataServer可以支援豐富請求,比如支援圖片處理,支援HTTP,熱資料快取,都可以在這一層處理。 3、叢集是否可以增加快取? 1)每臺DataServer增加SSD盤。 2)搭建一套快取服務。