1. 程式人生 > >如何做資料儲存架構技術選型?(關於儲存的一些好文轉載--4)

如何做資料儲存架構技術選型?(關於儲存的一些好文轉載--4)

在網際網路應用中,資料爆發式的增長,實際上軟體架構的本質就是對資料的維護。對資料的操作可以歸納為三類:讀、寫和檢索。

隨著網站的流量越來越大,資料量也爆發式的增長,網站響應越來越慢,伺服器經常宕機。傳統的關係型資料庫已經不能滿足流量和資料的爆發式增長。於是根據不同的業務需求,出現了很多不同的資料庫。

根據資料庫的型別劃分。有關係型資料庫:mysql,oracle,sqlserver,postgresql等。nosql資料庫:mongodb,hbase,cassandra,redis,CouchDB,Riak,Membase等。

根據資料庫的用途劃分。有快取資料庫:redis,memcached,h2db等,日誌資料庫:kahadb等。k-v型資料庫:leveldb,redis等。

檢索型儲存中介軟體有:elasticsearch、solr、Lucene等。

傳統的關係型資料庫(RDBMS)是用途最廣泛也是用的最多的資料庫。關係型資料庫是強事物一致性(ACID),使用比較早,技術相對成熟,查詢可以根據欄位,以及表現各個資料物件之間的關係。在CAP理論中實現的是CA。沒有P分割槽性,單點瓶頸是硬傷。

當關系型資料庫越來越成為瓶頸時,為解決單點瓶頸犧牲CAP屬性中的C,出現了nosql資料庫。針對某些特殊的使用場景,出現了非關係型資料庫。如:nosql,快取等。以下針對不同的業務場景闡述各個資料庫的特性。

對於資料庫的選型,ACID是重要的考慮指標,如果對ACID要求很高,應該選擇關係型資料庫。其次部分對一致性要求不高的,寫併發非常大的可以考慮其他的nosql資料庫。但是有的業務併發非常高,對ACID要求也非常高,則對業務資料和資料庫進行拆分。

以下對各種業務場景應該如何優化和儲存選型。

一、讀多寫少

在網際網路應用中,對於一般的量級,免費的關係型資料庫mysql、postgresql是首選。支援事物,穩定性和成熟度比較好。

當訪問量越來越大,資料量還不是很大的時候。也就是寫不是瓶頸,而讀成為主要的瓶頸。一是增加從庫分擔讀的壓力,另一個是在資料庫和應用系統之間加一層快取memcache,redis。增加快取之後,能抗住很多壓力,大大降低了資料庫的讀請求。

二、讀多寫多

高併發場景中,對資料庫的操作往往提現在高併發讀和高併發寫。當讀和寫都成為瓶頸時,這時採用的方案有:

1)對資料庫進行橫向和縱向擴充套件。按業務劃分,把一個數據庫例項擴充套件成多個例項。按資料分片,把單表大資料量,水平分片成多個小表。

2)使用記憶體表負載壓力。常見的記憶體表有:redis開啟aof功能。業務資料要持久化落盤。否則程序一旦重啟,記憶體資料就會丟失。

redis:是有硬碟儲存的記憶體資料庫,可以支援Master-Slave複製,其可以提供併發量遠高於關係型資料庫。支援的資料結構:K-V,K-Sets,K-Queue,K-Hash。可適用於高併發讀寫業務場景,但侷限於其資料結構,不能做複雜查詢,只能以Key鍵值為基礎資料結構操作。

memcachedb:是基於memcache添加了BerkeleyDB儲存機制和主輔複製而來。支援的資料結構只要K-V結構。可適用於高併發讀寫業務場景,同樣只侷限於其資料結構,不能做複雜查詢,只能以Key鍵值為基礎資料結構操作。

MongoDB:支援Master-Salve複製,無schema,json結構。欄位可以任意擴充套件,可以建立欄位索引和全欄位索引。可以對任意欄位建立索引查詢。資料量越來越大時,是吃記憶體的大戶,資料一致性問題會越來越嚴重。如果對資料一致性要求不高的讀多寫多業務,可以考慮使用此資料庫儲存。

三、讀少寫多

海量資料的寫入。如貨車app中的gps路線軌跡資料,每天的寫入庫的資料量上億條。如此巨大的寫入量用關係型資料庫顯然是不合適的。關係型資料庫雖然可以採用批量匯入的方式增強寫入能力,但其強制落盤,對磁碟IO是影響主要因素。cassandra和habase其先寫記憶體,非同步落盤機制對磁碟IO消耗更低。

Cassandra:java開發,結構簡單。其資料採用分片機制,副本備份與容錯複製。面向列式儲存。記憶體寫入與非同步刷盤的機制,使其在寫操作遠高於讀操作場景中,也能輕鬆應對。

HBASE:支援數十億行,數百萬列。對於海量資料的寬表,面向列式儲存,無schema,可任意擴充套件列。

四、讀少寫少

在小系統,業務量低、資料量少的系統,對讀寫操作都比較少,當然是怎麼快就怎麼來。選用mysql免費資料庫是最合適的選擇。

五、複雜條件檢索

關係型資料庫通常使用b+tree索引,非關係型資料庫如cassandra使用LSM結構索引。所有的索引多列複雜條件查詢的檢索效率遠遠低於索引引擎。

常用開源的搜尋引擎有luence,solr,elasticsearch,sphinx等。

solr:查詢快,但是更新索引速度偏慢。主要應用於那種對資料的實時性要求不高的業務。

elasticserach:更新速度比solr快,但是查詢速度相對solr較慢。主要應用於實時索引查詢的業務。

總結:

1)對ACID有強要求業務一般使用的資料儲存採用關係型資料庫,如mysql,postgresql、oracle、sql server等。

2)讀多寫少的場景,使用非關係型資料庫Cassandra、hbase、MongoDB等。

3)緩解高併發讀對資料庫造成的讀瓶頸,使用快取:memcached、redis等。

4)複雜的資料檢索,使用外接索引:elasticsearch、solr等。

 

轉自:http://stor.51cto.com/art/201711/556166.htm