分散式儲存架構設計
網際網路系統,儲存與計算是極其重要兩個方面。無論是服務端mysql資料庫、redis快取以及計算應用框架spring、dubbo等,還是大資料hdfs、hbase以及mapreduce、spark等計算框架。都體現了儲存計算是網際網路應用系統兩個核心方面。
儲存三種類型基於hash資料結構比如redis以及小圖片系統TFS,hash資料結構能夠支援讀寫qps很高是做儲存非常好資料結構,redis類儲存結構缺點是成本高;以及基於B+樹MySQL,MySQL類資料庫支援完整sql語法使用方面,對於事務支援好,但B+樹這種資料結構對於大量隨機寫,當數量大之後效能會變差;再有是基於LSM bigtable、hbase等,LSM將寫入變隨機為順序寫入,極大增加儲存寫入速度,基於LSM儲存利用BoomFilter過濾器、table快取等技術加快讀取速度,但是讀取qps依然會小於redis很多。
根據以上特點儲存要根據實際業務需求結合使用,而不能瞭解一種就抓住一種不放,認為找到銀彈。業務特點最近的資料寫多,讀少要快取在記憶體,歷史資料寫少讀少儲存在磁碟。
分散式儲存設計不僅要考慮一致性、可用性、分割槽容忍性,還要在設計實現時就要考慮整體架構可運維性,以及可監控性,這樣能夠方便叢集管理成本,方便叢集進行各種各樣操作。
1、故障發現快,並且能夠進行多節點恢復。設計監控能夠快速發現故障節點,並且能溝通過擴容服務,將故障節點快速將資料複製,並將節點上到叢集。
2、獨立分割槽,將容器獨立一塊區域,避免一個儲存叢集服務過載影響其他叢集。從而影響線上多個業務。
3、跨機房熱備,通過資料同步服務一般基於Raft協議,將資料同步到同城機房或者異地機房進行災備,災備機房也可直接提供讀服務。
4、持久化,redis類快取能夠通過快照或者append方式將資料持久化。基於磁碟型別天然支援持久化。
5、讀策略,多種讀策略。支援根據配置讀取相應機房,可以實現同機房服務優先讀取同機房儲存,以及隨機主從讀取等多種策略,根據業務需求進行靈活配置。
6、自動化運維,通過擴容服務管理備用資源池,當線上儲存節點存在問題,則通過擴容服務獲取備用資源池節點,拷貝資料以及設定節點到叢集,並將資訊註冊到Meta資訊,完成故障節點處理。
7、複製,實現基於主從複製,能夠實現基於最終一致性的主從複製。並且能夠監控所有分片主從同步情況以及主從連線情況,主從斷開後能夠進行報警以便運維人員能夠及時處理。
8、監控,對於節點分片ops量、讀寫量監控以及配置報警閥值,對於叢集整體磁碟記憶體使用量進行監控,當磁碟或記憶體超過設定閥值比如75%時進行報警,以便進行擴容操作。對於慢查詢進行監控,並進行持久化儲存以支援後續分析。對於連線數監控,儲存所在物理機連線數是重要資源,連線數過多會導致有客戶端取不到連線從而導致取不到資料,連線數也要進行嚴格監控。
9、流控,對於儲存服務也要提供過載保護機制,避免讀寫流量過大,影響叢集穩定性,當超過叢集請求後,返回異常資訊給客戶端,避免儲存服務過載。
10、其他,分散式儲存支援多種資料結構,方便業務使用;對於基本資料型別int、char、string等資料儲存格式支援;對於傳統sql語句支援;對於分散式事務支援;分散式雙寫支援等等,是分散式系統不斷演進以及研發方向。
儲存是架構設計一部分,要根據實際架構需要來使用儲存,你在實際中用過哪些儲存?
兩個架構相關優秀專欄,推薦訂閱學習,均有返現