文章目錄
- 為什么要分庫分表
- 一、分庫分表
- 二、不停機分庫分表數據遷移
為什么要分庫分表
一般的機器(4核16G),單庫的MySQL并發(QPS+TPS)超過了2k,系統基本就完蛋了。最好是并發量控制在1k左右。這里就引出一個問題,為什么要分庫分表?
分庫分表目的:解決高并發,和數據量大的問題。
- 高并發情況下,會造成IO讀寫頻繁,自然就會造成讀寫緩慢,甚至是宕機。一般單庫不要超過2k并發
- 數據量大的問題。主要由于底層索引實現導致,MySQL的索引實現為B+TREE,數據量其他,會導致索引樹十分龐大,造成查詢緩慢。第二,innodb的最大存儲限制64TB
要解決上述問題。最常見做法,就是分庫分表。 分庫分表的目的,是將一個表拆成N個表,就是讓每個表的數據量控制在一定范圍內,保證SQL的性能。 一個表數據建議不要超過500W。
一、分庫分表
垂直拆分
就是把一個有很多字段的表給拆分成多個表,或者是多個庫上去。每個庫表的結構都不一樣,每個庫表都包含部分字段。一般來說,可以根據業務維度進行拆分,如訂單表可以拆分為訂單、訂單地址、訂單商品、訂單擴展等表
,又比如做低代碼平臺的時候,各種表單需要保存。可以把表單內容拆分為一個大字斷表
;也可以,根據數據冷熱程度拆分,20%的熱點字段拆到一個表,80%的冷字段拆到另外一個表
,但都要建立1:1或者1:N的關系。
水平分表
統一個表的數據拆到不同的庫不同的表中。可以根據時間、地區、或某個業務鍵維度,也可以通過hash進行拆分,最后通過路由訪問到具體的數據。拆分后的每個表結構保持一致。
二、不停機分庫分表數據遷移
一般數據庫的拆分也是有一個過程的,一開始是單表,后面慢慢拆成多表。那么我們就看下如何平滑的從MySQL單表過度到MySQL的分庫分表架構。
- 利用mysql+canal做增量數據同步,利用分庫分表中間件,將數據路由到對應的新表中
- 利用分庫分表中間件,全量數據導入到對應的新表中
- 通過單表數據和分庫分表數據兩兩比較,更新不匹配的數據到新表中
- 數據穩定后,將單表的配置切換到分庫分表配置上