1、什么是分庫分表
分庫分表包括分庫和分表兩個維度,在開發(fā)過程中,對于每個維度都可以采用兩種拆分思路,即垂直拆分和水平拆分。
1.1、分表
將同一個庫中的一張表(比如SPU表)按某種方式(垂直拆分、水平拆分)拆分成SPU1、SPU2、SPU3、SPU4…等若干張表,如下圖所示:
1.2、分庫
在表數據不變的情況下,對數據庫進行拆分,即將一個庫中的若干張表按某種方式拆分出來,放到不同的數據中,如下圖所示:
1.3、分庫+分表
數據庫的數量和表的數量都有變化,例如將一個數據庫中的一張表(比如SPU表)拆分成SPU1、SPU2、SPU3、SPU4…等若干張表,并放到不同的數據里面,如下圖所示:
2、拆分方式
2.1、水平拆分
水平拆分指的是在整個表數據結構不發(fā)生變化的前提下,我們將一張表的數據拆分成多張表,如下圖所示:
這樣拆分完以后,單張表的數據量就降下來了,讀寫性能自然就上去了。
2.2、垂直拆分
垂直拆分指將本來放在一張表中的字段,按業(yè)務需求拆分開放到多張表中,如下圖所示:
這樣拆分完后,就將需要經常查詢的數據單獨放到一張表中了,性能也就提上去了。
2、何時進行分庫分表?
當系統性能出現瓶頸,我們通過代碼優(yōu)化、加緩存、JVM性能調優(yōu)、限流、搭建集群等常用的技術手段依然無法很好的解決問題時,就可以考慮采用分庫分表來提高系統的性能。常見需要進行分表分表的場景有以下幾點:
2.1、單表出現性能瓶頸
單表數據量較大,導致讀寫性能較慢。
2.2、單庫出現性能瓶頸
- CPU壓力過大(busy、load過高),導致讀寫性能較慢。
- 內存不足(緩存池命中率較低、磁盤讀寫IOPS過高),導致讀寫性能較慢。
- 磁盤空間不足,導致無法正常寫入數據。
- 網絡帶寬不足,導致讀寫性能較慢。
3、如何選擇分庫、分表或者分庫+分表
3.1、只分表
- 單表數據量較大,單表讀寫性能出現瓶頸。
- 經過評估單庫的容量和性能可以支撐未來幾年的數據量增長。
3.2、只分庫
- 數據庫(讀)寫壓力較大,數據庫出現存儲性能瓶頸。
3.3、分庫分表
- 單表數據量較大,單表讀寫性能出現瓶頸。
- 數據庫(讀)寫壓力較大,數據庫出現存儲性能瓶頸。
4、分庫分表帶來的問題
4.1、分布式唯一ID
分庫分表后,一張表被拆成了多張表,數據庫的自增ID無法保證數據的唯一性了,因此需要映入一種方案來保證數據ID的唯一性。成熟的解決方案有以下幾個:
4.1.1、UUID
優(yōu)點:本地生成,性能高。
缺點:
- 更占用存儲空間,一般為長度36的字符串。
- 不適合作為MySQL主鍵:無序性會導致磁盤隨機IO、葉分裂等問題;普通索引需要存儲主鍵值,導致B+樹“變高”,IO次數變多。
- 基于MAC地址的送算法可能會導致MAC地址泄漏。
4.1.2、雪花算法
- 41bit時間戳:可用69年
- 10bit工作機器:可部署1024臺服務器
- 12bit序列號:每毫秒可生成4096個ID,每秒也就是409萬。
4.1.3、號段模式
4.2、分布式事務
4.2.1、2PC
2PC 即兩階段提交協議,是將整個事務流程分為兩個階段,準備階段(Prepare phase)、提交階段(commit phase),2 是指兩個階段,P 是指準備階段,C 是指提交階段。
4.2.2、TCC
TCC(Try-Confirm-Cancel)是一種事務模型,其概念源自于Pat Helland的論文《Life beyond Distributed Transactions:an Apostate’s Opinion》。
TCC提出了一種基于業(yè)務層面的事務定義方式,通過由業(yè)務自身控制鎖粒度,解決了復雜業(yè)務中跨表跨庫等大顆粒度資源鎖定的問題。
TCC將事務過程分為Try(嘗試)、Confirm(確認)和Cancel(取消)三個階段,每個階段由業(yè)務代碼控制,避免了長事務的問題,從而提高了性能。
TCC 的具體流程如下圖所示:
4.2.3、常見的保證最終一致的處理方法
- 回滾
- 重試
- 監(jiān)控
- 告警
- 冪等
- 對賬
- 人工補償
4.3、跨庫JOIN/分頁查詢
4.3.1、合適的分表字段(sharding key)
合理選擇,避免大多數跨庫查詢
4.3.2、搜索引擎支持:ES
數據冗余到ES,使用ES支持復雜查詢。
核心流程:
- 使用ES查詢出關鍵字段,例如:門店id和商品id。
- 再使用關鍵字段去查詢完整數據。
注意點: - ES只需要存儲需要搜索的字段。
4.3.3、分開查詢,內存中聚合
先查詢出A表數據,然后根據A表的結果查詢B表。
注意點:文章來源:http://www.zghlxwxcb.cn/news/detail-682556.html
- 查詢出來的數據量
- 內存占用情況
4.3.4、冗余字段
A表查詢需要B表的field1字段,則將B表的field1存儲一份到A表上。
適用場景:只需要少量字段,則可以直接冗余。文章來源地址http://www.zghlxwxcb.cn/news/detail-682556.html
到了這里,關于性能優(yōu)化之分庫分表的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!