能過資料庫的讀寫分離和使用NoSQL,以及搜索引擎後,能夠降低主庫的壓力,解決數據存儲方面的問題,不過隨著業務的繼續發展,我們的資料庫主庫還是會遇到性能瓶頸,所以為了減小資料庫主庫的壓力,我們有資料庫垂直拆分和水平拆分兩種方式。 資料庫拆分 資料庫拆分有兩種方法,垂直拆分和水平拆分。 垂直拆分 垂直 ...
能過資料庫的讀寫分離和使用NoSQL,以及搜索引擎後,能夠降低主庫的壓力,解決數據存儲方面的問題,不過隨著業務的繼續發展,我們的資料庫主庫還是會遇到性能瓶頸,所以為了減小資料庫主庫的壓力,我們有資料庫垂直拆分和水平拆分兩種方式。
資料庫拆分
資料庫拆分有兩種方法,垂直拆分和水平拆分。
垂直拆分
垂直拆分的意思是把資料庫中不同業務的數據拆分到不同的資料庫中。比如我們商旅系統中原來將機票,酒店和火車票的訂單放在一個庫中,如果是垂直拆分的話,就是將機票,酒店和火車票拆分到不同的資料庫中。
這種方式解決了把所有業務數據放在一個資料庫中的壓力問題,但是同時會帶來兩個問題:
1,應用需要配置多個數據源。
2,如何處理原來單機的跨業務的事務問題,常用的解決方案是使用分散式事務,而另一種解決方案是,去掉事務或者不去追求強事務支持。
那麼,使用垂直拆分後的架構如下圖:
水平拆分
水平拆分一般是在某個數據表的數據量達到了單個資料庫的瓶頸,這時可以把這個數據表拆分到兩個或多個資料庫中。
資料庫水平拆分與資料庫讀寫分離的區別是,讀寫分離解決的是讀壓力大的問題,對於數據量大或者更新量大的情形並不會有效果,資料庫水平拆分與垂直拆分的區別是,垂直拆分是把不同的數據表拆分到不同的資料庫中,而水平拆分是把同一個表拆分到不同的資料庫中。
水平拆分解決了單表數據量過大的問題,但同時帶來了以下幾個問題:
1,要解決sql路由的問題,比如現在用戶信息被分在了兩個資料庫中,在進行資料庫操作的時候需要知道數據在哪個資料庫中。
2,數據表主鍵的處理問題,原來使用自增欄位作為主鍵的現在變得不適用了,因為有可能重覆。
3,當某個查詢需要從兩個或多個資料庫中獲取數據時,就比較難處理了。
先來看下使用水平拆分後的架構圖:
總結:雖然使用資料庫拆分可以有效地減輕資料庫主庫的壓力,但是同時帶來很多的問題,比如事務的問題,實現起來比較困難,應用程式也要做比較大的改動,相對於資料庫拆分,更常見的做法是業務拆分,請看下一篇總結。