數據庫分庫分表實戰指南:從原理到落地

1. 為什么要分庫分表?

1.1 單庫瓶頸表現

  • 存儲瓶頸:單表數據超過5000萬行,查詢性能急劇下降
  • 性能瓶頸:單庫QPS超過5000后響應延遲顯著增加
  • 可用性風險:單點故障導致全系統不可用

1.2 突破性優勢

+----------------+--------------+-----------------+
| 指標           | 單庫單表      | 分庫分表(16分片) |
+----------------+--------------+-----------------+
| 寫入吞吐量      | 2000 TPS     | 32000 TPS       |
| 查詢延遲        | 120ms        | 15ms            |
| 數據容量        | 500GB        | 8TB             |
+----------------+--------------+-----------------+

2. 分片策略深度解析

2.1 水平分片 vs 垂直分片

分片類型
水平分片
垂直分片
按行拆分
按時間范圍拆分
按列拆分
按業務模塊拆分

2.2 典型分片算法對比

算法適用場景優點缺點
哈希取模均勻分布場景數據分布均勻擴容困難
一致性哈希需要動態擴容擴容影響小實現復雜
范圍分片時序數據支持范圍查詢容易產生熱點
基因分片關聯查詢優化支持跨表關聯設計復雜

3. 生產環境實施流程

3.1 分片方案設計

// 基因分片算法示例
public class GeneSharding {public static String getShard(String orderId) {// 提取用戶ID后四位作為基因String gene = orderId.substring(orderId.length()-4);int hash = Math.abs(gene.hashCode()) % 16;return "shard_" + hash;}
}

3.2 數據遷移方案

1. 全量遷移:使用DataX工具導出歷史數據
2. 增量同步:通過Canal監聽binlog
3. 數據校驗:對比MD5校驗和
4. 流量切換:灰度切換讀/寫流量

3.3 應用改造要點

<!-- MyBatis分表配置示例 -->
<insert id="insertOrder"><!-- 自動路由到對應分表 -->INSERT INTO order_${shardIndex} VALUES (#{orderId}, #{amount})
</insert>

4. 分庫分表中間件選型

4.1 主流方案對比

工具接入方式功能完整性學習成本社區支持
ShardingSphereJDBC代理★★★★★★★☆★★★★★
MyCat數據庫代理★★★★☆★★★★★★☆
VitessgRPC接口★★★★☆★★★★★★★★

4.2 ShardingSphere配置示例

application-sharding.yml
spring:shardingsphere:rules:sharding:tables:t_order:actual-data-nodes: ds${0..1}.t_order_${0..7}database-strategy:standard:sharding-column: user_idsharding-algorithm-name: db_hashtable-strategy:standard:sharding-column: order_timesharding-algorithm-name: table_range

5. 常見問題解決方案

5.1 分布式事務處理

// Seata分布式事務示例
@GlobalTransactional
public void createOrder(Order order) {orderDao.insert(order);          // 寫訂單庫inventoryDao.deduct(order);      // 寫庫存庫accountDao.updateBalance(order); // 寫賬戶庫
}

5.2 跨分片查詢優化

-- 使用全局索引表
CREATE TABLE global_index (biz_id VARCHAR(32) PRIMARY KEY,shard_key VARCHAR(32) NOT NULL
);-- 查詢時先查索引表
SELECT shard_key FROM global_index WHERE biz_id = 'ORDER_123';
SELECT * FROM t_order_${shard_key} WHERE order_id = 'ORDER_123';

6. 監控與調優

6.1 關鍵監控指標

指標類別監控項報警閾值
資源使用分片存儲空間使用率>80%
性能指標跨分片查詢比例>5%
業務指標分片數據分布偏差率>15%

6.2 性能調優技巧

1. 熱點分片處理:動態調整路由策略
2. 查詢優化:強制指定分片鍵
3. 緩存加速:二級緩存+布隆過濾器
4. 連接管理:合理配置連接池參數

7. 真實案例:電商平臺改造

7.1 改造前架構

           [應用集群]|[MySQL主從]500GB數據3000 TPS

7.2 分庫分表方案

16個分庫(用戶ID哈希)
每個庫包含:8個訂單表(時間范圍分片)4個支付表(訂單ID基因分片)

7.3 改造成效

峰值處理能力:52000 TPS → 提升17倍
平均查詢延遲:86ms → 9ms
年度存儲成本:降低42%

8. 演進路線建議

timeline階段1 : 單庫讀寫分離階段2 : 垂直分庫(業務拆分)階段3 : 水平分表(單業務分表)階段4 : 多維度分庫分表階段5 : 單元化架構

技術選型建議:
? 數據量<1TB:使用中間件方案

? 數據量>1TB:考慮NewSQL數據庫(TiDB/CockroachDB)

? 超高并發場景:結合內存數據庫(Redis/Aerospike)

通過合理的分庫分表策略,可以使傳統關系型數據庫支撐起海量數據場景。關鍵在于根據業務特征選擇合適的分片策略,并建立完善的監控運維體系。

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

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

相關文章

Selenium的driver.get_url 和 手動輸入網址, 并點擊的操作,有什么不同?

我在搞爬取的時候&#xff0c;發現有些網站直接用driver.get(url) 跳轉到目標特定的網址的時候&#xff0c;會被強制跳轉到其他的網址上&#xff0c;但是如果是自己手動&#xff0c;在網址欄那里輸入網址&#xff0c;并點回車&#xff0c;卻能完成跳轉。 這是在使用 Selenium …

Java【06】數組查找(二分查找)、排序(冒泡排序、簡單選擇排序)

1. 數組的操作 1.1 數組的反轉 int[] arrs{3,5,7,8,9}; 編寫程序&#xff0c;讓arrs中的數據進行反轉{9,8,7,5,3} 1.2數組的查找 ① 順序查找 從頭到尾一個一個的找&#xff01; ② 二分查找 對數組有一個要求&#xff1a;數組必須是有序(大小)的&#xff01; int num3; int[]…

Redis 基礎詳解:從入門到精通

在當今互聯網應用開發領域&#xff0c;數據存儲與處理的性能和效率至關重要。Redis&#xff08;Remote Dictionary Server&#xff09;作為一款開源的、基于內存的鍵值存儲系統&#xff0c;憑借其出色的性能和豐富的功能&#xff0c;被廣泛應用于數據庫、緩存、消息中間件等場景…

圖片轉ICO圖標工具

圖片轉ICO圖標 可批量操作 下載地址&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/6312c565ec98 這個工具是一個批量圖片轉ICO圖標的神器&#xff0c;有了它&#xff0c;以后再也不用為ICO格式的轉換煩惱&#xff01;而且這個軟件特別小巧&#xff0c;完全不用安裝。…

0基礎 | L298N電機驅動模塊 | 使用指南

引言 在嵌入式系統開發中&#xff0c;電機驅動是一個常見且重要的功能。L298N是一款高電壓、大電流電機驅動芯片&#xff0c;廣泛應用于各種電機控制場景&#xff0c;如直流電機的正反轉、調速&#xff0c;以及步進電機的驅動等。本文將詳細介紹如何使用51單片機來控制L298N電…

Flink 系列之十五 - 高級概念 - 窗口

之前做過數據平臺&#xff0c;對于實時數據采集&#xff0c;使用了Flink。現在想想&#xff0c;在數據開發平臺中&#xff0c;Flink的身影幾乎無處不在&#xff0c;由于之前是邊用邊學&#xff0c;總體有點混亂&#xff0c;借此空隙&#xff0c;整理一下Flink的內容&#xff0c…

大疆卓馭嵌入式面經及參考答案

FreeRTOS 有哪 5 種內存管理方式&#xff1f; heap_1.c&#xff1a;這種方式簡單地在編譯時分配一塊固定大小的內存&#xff0c;在整個運行期間不會進行內存的動態分配和釋放。它適用于那些對內存使用需求非常明確且固定&#xff0c;不需要動態分配內存的場景&#xff0c;優點是…

Java 線程池原理

Java 線程池是一種管理和復用線程的機制&#xff0c;其原理如下&#xff1a; 核心概念 線程池的初始化 &#xff1a;在創建線程池時&#xff0c;需要設置一些關鍵參數&#xff0c;如核心線程數&#xff08;corePoolSize&#xff09;、最大線程數&#xff08;maximumPoolSize&am…

大模型都有哪些超參數

大模型的超參數是影響其訓練效果、性能和泛化能力的關鍵設置,可分為以下幾大類別并結合實際應用進行詳細說明: 一、訓練過程相關超參數 學習率(Learning Rate) 作用:控制參數更新的步長,直接影響收斂速度和穩定性。過高會導致震蕩或過擬合,過低則收斂緩慢。調整策略:初…

路由器斷流排查終極指南:從Ping測試到Wireshark抓包5步定位法

測試路由器是否出現“斷流”&#xff08;網絡連接間歇性中斷&#xff09;&#xff0c;需通過多維度排查硬件、軟件及外部干擾因素。以下是詳細步驟指南&#xff1a; 一、基礎環境準備 設備連接 有線測試&#xff1a;用網線將電腦直接連接路由器LAN口&#xff0c;排除WiFi干擾。…

低代碼開發:開啟軟件開發的新篇章

摘要 低代碼開發作為一種新興的軟件開發方式&#xff0c;正在迅速改變傳統軟件開發的模式和效率。它通過可視化界面和預設的模板&#xff0c;使非專業開發者也能夠快速構建應用程序&#xff0c;極大地降低了開發門檻和成本。本文將深入探討低代碼開發的定義、優勢、應用場景以及…

基于Django汽車數據分析大屏可視化系統項目

基于Django汽車數據分析大屏可視化系統項目 一、項目概述 本項目是一個基于 Python 的汽車數據分析大屏可視化系統&#xff0c;旨在通過直觀的可視化界面展示汽車相關數據&#xff0c;幫助用戶更好地理解和分析汽車市場動態、車輛性能等信息。系統采用前后端分離的架構&#…

WebRTC通信原理與流程

1、服務器與協議相關 1.1 STUN服務器 圖1.1.1 STUN服務器在通信中的位置圖 1.1.1 STUN服務簡介 STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT會話穿越應用程序&#xff09;是一種網絡協議&#xff0c;它允許位于NAT&#xff08;或多重 NAT&#xff09;…

Beta分布--貝葉斯建模概率或比例常用分布

Beta分布是一種定義在區間 ([0, 1]) 上的連續概率分布&#xff0c;常用于描述比例或概率的不確定性。它的形狀由兩個正參數 (\alpha)&#xff08;alpha&#xff09;和 (\beta)&#xff08;beta&#xff09;控制&#xff0c;能夠呈現多種形態&#xff08;如對稱、偏態、U型等&am…

深度學習算法:開啟智能時代的鑰匙

引言 深度學習作為機器學習的一個分支&#xff0c;近年來在圖像識別、自然語言處理、語音識別等多個領域取得了革命性的進展。它的核心在于構建多層的神經網絡&#xff0c;通過模仿人腦處理信息的方式&#xff0c;讓機器能夠從數據中學習復雜的模式。 深度學習算法的基本原理…

深入了解linux系統—— 自定義shell

shell的原理 我們知道&#xff0c;我們程序啟動時創建的進程&#xff0c;它的父進程都是bash也就是shell命令行解釋器&#xff1b; 那bash都做了哪些工作呢&#xff1f; 根據已有的知識&#xff0c;我們可以簡單理解為&#xff1a; 輸出命令行提示符獲取并解析我們輸入的指令…

Redux和Vuex

為什么React和Vue需要Redux和Vuex 狀態管理需求的演變 #mermaid-svg-GaKl3pkZ82yc1m8E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GaKl3pkZ82yc1m8E .error-icon{fill:#552222;}#mermaid-svg-GaKl3pkZ82yc1m8E…

Kubernetes排錯(十三):Pod間偶發超時問題排查

在微服務架構中&#xff0c;Pod間偶發的通信超時是最令人頭疼的問題之一。本文將通過生產環境中的真實案例&#xff0c;手把手教你定位這類"幽靈問題"。 一、快速定位問題方向&#xff08;5分鐘縮小范圍&#xff09; 1. 基礎檢查三板斧 # 檢查Service與Endpoint映…

Nginx 源碼安裝成服務

一、環境準備 一臺裝有 CentOS 7.9 的虛擬機&#xff08;IP: 192.168.40.81&#xff09;nginx-1.21.6.tar.gz 安裝包一個&#xff08;版本隨意&#xff09; 二、安裝 1&#xff09;解壓 nginx-1.21.6.tar.gz tar -xzvf nginx-1.21.6.tar.gz -tar&#xff1a;這是一個在 Linu…

L51.【LeetCode題解】438. 找到字符串中所有字母異位詞(四種方法)

目錄 1.題目 2.分析 暴力解法 方法1:排序(超時) 方法2:哈希表(險過) ★判斷兩個哈希表是否相同算法(通用方法,必須掌握) 能相等的前提:兩個哈希表的大小相等 哈希表有迭代器,可以使用范圍for從頭到尾遍歷 提交結果 優化方法:定長滑動窗口 提交結果 使用哈希數組更快…