1. 程式人生 > >大型網站架構演進(7)資料庫拆分

大型網站架構演進(7)資料庫拆分

原文: 大型網站架構演進(7)資料庫拆分

  能過資料庫的讀寫分離和使用NoSQL,以及搜尋引擎後,能夠降低主庫的壓力,解決資料儲存方面的問題,不過隨著業務的繼續發展,我們的資料庫主庫還是會遇到效能瓶頸,所以為了減小資料庫主庫的壓力,我們有資料庫垂直拆分和水平拆分兩種方式。

資料庫拆分

資料庫拆分有兩種方法,垂直拆分和水平拆分。

垂直拆分

垂直拆分的意思是把資料庫中不同業務的資料拆分到不同的資料庫中。比如我們商旅系統中原來將機票,酒店和火車票的訂單放在一個庫中,如果是垂直拆分的話,就是將機票,酒店和火車票拆分到不同的資料庫中。

這種方式解決了把所有業務資料放在一個數據庫中的壓力問題,但是同時會帶來兩個問題:

1,應用需要配置多個數據源。

2,如何處理原來單機的跨業務的事務問題,常用的解決方案是使用分散式事務,而另一種解決方案是,去掉事務或者不去追求強事務支援。

那麼,使用垂直拆分後的架構如下圖:

 

水平拆分

水平拆分一般是在某個資料表的資料量達到了單個數據庫的瓶頸,這時可以把這個資料表拆分到兩個或多個數據庫中。

資料庫水平拆分與資料庫讀寫分離的區別是,讀寫分離解決的是讀壓力大的問題,對於資料量大或者更新量大的情形並不會有效果,資料庫水平拆分與垂直拆分的區別是,垂直拆分是把不同的資料表拆分到不同的資料庫中,而水平拆分是把同一個表拆分到不同的資料庫中。

水平拆分解決了單表資料量過大的問題,但同時帶來了以下幾個問題:

1,要解決sql路由的問題,比如現在使用者資訊被分在了兩個資料庫中,在進行資料庫操作的時候需要知道資料在哪個資料庫中。

2,資料表主鍵的處理問題,原來使用自增欄位作為主鍵的現在變得不適用了,因為有可能重複。

3,當某個查詢需要從兩個或多個數據庫中獲取資料時,就比較難處理了。

先來看下使用水平拆分後的架構圖:

總結:

1,資料庫垂直拆分一般與應用(業務)拆分同步進行的。

2,資料庫垂直拆分會衍生兩個問題:一是跨業務的事務問題。二是應用需要配置多個數據源。對於跨業務的事務問題,一般可採用二階段提交的方式或是分散式事務容器來實現分散式事務。

3,資料庫水平拆分會衍生三個問題:一是sql路由的問題。二是資料表主鍵重複的問題。三是一個查詢跨多個數據庫的問題。