面試官:“談談分庫分表吧?”


關注偶,領取更多學習資料哦。

file

1.什么是分庫分表

從字面上簡單理解,就是將原本存儲在一個庫的數據分塊存儲在多個庫上,將原本存儲在一個表的數據分塊存儲在多個表里面。

數據的切分根據其切分規則的類型,可以分為如下兩種切分模式。

  • 垂直(縱向)切分:把單一的表拆分成多個表,並分散到不同的數據庫(主機)上。
    比如一個訂單表里面有用戶信息,商品信息,收貨地址信息,促銷信息,這樣表的字段太多,顯得特別臃腫,所以我們將他們各自分隔出來,形成多張表存儲數據。

這樣操作的優點:

	拆分后業務清晰,拆分規則明確。

	系統之間進行整合或擴展很容易。

	按照成本、應用的等級、應用的類型等將表放到不同的機器上,便於管理。

	便於實現動靜分離、冷熱分離的數據庫表的設計模式。

	數據維護簡單。

缺點:

	業務表多樣,SQL語句復雜。
  • 水平(橫向)切分:根據表中數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多台數據庫(主機)上。與垂直切分對比,水平切分不是將表進行分類,而是將其按照某個字段的某種規則分散到多個庫中,在每個表中包含一部分數據,所有表加起來就是全量的數據。

    比如有一個用戶表,單張表的記錄條數達到1億條,這樣在進行查詢,插入,更新操作的時候,速度將非常慢,那我們可以將這些數據分配到100個表里面,每個表的數據量就下來了,導致單表的容量不會太大,從而保證了單表的查詢等處理能力。

    我們通常將數據分配的原則稱為分片規則,常見的分片規則有對用戶的id取模。

注意:一定要好好決定分片規則,盡量選擇不會變動的字段,如果選擇區域,性別,年齡等字段,當用戶修改這些信息的時候又要講數據移動到其他數據庫,這里面的邏輯也很頭疼。

這樣操作水平的優點如下:

	單庫單表的數據保持在一定的量級,有助於性能的提高。

	切分的表的結構相同,應用層改造較少,只需要增加路由規則即可。

	提高了系統的穩定性和負載能力。

缺點如下:

	切分后,數據是分散的,很難利用數據庫的Join操作,跨庫Join性能較差。

	拆分規則難以抽象。

	分片事務的一致性難以解決。

	數據擴容的難度和維護量極大。

2.為什么要用分庫分表

數據庫負載增大時的處理:隨着我們的應用的用戶量越來越大,訪問量也隨之提升,當他們提升到一定的量級之后,應用也就越來越慢。當然我們可以通過增大前端應用負載的方式來提升速度,但是直到有一天我們發現無論如何增大前端應用負載都不能提升速度,我們就逐步找到原因,是數據庫的問題。因為數據庫是存在性能瓶頸的,這是無法避免的。

3.市面上常用中間件

MyCat:是一個中間件的第三方應用,使用mycat時不需要改代碼。
我們在使用的時候,如果有多個庫,我們在代碼里面就只要寫mycat對外的一個邏輯庫信息就行,而數據庫層面的配置,比如總共有多少個庫,每個庫里面的表,每個表的分片規則,這些都是在mycat里面配置,不需要修改代碼信息。
具體的邏輯圖如下:

file

Sharding JDBC:是一個jar包,使用sharding-jdbc時需要修改代碼。
我們在使用的時候,需要引入sharding jdbc的jar包,在配置文件里面寫明總共有多少個庫,每個庫里面的表,每個表的分片規則等信息。

具體的邏輯圖如下:

file

如何選擇中間件?

sharding-jdbc和mycat使用不同的理念,sharding-jdbc目前是基於jdbc驅動,無需額外的proxy,因此也無需關注proxy本身的高可用。Mycat 是基於 Proxy,它復寫了 MySQL 協議,將 Mycat Server 偽裝成一個 MySQL 數據庫,而 Sharding-JDBC 是基於 JDBC 接口的擴展,是以 jar 包的形式提供輕量級服務的。

其實MyCAT很適合中小企業使用的。可以非常容易的實現數據庫的讀寫分離和分庫分表,反而對於大企業來說,都會自己開發適合自己的數據庫中間層應用,比如sharding jdbc原來就是當當網內部的數據庫中間件,后來開源出來的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM