儲存由單機到分散式演進
儲存發展與線上業務發展類似,都是依據業務發展而不斷髮展,需要不斷演進,不可能一蹴而就,應用程式由單體到叢集到大規模分散式,儲存也類似演進路徑。
最開始訪問量比較小,直接單體儲存就可以解決問題,比如單機SQL/">MySQL、單機Oracle,再到讀寫分離把讀寫分開來解決問題,再到Oracle叢集承載更大儲存量以及併發量,後來併發量再大通過分庫分表來擴大儲存以及承載更大併發量。
單機資料庫事務性方面做的非常好,明顯特點是ACID,即原子性、一致性、隔離性、永續性,並且單機資料庫事物也分成很多級別,可以根據效能以及我們業務想要達到效果來選擇相應級別,核心是通過共享鎖、排它鎖等不同鎖級別設定來實現相應事務級別,從而避免幻影讀、髒讀、不可重複讀等問題。單機資料庫實際也是多執行緒以及鎖級別來實現各種各樣事務。
線上高併發、高效能應用程式,儲存是很重要一個基礎設施,分散式redis能處理很高併發量,並且能有很高效能,缺點是記憶體價格高以及不能持久化,大規模儲存的話redis規模上T已經很大,但網際網路應用還不夠。
分散式儲存主要分幾類,分散式kv儲存、分散式表格儲存、分散式資料庫,分散式kv是其中最簡單的 分散式redis是nosql,分散式表格儲存bigtable、hbase是其中代表,分散式資料庫比前兩者要複雜,特點是帶有分散式事務,例如Google Spanner和阿里OceanBase。
分散式儲存運維是分散式儲存一塊重要內容,以及怎樣無障礙升級。並且升級時不影響整個分散式叢集使用,這是分散式儲存在線上應用很重要一個點。不能達到這點,後續發現bug進行升級或者增加新特性,怎麼樣在不影響線上業務情況下使用,是一件很重要事情。
節點出問題後的資料遷移,遷移時不影響線上業務,能夠正常支援線上業務應用,這一點很重要。應用架構基石儲存這篇對於應用相關問題做了相關探討。
最近一直在調研分散式儲存,主要要解決redis規模不夠大問題,開源儲存有很多,Facebook 開源mysql引擎Rocksdb,這個儲存比redis好地方不會將所有資料都載入到記憶體,而是很多資料儲存在磁碟而不會把全部資料載入到記憶體,從而節省記憶體,缺點是主要單機方案,分散式方案資料不多。
百度開源Tera類似於HBase由C++開發效能高,配合開源BFS類似與HDFS可以很好應用,效能比HBase應該會高很多,並且這個專案中英文文件都很全,部署相關資訊也很全,比較小一點遺憾是缺少管理整個分散式叢集相關係統,對於整個系統監控、管理方面需要使用者去補全。並且整個叢集部署也是比較複雜的,需要對整個系統有比較深認知,才能將整個系統應用起來。
通過這段時間調研,瞭解到分散式儲存是一個研發與運維並重軟體,光有系統不夠,還要整個系統包含齊全的運維,例如擴容、縮容以及機器故障時對於線上業務無感遷移,監控能夠方便對節點以及分散式叢集整體進行監控,管理對於叢集能夠通過平臺便捷進行相關管理配置以及相關操作。分散式系統從研發到應用到線上不是一件簡單事情。
你在實際業務研發中應用過哪些單機資料庫或者分散式資料庫,遇到過哪些問題,歡迎留言分享。