35面試常問:談談為什麼要拆分資料庫?有哪些方法?
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】
看完三件事❤️
如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
-
點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
-
關注公眾號 『 java爛豬皮 』,不定期分享原創知識。
-
同時可以期待後續文章ing?
相關文章
- 談談為什麼要分庫分表?
- 面試題:談談什麼是Zab協議?面試題協議
- 服裝企業為什麼要談資訊化?
- 老生常談!程式設計師為什麼要閱讀原始碼?程式設計師原始碼
- 談談大資料採集和常見問題大資料
- iOS面試題 — 老生常談iOS面試題
- 談談什麼是資料質量管理
- 面試官:談談你對Mysql資料庫讀寫分離的瞭解,並且有哪些注意事項?面試MySql資料庫
- 什麼是撞庫?撞庫攻擊常見的方法有哪些?
- 【Java面試】資料庫連線池有什麼用?它有哪些關鍵引數?Java面試資料庫
- 漫談“資料拆分層次對比”
- 面試官:談談Redis快取和MySQL資料一致性問題面試Redis快取MySql
- 時序資料庫-01-時序資料庫有哪些?為什麼要使用資料庫
- 資料庫是什麼意思?有什麼用?有哪些型別?資料庫型別
- 【面經】面試官問我:資料庫中事務的隔離級別有哪些?各自有什麼特點?然而。。。面試資料庫
- 談談資料安全常見的誤區
- 談一談常見的資料治理怪象
- 為什麼要對資料庫最佳化資料庫
- 為什麼要選擇分散式資料庫?分散式資料庫
- Python常見面試題008. 談談python中的解包Python面試題
- 資料庫倉庫系列:(一)什麼是資料倉儲,為什麼要資料倉儲資料庫
- 談談為什麼需要服務治理(Dubbo)
- 資料庫有哪些特性?本地想接入雲資料要怎麼操作?資料庫
- 面試常問的20個資料庫高頻面試題詳解!資料庫面試題
- 資料庫面試時常見的26個問題資料庫面試
- 談談這幾個常見的多執行緒面試題執行緒面試題
- 有哪些常見的資料探勘方法?
- 雲資料庫MySQL有什麼作用?有哪些優點?資料庫MySql
- 常見的資料整合有哪些方法?有哪些分類?
- 談談術語表、資料字典、資料目錄分別是什麼
- 【Java面試】請談談AQS是怎麼回事兒?Java面試AQS
- 《iOS面試題 - 老生常談》之提示答案iOS面試題
- 為什麼要參加軟體測試培訓?有哪些優勢?
- Gtalent圈子大佬常談的Redis基礎面試問題彙總Redis面試
- 簡談為什麼遊戲公司要打造自己旗下的IP遊戲
- 優思學院|質量工程師面試的常見問題有哪些?有什麼回答的建議?工程師面試
- 資料治理為什麼要清洗資料
- 淺談圖資料庫資料庫