More  

小編的世界 優質文選 資料

「024期」說說為什麼要拆分數據庫?有哪些方法?


2021年6月18日 - 資料小編 素文宅博客 
   

素文宅博客

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管理數據切分。當然還要做數據的讀寫分離等等,這裏不展開討論。在後台做水平切分的同時,業務系統也可以引入負載均衡、分布式架構等等。理論上,使用了冷熱數據分離之後,水平切分這種方式可以繼續維持很長一段時間,數據量再大也不怕,定期歸檔就好了。

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

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

作者:神思者www.imooc.com/article/288363

  大家在看