數據庫橫向擴展——主從複製、集羣和分片

傳統的關係型數據庫很難擴展,通常是縱向擴展,但到達一定程度時只能橫向擴展。

數據庫的橫向擴展支持三種方法,即主從複製,集羣和分片(sharding)

圖是偷的,內容是整理過的 ~ T.T

主從複製:

主從複製——最易配置,對應用改動最小,並可以減輕主庫的負擔。 主數據庫可以讀寫,從數據庫只讀。

 

應用場景場景——實現讀寫分離,或業務分離,即運行報表,備份,數據倉庫等應用

存在問題——

 

 

 

        1,主與從之間數據非完全同步,可能會讀到兩個不同的版本

 

 

        2,如果只有主庫接受讀寫,那麼主庫遲早會過載,因此不算是真正的scale out

 

不過主從庫數據的延遲,有的業務是可以接受的。另外,利用一些實時複製的工具如GoldenGate,從庫也是可以寫的,這時可以利用從庫做其它的業務,從而達到橫向擴展的目的。這也算是主從複製的一個新趨勢。

集羣Clustering:

集羣——也稱爲shared everything或shared disk架構。最知名的就是Oracle RAC,1個數據庫可以有多個實例,來訪問共享存儲上的數據庫。 每一個節點都可以讀寫,從應用角度來看,代碼無需改變。負載均衡也是自動的。

存在問題—— 
        1,寫數據時需要內存中數據的同步,數據加速帶來競爭,影響擴展性 
        2,難以設置和管理 
        3,由於存儲是共享的,讀操作也不能無限擴展

集羣適合於——讀密集的應用,如數據倉庫和BI

 

分片(Sharding)

分區——是庫內的
分片——是庫外的,也叫分表分庫, 是shared nothing的架構。 

 

Sharding——將一個大的庫拆分成很多小庫。

如何拆和業務規則有關,可以按用戶ID拆,按業務拆。

 

 

如果需要Join,相關的表需要放到一個庫裏,避免數據庫間的通訊。

Sharding也可以有兩種方法,
    1,垂直分區——按業務分,簡稱爲分庫,即不同的業務使用不同的庫,互不相干。垂直分區到一定程度,也無法擴展,這時需要水平分區。

 

 

    2,水平分區——將一個大表拆分爲小表,每個小表位於不同的庫。每一個建立相同的schema。如根據主鍵的hash值來分區。

 

存在問題—— 
        1,加大了應用代碼的複雜性,需要路由到正確的shard。 
        2,後期增加shard需要修改應用邏輯,並需要遷移數據 
        3,查詢和聚集(aggregation)不再簡單,需要跨庫聯合操作 
        4,主數據和參照數據需要複製到所有shard,以避免跨庫操作。主數據和參照數據雖然偏靜態,但一旦修改,可能會有數據一致性問題。 
        5,跨庫修改需要分佈式交易處理,會限制可擴展性。因此應儘量避免。 
        6,單個shard的失效可能會使整個系統不可用(其實也不一定)。因此通常需要爲每個shard再配置HA方案,如主從複製。

儘管有以上不足,分片對於一些大型網站還是廣泛使用,如Google, eBay, Facebook, Flickr。

When the pain is great, any medicine that reduces it is good, regardless of the side effects. 
這句話有點意思。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章