分庫分表深度解析

一、為什么要分庫分表?

通常,數據庫性能受到如下幾個限制:

  1. 硬件瓶頸:單機的 CPU、內存、磁盤 I/O 等資源總是有限。例如,當單表中的記錄達到上億、甚至更高時,表掃描、索引維護和數據遷移會變得非常慢。
  2. 單點壓力:所有業務都依賴單數據庫實例,一旦主庫宕機,整個系統面臨服務不可用的風險。
  3. 高并發訪問:瞬時的并發讀寫流量可能壓垮數據庫連接數,導致業務性能急劇下降。

分庫分表的目標

  • 提高數據庫性能:通過分布式擴展,將數據壓力分散到多個獨立的數據庫節點上,減少單庫讀寫開銷。
  • 提高系統可用性:分庫分表支持分布式架構,單節點故障不會影響整體服務。
  • 支持海量數據存儲:橫向擴展減少單表大小,優化查詢穩定性,降低表掃描的可能性。

二、分庫與分表的核心概念

1. 水平分表 & 垂直分表

  • 水平分表:將一個表根據某種規則(如主鍵范圍或哈希值)分成多張子表,數據均勻分布。

    • 優點:解決單表數據量大引起的性能問題。
    • 缺點:跨分片查詢變復雜,插入引發分片路由。
    • 應用場景:訂單表、聊天消息表等高增長、海量記錄的表。
  • 垂直分表:按字段將一個表分拆為多張表,按功能屬性劃分。

    • 優點:減小單表字段數,降低查詢掃描的 IO。
    • 缺點:可能涉及跨表關聯查詢,開發復雜度提升。
    • 應用場景:拆分用戶主表和擴展表等。

2. 分庫

分庫是將數據庫從單實例擴展為多實例的架構部署方式。一種常見方式是結合分表邏輯,將分表數據分別存儲到不同的數據庫實例中。分庫后的數據庫實例可以分布在不同的物理節點上,獨立運行并擴展。

分庫更關注于系統間負載的隔離,可以:

  • 減少資源競爭。
  • 增加數據庫服務器擴展能力。

三、分庫分表的設計原則與實現策略

1. 劃分規則的設計

分庫分表依賴于科學合理的分片規則,具體包括以下幾類方法:

  1. 范圍分片

    • 將數據按照一定的范圍劃分,例如將表按照時間、ID區間分成若干份。
    • 優點:規則簡單,插入和查詢性能高。
    • 缺點:數據熱點問題容易產生。
    • 適用場景:按時間維度分的日志表、賬單表。
  2. 哈希分片

    • 基于主鍵進行哈希運算,哈希函數值映射到多個分片中。
    • 優點:分布均勻,減少單點壓力。
    • 缺點:不支持區間查詢。
    • 適用場景:商品表、用戶表。
  3. 按維度分片(Sharding By Key)

    • 針對業務邏輯,將數據通過特定業務字段分拆。
    • 舉例:電商系統按商戶 ID、用戶 ID 或地區分片。
    • 特點:滿足業務隔離規則,關聯性同維度數據通常集中。
  4. 動態拆分

    • 初期無需分片,當數據規模達到一定的閾值后,通過動態調整分片規則,逐步將數據遷移到多個分片中進行存儲與查詢。
    • 優點:初期設計簡單,降低復雜度,靈活擴展,資源利用率高。
    • 缺點:數據遷移過程中存在一定成本,設計與實施難度較高。
    • 適用場景:初期數據量較少,后續可能隨業務增長呈指數級擴大,例如不斷增長的訂單表、用戶表等。

2. 分庫分表的關鍵問題與挑戰

在進行分庫分表的實際實施過程中,需要面對一些挑戰性問題。以下是常見的幾個問題以及應對策略:

(1) 數據路由與查詢復雜度
  • 問題描述:分庫分表后,數據分散存儲,傳統的單庫查詢方式不再適用。每次請求必須先確定目標庫或目標表。
  • 解決方案
    1. 路由規則的設計:通過統一的分片鍵(sharding key,通常是 ID 或某些范圍字段),以程序化的方法路由。多使用中間件或配置靜態哈希路由規則。
    2. 中間件支持:通過分庫分表中間件(如 MyCat、ShardingSphere)簡化數據路由層的開發。
    3. 分布式環境下的聚合查詢:針對跨庫查詢,通過中間件層負責分布式查詢聚合(MapReduce 類邏輯)。如 Elasticsearch 使用的分布式分片存儲結合索引設計。
(2) 跨分片事務
  • 問題描述:傳統關系型數據庫通過鎖定機制或分布式回滾保障事務一致性,但分庫分表的多實例環境中,事務很難局限在單節點內管理。
  • 解決方案
    1. 分布式事務協議:使用兩階段提交(2PC)或三階段提交,協調資源的一致性。
    2. 本地事務 + 最終一致性:通過異步補償(如消息隊列)實現弱一致性。
    3. TCC 模型:Try-Confirm-Cancel,通過應用邏輯隔離事務狀態,適用于電商訂單場景。
    4. 去中心化事務落地:結合 CAP 理論,優先將核心操作放在單庫內完成,避免高頻跨分片事務。
(3) ID 唯一性問題
  • 問題描述:分庫分表后,自增 ID 會失去意義,因為每個分片的序列號沖突可能性大。
  • 解決方案
    1. 分布式 ID 生成
      • UUID:優點是全局唯一,容易生成;缺點是過長,查詢和索引效率較低。
      • 雪花算法(Snowflake):Twitter 提出的分布式 ID 生成器(64 位),結合時間戳、機器 ID 等信息生成遞增的全局唯一 ID。
      • 數據庫序列/步長生成:如 MySQL 的 auto_increment,步長分片,避免沖突。
      • Redis 計數器:利用 Redis 的原子性操作(如 INCR)生成唯一 ID。
    2. 聯合主鍵:以分片鍵和記錄本地自增 ID 為聯合主鍵。
(4) 跨節點關聯查詢問題
  • 問題描述:傳統的多表關聯查詢(JOIN)隨著表橫向拆分,可能涉及多個庫或多個節點的操作,使得查詢性能急劇下降。
  • 解決方案
    1. 查詢拆分:通過業務邏輯解耦查詢,將復雜的多表關聯拆分成多次單表查詢。
    2. 數據冗余與同步:在不同分片中保存可能關聯的冗余數據,減少 JOIN 的發生。
    3. 實時索引同步:使用分布式搜索引擎(如 Elasticsearch)作為輔助索引服務。
    4. 分布式 SQL 中間件:使用支持分布式 JOIN 查詢的中間件,如 ShardingSphere 等,自動完成查詢優化和數據路由。
(5) 數據遷移與擴容
  • 問題描述:隨著業務增長,最初設計的分片規則可能無法滿足需求。例如,新加入一個數據庫實例需要重新分片遷移大量數據。

  • 解決方案

    1. 添加分片規則的靈活性:在設計初期預留一定的擴展字段,如虛擬分區粒度更細。
    2. 數據遷移策略
      • 全量數據遷移:冷備快照 + 增量數據補償。
      • 遷移中間態機制:遷移過程中適配讀寫的雙寫
  • 遷移過程中避免服務中斷

    1. 雙寫機制:讀寫同時進行到新舊數據庫,直至新數據庫中的數據完全同步后切換流量。
    2. 灰度遷移:逐步將少量的業務流量切換到新分片庫,通過遷移過程的穩定性測試最終完成全量服務轉移。
    3. 數據備份與回滾:做好遷移失敗時的應急回滾策略,例如通過定時快照還原到舊數據庫。

3. 分庫分表中間件的選型與特點

在分庫分表實踐中,中間件扮演了舉足輕重的角色,它們屏蔽了分布式架構的復雜性,簡化了開發人員的實現難度。以下是幾種流行的分庫分表中間件及其特點:

(1) MyCat
  • 開源的數據庫分庫分表中間件,支持 MySQL 等數據庫。
  • 特點
    • 支持水平拆分和垂直拆分。
    • 兼容多種分表算法(哈希、范圍等)。
    • 提供簡單的跨分庫關聯查詢支持,通過全局聚合完成最終結果。
  • 缺點
    • 高并發場景性能相對較低,事務支持能力較弱。
(2) ShardingSphere
  • Apache 社區支持的開源分布式數據庫生態,包含 Sharding-JDBC、Sharding-Proxy 等模塊。
  • 特點
    • 靈活的分布式 SQL 查詢支持,能在程序中無縫集成。
    • 完善的動態分片、負載均衡、高可用機制。
    • 支持柔性事務(TCC)和分布式事務(2PC)。
  • 缺點
    • 學習曲線較陡,配置復雜度較高。
(3) TiDB
  • 分布式 NewSQL 數據庫,天然支持數據分片,具備良好的集群擴展能力。
  • 特點
    • 兼容 MySQL 協議,可直接無縫遷移。
    • 自動分布式事務支持,避免人工分片邏輯。
    • 水平擴展能力強,擅長解決 PB 級別的存儲需求。
  • 缺點
    • 對高性能實時寫入會產生一定延遲。

四、分庫分表實戰案例分析

以下結合具體場景,詳細介紹分庫分表的一個落地方案:

場景:大型電商平臺的訂單系統

業務特點
  • 每天高峰期存在數百萬級訂單寫入請求。
  • 滯留訂單需要長期統計與查詢。
  • 支付狀態、物流信息等多維度數據需要實時更新。
傳統痛點
  1. 單表數據過億,索引查詢效率下降。
  2. 高頻訂單寫操作導致數據庫連接池不堪重負。
  3. 跨表關聯(如訂單 → 用戶)深受大表影響。
分庫分表架構設計
  1. 分表模型設計

    • 對訂單表按用戶 ID 進行哈希分片,每 10 萬用戶分為一個分片(Hash(user_id) % 16 = 庫編號),單表內按時間分區存儲。
    • 利用時間字段按天創建分區索引,確保歷史訂單查詢性能。
  2. 分庫設計

    • 將訂單數據存儲在 16 個數據庫實例中,每個實例組成主從集群。
    • 數據庫實例之間物理隔離,分布式部署,減少單機資源競爭。
  3. ID 唯一性生成

    • 通過 Twitter 的 Snowflake 算法生成包含時間戳、節點號、自增序列的全局唯一訂單編號。
  4. 事務保障

    • 主流程訂單寫入盡量避免跨分片操作。
    • 對于支付、庫存

參考文檔: https://blog.csdn.net/weixin_61669379/article/details/141648151

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QListWidget的函數,信號介紹

前言 Qt版本:6.8.0 該類用于列表模型/視圖 QListWidgetItem函數介紹 作用 QListWidget是Qt框架中用于管理可交互列表項的核心組件,主要作用包括: 列表項管理 支持動態添加/刪除項:addItem(), takeItem()批量操作:addItems()…

ModbusRTU轉profibusDP網關與RAC400通訊報文解析

ModbusRTU轉profibusDP網關與RAC400通訊報文解析 在工業自動化領域,ModbusRTU和ProfibusDP是兩種常見的通信協議。ModbusRTU以其簡單、可靠、易于實現等特點,廣泛應用于各種工業設備之間的通信;而ProfibusDP則是一種高性能的現場總線標準&am…

Python容器

一、容器 1. 列表【】:有序可重復可混裝可修改 [元素1,元素2,元素3,...] ? 可以容納多個元素 ? 可以容納不同類型的元素(混裝) ? 數據是有序存儲的(有下標序號) ? 允許重復數…

webpack面試問題

一、核心概念 Webpack的構建流程是什么? 答案: 初始化:讀取配置,創建Compiler對象編譯:從入口文件開始,遞歸分析依賴關系,生成依賴圖模塊處理:調用Loader轉換模塊(如babel-loader)輸出:將處理后的模塊組合成Chunk,生成最終文件Loader和Plugin的區別? Loader:文件…

uniapp-商城-66-shop(2-品牌信息顯示,數據庫讀取的異步操作 放到vuex actions)

完成頁面的顯示,但是還需要進行修改,這里涉及到修改中的信息同步顯示。也會涉及到數據的讀取,修改和同步。 本文介紹了如何使用Vuex管理品牌數據,實現數據的同步顯示和修改。主要內容包括:1.將獲取品牌數據的異步操作封…

使用Pyinstaller打包python,全過程解析【2025最詳細】

一、如何使用 Pyinstaller 打包 Python 程序 1.打開終端 右鍵點擊文件夾空白處,選擇 打開于 > 打開終端 2.安裝 pyinstaller 在打開的終端中,輸入命令【pip install pyinstaller】 使用 Python 包管理工具 pip 來安裝 Pyinstaller。等待安裝過程結…

GPU加速Kubernetes集群助力音視頻轉碼與AI工作負載擴展

容器編排與GPU計算的結合,為追求性能優化的企業開辟了戰略轉型的新路徑 基于GPU的托管Kubernetes集群不僅是技術選擇,更是徹底改變企業處理高負載任務的戰略部署方式。 隨著人工智能和機器學習項目激增、實時數據處理需求的劇增,以及高性能媒…

LINUX 524 rsync+inotify 調試(問題1:指定端口無法同步/已通過;問題2:rsync.log文件中時間不顯示/已顯示)

怎么把java文件夾給傳過去了 rsync inotify 監控代碼實時傳輸調試 沒看到日志 這里面有了 rsync -e"ssh -p 3712" -av /root/app/java/ code192.168.235.100:/home/code/backup/java_backup/ 文件夾后面的/要加上 [rootlocalhost java]# cat /var/log/rsync.log…

Python入門手冊:條件判斷

條件判斷是編程中不可或缺的一部分,它允許程序根據不同的條件執行不同的代碼塊。Python提供了if、elif和else語句來實現條件判斷。通過這些語句,你可以控制程序的流程,使其能夠根據不同的情況做出相應的反應。本文將詳細介紹Python中的條件判…

x-cmd install | cargo-selector:優雅管理 Rust 項目二進制與示例,開發體驗升級

目錄 功能亮點安裝優勢特點適用場景總結 還在為 Rust 項目中眾多的二進制文件和示例而煩惱嗎?cargo-selector 讓你告別繁瑣的命令行,輕松選擇并運行目標程序! 功能亮點 交互式選擇: 在終端中以交互方式瀏覽你的二進制文件和示例&…

Baklib知識中臺高效實踐路徑

知識中臺全周期構建路徑 Baklib在構建知識中臺全周期管理體系時,以知識價值轉化為核心導向,通過三階段遞進實現閉環運作。在知識采集階段,運用智能爬蟲與API接口技術,聚合分散在業務系統、文檔庫及溝通工具中的碎片化知識資產&am…

mapbox進階,手寫放大鏡功能

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.1 ??mapboxgl.Map style屬性二、??手寫放大鏡功能1. ??實現思路2. ??…

康佳Java開發面試題及參考答案

面向對象三大特性是什么?請舉例說明多態。 面向對象編程(OOP)的三大核心特性是封裝、繼承和多態。封裝是將數據和操作數據的方法綁定在一起,并隱藏對象的內部實現細節;繼承允許一個類繼承另一個類的屬性和方法&#x…

Spark集群架構解析:核心組件與Standalone、YARN模式深度對比(AM,Container,Driver,Executor)

一、核心組件定義與關系拆解 1. ApplicationMaster(AM) 定義:YARN 框架中的應用管理器,每個應用程序(如 Spark 作業)對應一個 AM。職責: 向 YARN 的 ResourceManager 申請資源(Con…

IS-IS報文

前言: IS-IS采用分層架構,所有Level-2和Level 1-2路由器構成了骨干區域,同一區域的Level-1路由器構成了普通區域IS-IS支持三種認證方式,分別是接口認證、區域認證、路由域認證IS-IS有四種報文類型,分別是IIH、CSNP、P…

【Flutter】多語言適配-波斯語RTL從右到左

前言 在多語言適配的時候,波斯語的顯示是從右到左的,需要針對一些控件進行單獨適配。 核心邏輯:根據語言動態設置 Directionality Widget build(BuildContext context) {final isRtl Localizations.localeOf(context).languageCode fa;r…

【VSCode】在遠程服務器Linux 系統 實現 Anaconda 安裝與下載

【遠程服務器】Anaconda 安裝與下載 一、 安裝Anaconda【方式一】直接在遠程服務器下載,通過 wget 命令:【方式二】在本地電腦下載,在同意 vscode上傳到服務器二、配置環境變量 本文基于 VSCode 進行遠程服務器的配置,VSCode 相關安裝可參考下…

【深度學習-Day 17】神經網絡的心臟:反向傳播算法全解析

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

線性回歸神經網絡從0到1

1.線性方程和向量乘法 深度學習的基礎就是從線性回歸方程的理論進入的。簡單的線性回歸方程為 比如大家日常中買房子,價格受到哪些因素影響呢? 比如房齡、交通、是否是學區、有無配套超市、公園,這些基本是外部條件,內部條件諸如…

11|省下錢買顯卡,如何利用開源模型節約成本?

不知道課程上到這里,你賬戶里免費的5美元的額度還剩下多少了?如果你嘗試著完成我給的幾個數據集里的思考題,相信這個額度應該是不太夠用的。而ChatCompletion的接口,又需要傳入大量的上下文信息,實際消耗的Token數量其…