1. 程式人生 > >【分庫分表】切分方式(水平切分, 垂直切分)

【分庫分表】切分方式(水平切分, 垂直切分)

【分庫分表】切分方式 - 簡書
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: 稍候再討論一下水平切分的路由過程和分片維度~~