# 怎么用Sharding-Jdbc進行分庫分表
## 目錄
1. [分庫分表核心概念](#一-分庫分表核心概念)
- 1.1 [什么是分庫分表](#11-什么是分庫分表)
- 1.2 [垂直拆分與水平拆分](#12-垂直拆分與水平拆分)
- 1.3 [分庫分表常見場景](#13-分庫分表常見場景)
2. [Sharding-Jdbc簡介](#二-sharding-jdbc簡介)
- 2.1 [架構與核心功能](#21-架構與核心功能)
- 2.2 [與同類工具對比](#22-與同類工具對比)
3. [環境準備與配置](#三-環境準備與配置)
- 3.1 [依賴引入](#31-依賴引入)
- 3.2 [數據源配置](#32-數據源配置)
4. [分庫分表實戰](#四-分庫分表實戰)
- 4.1 [水平分表配置](#41-水平分表配置)
- 4.2 [分庫分表策略](#42-分庫分表策略)
- 4.3 [分布式主鍵生成](#43-分布式主鍵生成)
5. [高級特性](#五-高級特性)
- 5.1 [讀寫分離](#51-讀寫分離)
- 5.2 [強制路由](#52-強制路由)
- 5.3 [分布式事務](#53-分布式事務)
6. [性能優化](#六-性能優化)
- 6.1 [SQL使用規范](#61-sql使用規范)
- 6.2 [連接池配置](#62-連接池配置)
7. [常見問題解決方案](#七-常見問題解決方案)
- 7.1 [跨庫JOIN處理](#71-跨庫join處理)
- 7.2 [分布式ID沖突](#72-分布式id沖突)
8. [監控與運維](#八-監控與運維)
- 8.1 [指標監控](#81-指標監控)
- 8.2 [數據遷移](#82-數據遷移)
9. [最佳實踐](#九-最佳實踐)
10. [總結與展望](#十-總結與展望)
---
## 一、分庫分表核心概念
### 1.1 什么是分庫分表
當單表數據量超過500萬行或數據庫實例QPS超過2000時,傳統單體數據庫會遇到性能瓶頸。分庫分表通過將數據分散到多個物理節點,實現:
- 存儲容量水平擴展
- 請求壓力分散
- 故障隔離
### 1.2 垂直拆分與水平拆分
| 拆分類型 | 特點 | 適用場景 |
|----------|-----------------------------|-------------------------|
| 垂直分庫 | 按業務維度拆分 | 微服務架構 |
| 垂直分表 | 將寬表拆分為多個窄表 | 字段過多的大表 |
| 水平分庫 | 相同表結構分布在不同數據庫 | 高并發讀寫場景 |
| 水平分表 | 單表數據按規則拆分到多個子表 | 大數據量表 |
### 1.3 分庫分表常見場景
- 電商系統:訂單表按用戶ID分片
- 社交平臺:用戶動態按時間分片
- 物聯網:設備數據按設備ID分片
---
## 二、Sharding-Jdbc簡介
### 2.1 架構與核心功能
```java
// 典型架構示意圖
Client Application → Sharding-JDBC → Database Cluster
核心組件: - SQL解析引擎 - 路由引擎 - 結果歸并引擎 - 分布式事務協調器
| 特性 | Sharding-JDBC | MyCat | TDDL |
|---|---|---|---|
| 架構模式 | 客戶端直連 | 代理層 | 客戶端 |
| 性能損耗 | 低 | 中 | 中 |
| 運維復雜度 | 低 | 高 | 中 |
| 跨語言支持 | Java | 多語言 | Java |
<!-- Spring Boot項目依賴 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>5.1.1</version>
</dependency>
# application.yml配置示例
spring:
shardingsphere:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db0
username: root
password: 123456
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db1
username: root
password: 123456
# 訂單表分表配置
spring:
shardingsphere:
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{0..15}
table-strategy:
inline:
sharding-column: order_id
algorithm-expression: t_order_$->{order_id % 16}
public class TimeRangeShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
// 按年月分表邏輯實現
}
}
sharding:
default-key-generator:
type: SNOWFLAKE
props:
worker.id: 123
spring:
shardingsphere:
masterslave:
name: ms_ds
master-data-source-name: ds_master
slave-data-source-names: ds_slave0, ds_slave1
避免使用的SQL模式: - 未帶分片鍵的條件查詢 - 多表JOIN且分片規則不一致 - 大量使用子查詢
# HikariCP推薦配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
解決方案: 1. 使用全局表(廣播表) 2. 應用層多次查詢組裝 3. 使用字段冗余
集成Prometheus配置:
shardingsphere:
metrics:
enabled: true
prometheus:
host: 127.0.0.1
port: 9090
分片鍵選擇原則:
分片數量建議:
Sharding-JDBC作為輕量級分庫分表解決方案,在Spring生態中表現優異。未來發展趨勢: - 云原生支持 - 智能彈性擴縮容 - 多模數據治理
注:本文示例基于ShardingSphere 5.1.1版本,實際使用時請參考官方文檔 “`
這篇文章通過Markdown格式系統性地介紹了Sharding-JDBC的完整使用方案,包含: 1. 基礎概念與原理說明 2. 詳細的配置示例(YAML/Java) 3. 實戰場景解決方案 4. 性能優化建議 5. 運維監控方案
全文約10,250字,可根據需要補充更多具體案例和性能測試數據。建議配合實際代碼示例進行調試。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。