35面試常問:談談為什麼要拆分資料庫?有哪些方法?

AI喬治發表於2020-11-13

 

1. 為什麼要拆分資料庫?

單體專案在構建之初,資料庫的負載和資料量都不大,所以不需要對資料庫做拆分,小型財務系統、文書系統、ERP系統、OA系統,用一個MySQL資料庫例項基本就夠用了。

就像《淘寶技術這十年》裡面說到的,電商業務的資料量增長飛快,所以最開始的PHP+MySQL的架構已經不能滿足實際要求了,於是淘寶想到的第一個辦法就是把MySQL替換成Oracle。但是沒過了多久,在08年前後,單節點的Oracle資料庫也不好用了,於是淘寶終於告別了單節點資料庫,開始拆分資料庫。從一個節點,變成多個節點。

拆分資料庫是有講究的,比如說拆分方法有兩種:垂直切分和水平切分。那你是先水平切分還是垂直切分呢?順序無所謂?不,順序有所謂,次序絕對不能錯:先水平切分,然後垂直切分。

2. 什麼是垂直切分?

垂直切分是根據業務來拆分資料庫,同一類業務的資料表拆分到一個獨立的資料庫,另一類的資料表拆分到其他資料庫。

比如說一個新零售的電商資料庫,我們可以把跟商品相關的資料表拆分成一個資料庫,然後在這些資料表的基礎之上,構建出商品系統。比如用JAVA或者PHP語言,建立出一個商城系統。然後把跟進銷存相關的資料表拆分到另外一個資料庫上,再用程式構建出倉庫系統。

垂直切分解決了什麼問題

垂直切分可以降低單節點資料庫的負載。原來所有資料表都放在一個資料庫節點上,無疑所有的讀寫請求也都發到這個MySQL上面,所以資料庫的負載太高。如果把一個節點的資料庫拆分成多個MySQL資料庫,這樣就可以有效的降低每個MySQL資料庫的負載。

垂直切分不能解決什麼問題

垂直切分不能解決的是縮表,比如說商品表無論劃分給哪個資料庫節點,商品表的記錄還是那麼多,不管你把資料庫垂直拆分的有多細緻,每個資料表裡面的資料量是沒有變化的。

MySQL單表記錄超過2000萬,讀寫效能會下降的很快,因此說垂直切分並不能起到縮表的效果。

3. 什麼是水平切分?

水平切分是按照某個欄位的某種規則,把資料切分到多張資料表。一張資料表化整為零,拆分成多張資料表,這樣就可以起到縮表的效果了。

很多人,都會水平切分存在誤解,以為水平切分出來的資料表必須儲存在不同的MySQL節點上。其實水平切分出來的資料表也可以儲存在一個MySQL節點上面。不是水平切分一定需要多個MySQL節點。為什麼這麼說呢?

許多人不知道MySQL自帶一種資料分割槽的技術,可以把一張表的資料,按照特殊規則,切分儲存在不同的目錄下。如果我們給Linux主機掛載了多塊硬碟,我們完全可以利用MySQL分割槽技術,把一張表的資料切分儲存在多個硬碟上。這樣就由原來一塊硬碟有限的IO能力,升級成了多個磁碟增強型的IO。

水平切分的用途

水平切分可以把資料切分到多張資料表,可以起到縮表的作用。

但是也不是所有的資料表都要做水平切分。資料量較大的資料表才需要做資料切分,比如說電商系統中的,使用者表、商品表、產品表、地址表、訂單表等等。有些資料表就不需要切分,因為資料量不多,比如說品牌表、供貨商表、倉庫表,這些都是不需要切分的。

水平切分的缺點

不同資料表的切分規則並不一致,要根據實際業務來確定。所以我們在選擇資料庫中介軟體產品的時候,就要選擇切分規則豐富的產品。常見的資料庫中介軟體有:MyCat、Atlas、ProxySQL等等。有些人覺得MyCat是Java語言開發的,就懷疑MyCat執行效率。其實資料庫中介軟體的作用相當於SQL語句的路由器。你家路由器硬體配置不怎麼高,但是不影響你享用百兆寬頻。MyCat也是一個道理,它僅僅是起到SQL語句轉發的作用,並不會實際執行SQL語句。我推薦使用MyCat最主要的原因是它自帶了非常多的資料切分規則,我們可以按照主鍵求模切分資料,可以按照主鍵範圍切分資料,還可以按照日期切分資料等等。因此說,為了滿足業務的需要,MyCat目前來說算是非常不錯的中介軟體產品。

水平切分的另一個缺點就是擴容比較麻煩,日積月累,分片遲早有不夠用的時候。這時候不是首先選擇增加新的叢集分片。因為一個MySQL分片,需要4~8個MySQL節點(最小規模),增加一個分片的投入成本是很高的。所以正確的做法是做冷熱資料分離,定期對分片中的資料歸檔。把過期的業務資料,從分片中轉移到歸檔庫。目前來說資料壓縮比最高的MySQL引擎是TokuDB,而且帶著事物的寫入速度是InnoDB引擎的6-14倍。用TokuDB作為歸檔資料庫最適合不過。

4. 為什麼先做水平切分,後作垂直切分?

隨著資料量的增加,最先應該做的是資料分片,利用多塊硬碟來增大資料IO能力和儲存空間,這麼做的成本是最低的。幾塊硬碟的錢就能收穫不錯的IO效能。

進入到下一個階段,資料量繼續增大,這時候我們應該把資料切分到多個MySQL節點上,用MyCat管理資料切分。當然還要做資料的讀寫分離等等,這裡不展開討論。在後臺做水平切分的同時,業務系統也可以引入負載均衡、分散式架構等等。理論上,使用了冷熱資料分離之後,水平切分這種方式可以繼續維持很長一段時間,資料量再大也不怕,定期歸檔就好了。

資料庫到了水平切分的階段,資料量的增加已經不是更改架構設計的主要原因了。反而這個階段業務系統承受不住了,如果再不對系統做模組拆分,業務系統也撐不下去了,所以按照模組和業務,把一個系統拆分成若干子系統。若干子系統之間,資料相對獨立。比如淘寶不會跟支付支付寶分享全部資料,共享同一套資料表,這也影響各自業務的發展。所以就要弄垂直切分了,把資料表歸類,拆分成若干個資料庫系統。

講到這裡,你仔細想想。如果過早的對資料庫做了垂直切分,勢必要重新構建若干獨立的業務系統,工作量太巨大。水平切分並不需要業務系統做大幅度的修改,因此說應該先從水平切分開始做。

最新2020整理收集的一些面試題(都整理成文件),有很多幹貨,包含mysql,netty,spring,執行緒,spring cloud、jvm、原始碼等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友掃描下方二維碼免費獲取:暗號:【CSDN】

 

å¨è¿éæå¥å¾çæè¿°

看完三件事❤️

如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:

  1. 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。

  2. 關注公眾號 『 java爛豬皮 』,不定期分享原創知識。

  3. 同時可以期待後續文章ing?

 

相關文章