【分庫分表】切分方式(水平切分, 垂直切分)
【分庫分表】切分方式 - 簡書
https://www.jianshu.com/p/84fb7c75ab49
【分庫分表】切分方式
這裡介紹設計分庫分表的方案時應該考慮的設計要點,並給出相應的解決方案。
一、關於切分方式
資料庫的切分指的是通過某種特定的條件,將我們存放在同一個資料庫中的資料分散存放到多個數據庫(主機)中,以達到分散單臺裝置負載的效果,即分庫分表。
資料的切分根據其切分規則的型別,可以分為 垂直(縱向)切分 和水平(橫向)切分。
- 垂直(縱向)切分: 把單一的表拆分成多個表,並分散到不同的資料庫(主機)上。
- 水平(橫向)切分:根據表中資料的邏輯關係,將同意個表中的資料按照某種條件拆分到多臺資料庫(主機)上。
1. 垂直切分
一個數據庫有多個表構成,每個表對應不同的業務,垂直切分是隻按照業務將表進行分類,將其分佈到不同的資料庫上,這樣就將資料分擔到了不同的庫上(專庫專用)。
案例:
有如下幾張表:
- 使用者資訊表(User)
- 交易記錄(Pay)
- 商品(Commodity)
針對以上案例,垂直切分就是根據每個表的不同業務進行切分,比如User表,Pay表和Commodity表,將每個表切分到不同的資料庫上。
垂直切分的優點如下:
- 拆分後業務清晰,拆分規則明確。
- 系統之間進行整合或擴充套件很容易。
- 按照成本、應用的等級、應用的型別等獎表放到不同的機器上,便於管理。
- 便於實現動靜分離、冷熱分離的資料庫表的設計模式。
- 資料維護簡單。
垂直切分的缺點如下:
- 部分業務表無法關聯(Join), 只能通過介面方式解決,提高了系統的複雜度。
- 受每種業務的不同限制,存在單庫效能瓶頸,不易進行資料擴充套件和提升效能。
- 事務處理複雜。
垂直切分除了用於分解單庫單表的壓力,也用於實現冷熱分離,也就是根據資料的活躍度進行拆分,因為對擁有不同活躍度的資料的處理方式不同。
我們可將本來可以在同一個表中的內容人為地劃分為多個表。所謂“本來”,是指按照關係型資料庫第三正規化的要求,應該在同一個表中,將其拆分開就叫作反範化(Denormalize)。
例如,對配置表的某些欄位很少進行修改時,將其放到一個查詢效能較高的資料庫硬體上;對配置表的其他欄位更新頻繁時,則將其放到另一個更新效能較高的資料庫硬體上。
這裡我們再舉一個例子:在微博系統的設計中,一個微博物件包括文章標題、作者、分類、建立時間等屬性欄位,這些欄位的變化頻率低,查詢次數多,叫作冷資料。而部落格的瀏覽量、回覆數、點贊數等類似的統計資訊,或者別的變化頻率比較高的資料,叫作活躍資料或者熱資料。
我們把冷熱資料分開存放,就叫作冷熱分離,在MySQL的資料庫中,冷資料查詢較多,更新較少,適合用MyISAM引擎,而熱資料更新比較頻繁,適合使用InnoDB儲存引擎,這也是垂直拆分的一種。
我們推薦在設計資料庫表結構時,就考慮垂直拆分,根據冷熱分離、動靜分離的原則,再根據使用的儲存引擎的特點,對冷資料可以使用MyISAM,能更好地進行資料查詢;對熱資料可以使用InnoDB,有更快的更新速度,這樣能夠有效提升效能。
其次,對讀多寫少的冷資料可配置更多的從庫來化解大量查詢請求的壓力;對於熱資料,可以使用多個主庫構建分庫分表的結構,請參考下面關於水平切分的內容,後續的三四五章提供了不同的分庫分表的具體實施方案。
注意,對於一些特殊的活躍資料或者熱點資料,也可以考慮使用Memcache、Redis之類的快取,等累計到一定的量後再更新資料庫,例如,在記錄微博點贊數量的業務中,點贊數量被儲存在快取中,每增加1000個點贊,才寫一次資料。
2. 水平切分
與垂直切分對比,水平切分不是將表進行分類,而是將其按照某個欄位的某種規則分散到多個庫中,在每個表中包含一部分資料,所有表加起來就是全量的資料。
簡單來說,我們可以將對資料的水平切分理解為按照資料行進行切分,就是將表中的某些行切分到一個數據庫表中,而將其他行切分到其他資料庫表中。
這種切分方式根據單表的資料量的規模來切分,保證單表的容量不會太大,從而保證了單表的查詢等處理能力,例如將使用者的資訊表拆分成User1、User2等,表結構是完全一樣的。我們通常根據某些特定的規則來劃分表,比如根據使用者的ID來取模劃分。
例如,在部落格系統中,當讀取部落格的量很大時,就應該採取水平切分來減少每個單表的壓力,並提升效能。
以微博表為例,當同時有100萬個使用者在瀏覽時,如果是單表,則單表會進行100萬次請求,假如是單庫,資料庫就會承受100萬次的請求壓力;假如將其分為100個表,並且分佈在10個數據庫中,每個表進行1萬次請求,則每個資料庫會承受10萬次的請求壓力,雖然這不可能絕對平均,但是可以說明問題,這樣壓力就減少了很多,並且是成倍減少的。
水平切分的優點如下:
- 單庫單表的資料保持在一定的量級,有助於效能的提高。
- 切分的表的結構相同,應用層改造較少,只需要增加路由規則即可。
- 提高了系統的穩定性和負載能力。
水平切分的缺點如下:
- 切分後,資料是分散的,很難利用資料庫的Join操作,跨庫Join效能較差。
- 拆分規則難以抽象。
- 分片事務的一致性難以解決。
- 資料擴容的難度和維護量極大。
綜上所述,垂直切分和水平切分的共同點如下:
- 存在分散式事務的問題。
- 存在跨節點Join的問題。
- 存在跨節點合併排序、分頁的問題。
- 存在多資料來源管理的問題。
在瞭解這兩種切分方式的特點後,我們就可以根據自己的業務需求來選擇,通常會同時使用這兩種切分方式,垂直切分更偏向於業務拆分的過程,在技術上我們更關注水平切分的方案。
PS: 稍候再討論一下水平切分的路由過程和分片維度~~