拆分數據庫

1、爲什麼要拆分數據庫?
    單體項目在構建之初,數據庫的負載和數據量都不大,所以不需要對數據庫做拆分,小型財務系統、文書系統、ERP系統、OA系統,用一個MySQL數據庫實例基本就夠用了。請求變多時,第一個辦法就是把MySQL替換成Oracle。但是請求量繼續增大,單節點的Oracle數據庫也不好用了,於是需要考慮告別單節點數據庫,開始拆分數據庫。從一個節點,變成多個節點。
    
2、什麼是垂直切分?
    垂直切分是根據業務來拆分數據庫,同一類業務的數據表拆分到一個獨立的數據庫,另一類的數據表拆分到其他數據庫。
    比如說一個新零售的電商數據庫,我們可以把跟商品相關的數據表拆分成一個數據庫,然後在這些數據表的基礎之上,構建出商品系統。比如用JAVA或者PHP語言,創建出一個商城系統。然後把跟進銷存相關的數據表拆分到另外一個數據庫上,再用程序構建出倉庫系統。
    
    2.1、垂直切分解決了什麼問題?
        垂直切分可以降低單節點數據庫的負載。原來所有數據表都放在一個數據庫節點上,無疑所有的讀寫請求也都發到這個 MySQL上面,所以數據庫的負載太高。如果把一個節點的數據庫拆分成多個MySQL數據庫,這樣就可以有效的降低每個MySQL數據庫的負載。
    2.2、垂直切分不能解決什麼問題?
        垂直切分不能解決的是縮表,比如說商品表無論劃分給哪個數據庫節點,商品表的記錄還是那麼多,不管你把數據庫垂直拆分的有多細緻,每個數據表裏面的數據量是沒有變化的。(MySQL單表記錄超過2000萬,讀寫性能會下降的很快,因此說垂直切分並不能起到縮表的效果。)
        
3、什麼是水平切分?
    水平切分是按照某個字段的某種規則,把數據切分到多張數據表。一張數據表化整爲零,拆分成多張數據表,這樣就可以起到縮表的效果了。
    
    3.1、水平切分的用途
        水平切分可以把數據切分到多張數據表,可以起到縮表的作用。
        但是也不是所有的數據表都要做水平切分。數據量較大的數據表才需要做數據切分,比如說電商系統中的,用戶表、商品表、產品表、地址表、訂單表等等。有些數據表就不需要切分,因爲數據量不多,比如說品牌表、供貨商表、倉庫表,這些都是不需要切分的。
    3.2、水平切分 點  
        不同數據表的切分規則並不一致,要根據實際業務來確定。所以我們在選擇數據庫中間件產品的時候,就要選擇切分規則豐富的產品。常見的數據庫中間件有:MyCat、Atlas、ProxySQL等等。有些人覺得MyCat是Java語言開發的,就懷疑MyCat運行效率。其實數據庫中間件的作用相當於SQL語句的路由器。你家路由器硬件配置不怎麼高,但是不影響你享用 百兆寬帶。MyCat也是一個道理,它僅僅是起到SQL語句轉發的作用,並不會實際執行SQL語句。我推薦使用MyCat最主要的原因是它自帶了非常多的數據切分規則,我們可以按照主鍵求模切分數據,可以按照主鍵範圍切分數據,還可以按照日期切分數據等等。因此說,爲了滿足業務的需要,MyCat目前來說算是非常不錯的中間件產品。

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

4、爲什麼先做水平切分,後作垂直切分?
    如果過早的對數據庫做了垂直切分,勢必要重新構建若干獨立的業務系統,工作量太巨大。水平切分並不需要業務系統做大幅度的修改,因此說應該先從水平切分開始做。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章