每個程式設計師都應該瞭解的分散式儲存那些事
儲存難做一是對於整體需求把握,儲存定位是什麼服務於什麼場景,再有就是儲存怎麼設計,設計一套儲存架構是一件很難的事,涉及擴充套件性、維護性、易用性,實現是一件更難的事情涉及單機儲存,分散式儲存的話還涉及分散式相關各種概念原理,每一個環節都不簡單,造成儲存系統是一個複雜且不易於實現的系統。
當業務剛起步時資料很小時,或者使用者很小時,儲存問題比較簡單,使用單機資料庫就可以解決比如mysql,隨著業務發展帶來訪問量增加以及資料量增加,單機就出現了效能瓶頸以及儲存量的瓶頸。
單機效能或者訪問量承受不住,就需要對儲存架構進行調整,進行讀寫分離,讀寫分離之後可以將寫和讀分開,降低儲存負載,從而解決在這個時段上的儲存壓力。
在隨著業務發展,讀寫分離又扛不住了就需要分散式,分散式本身能帶來容量和效能以及處理資料量大量提升,但也相應帶來一些挑戰,比如資料複製,資料一致性,分散式系統可用性,以及分散式系統複雜性,也面臨由於分散式系統帶來複雜維護管理成本。
首先應該從開源方案入手,看是否有符合業務需求方案,拿來使用,這樣是比較合理也是成本較低方式,但也會有些問題,比如開源方案存在bug,而bug修復又比較慢,這是使用開源方案需要注意的問題,再有如果是線上核心系統,開源儲存穩定性決定著線上系統穩定,這是關鍵一件事,對於使用開源系統要做詳細調查研究以及測試。不然對於專案不可控,可能會產生災難性影響。
開源不滿足業務需求的話,就需要自己研發,對於儲存系統研發成本還是很高的。當有自研想法後,就需要研發團隊深入去研究,會發現儲存系統幾乎涉及計算機方方面面。
儲存是一個綜合性系統涉及磁碟、記憶體、網路、cpu、資料結構、演算法、多執行緒等多個技術領域,整個系統每個環節都需要是優化的,才能使整個系統是效能是高的。這個過程需要對於磁碟比如傳統STAT以及基於SSD磁碟有比較深入認知,才能將磁碟運用好,傳統磁碟隨機讀寫qps都是很低的幾百qps的數量級,STAT比較好的使用方式批量順序讀寫,避免隨機讀寫。SSD雖然隨機讀取速度相比於STAT快很多,但SSD磁碟存在寫放大問題,不同於傳統磁碟SSD需要擦除塊內容才能寫入,而通常塊比寫入資料大很多倍,從而產生寫放大問題。
關於記憶體,儲存系統要設計好快取,通過記憶體快取來提升儲存系統整體效能。但保持記憶體中資料與磁碟資料一致是一件非常複雜事情,再有就是如果系統過於依賴快取,重啟後資料不在快取,這種情況下磁碟會承載過大壓力,從而導致系統負載過重或者不可用。
關於網路,單機儲存也需要網路,為了架構合理性以及易維護性,儲存和業務一般是分開的,這就需要通過網路方式來提供服務,這時一個高效的網路系統就至關重要了。因為網路傳輸慢或者網路模組處理慢會導致整個系統tps、ops下降。再有網路需要注意網路是千兆還是萬兆,千兆理論是128M/s,萬兆理論傳輸速度是1280M/s,當網路傳輸接近理論傳輸時超時便會明顯增多,影響系統穩定。
cpu負載以及使用率也會影響著系統響應,就需要我們使用合理時間複雜度資料結構以及演算法,合理利用cpu資源避免cpu過高,從而導致cpu負載以及使用率成為系統瓶頸。
前邊是單機儲存會涉及的一些核心的點,當然這幾個點相互之間還是存在關聯的,這就使整個系統複雜性變得更加的高。分散式儲存前邊的問題都涉及並且還會有些分散式系統獨有的複雜問題。
分散式通過資料複製來實現高可用,通過橫向擴充套件來實現儲存量橫向擴充套件。但多副本帶來資料一致性問題,在有網路以及硬體因素帶來可用性問題,以及網路分割槽對於系統提供服務影響,即著名CAP問題。CAP不是唯一問題,之外還有分散式事務、共識問題、租約問題等一系列問題,在有就是為了保證資料一致性需要undo log、redo log、WAL等一系列技術,分散式事務涉及2PC MVCC COW等各種技術。
有了分散式儲存,也需要應用系統根據實際應用場景去合理使用,一個是利用多級快取合理的將冷熱資料分開儲存。冷資料儲存在STAT、SSD磁碟,熱資料儲存在分散式快取,極熱資料儲存在應用本地快取中,通過分級來平衡效能和成本。
除了顯性研發成本外,分散式系統還有著較高維護管理成本,因為涉及機器眾多,機器硬體比如磁碟、主機、網路等都可能會產生問題,就需要有完備的監控系統,監控系統之外還需要專門的運維團隊,來維護整個系統穩定性、可用性。
希望本文能讓你對儲存有一個比較詳細瞭解,並可以合理應用到實際開發過程中。
相關文章推薦: