小伙伴是不是經常遇見大規模集群和數量的時候,業務就提出要對數據進行sharding。
Oracle 和其他數據庫(如 MySQL、PostgreSQL、MongoDB 等)
為什么要進行分片(sharding),分片的原因是什么,實現的原理又分別是什么。
核心目標:解決大規模數據存儲和高并發訪問的性能瓶頸,具體如何落地,策略和步驟是什么?
一、為什么要 Sharding
解決數據庫擴展性問題
- 單節點性能瓶頸:傳統數據庫(如 Oracle RAC)依賴共享存儲架構,當數據量或并發請求增長時,單節點的 I/O、CPU 或內存可能成為瓶頸,導致性能下降。
- 成本與復雜度:垂直擴展(Scale Up)需要昂貴的高端硬件,而分片(Scale Out)通過廉價服務器橫向擴展,顯著降低成本。
- 數據主權與地理分布:某些場景(如跨國業務)需要將數據按地理位置分片,以滿足合規性要求。
應對高并發與大數據量
- 響應時間線性增長:隨著數據量增加,單個數據庫的查詢響應時間呈指數增長。
- 負載均衡:分片將數據和請求分散到多個節點,避免單點過載,提升整體吞吐量。
提高可用性與容錯性
- 故障隔離:單個分片故障不會影響其他分片的數據可用性。
- 動態擴展:新增分片時無需停機,系統可自動調整數據分布。
數據主權與合規性
- 法律要求:某些國家/地區要求數據本地化存儲,分片可按地理位置劃分數據(比如跨國、跨地域企業數據留在本地)。
分片不是優化手段,而是架構層面的質變,解決單點數據庫的先天局限。這一點和從前規劃大數據成千G上TB的規模,其實最后真正可用數據就是百G規模,又是另外一個話題了。?
二、Sharding 的實現原理
Sharding 的核心是 將數據按規則分布到多個分片,并通過協調機制保證一致性。以下是關鍵實現原理:
分片策略(Sharding Strategy)
- 哈希分片(Hash-based):對分片鍵(如用戶 ID)進行哈希計算,決定數據歸屬的分片。優點是數據分布均勻,但動態擴容時需重新計算哈希值。
- 例如:shard_id = hash(user_id) % N(N 為分片數)。
- 范圍分片(Range-based):按分片鍵的范圍劃分數據(如用戶 ID 1-1000 存分片 A,1001-2000 存分片 B)。適用于有序數據(如時間序列),但可能導致數據傾斜。
- 列表分片(List-based):手動指定某些特定值的分片歸屬(如按地區劃分用戶)。適用于已知的靜態數據分布。
- 復合分片(Composite):結合多種策略(如先按范圍分片,再按哈希分片),兼顧靈活性與負載均衡(Oracle 的復合分片)。
數據路由與查詢協調
- 客戶端路由:應用程序直接根據分片鍵計算目標分片(Oracle 的“基于密鑰的路由”)。
- 代理層路由:通過中間件(如 Proxy、Sharding-JDBC)解析 SQL 并路由到對應分片。
- 分片目錄(Sharding Catalog):維護分片映射信息,動態更新分片位置(Sharding-JDBC 的 SQL 解析與改寫)。
事務與一致性
- 本地事務:分片內事務由數據庫自身保證 ACID。
- 跨分片事務:需引入分布式事務協議(如兩階段提交、TCC),但會犧牲部分性能。
- 最終一致性:通過異步復制或事件驅動實現跨分片數據同步(復制與分片結合)。
分片管理與運維
- 動態擴縮容:新增或移除分片時,需重新平衡數據(Elasticsearch 的 API 調整分片分布。
- 數據遷移:通過工具或腳本將數據從舊分片遷移到新分片( MongoDB 的 sh.moveChunk())。
- 監控與調優:實時監控分片負載,避免數據傾斜。
三、Oracle Sharding 的特殊性
Oracle 的 Sharding 的特性:
與表分區的兼容性 :--國產數據努力啊,業界分布式那么多,分片兼容太重要了。
- Oracle Sharding 基于表分區實現,支持所有分區方法(如范圍、哈希、列表),并允許復合分片(兩級分片)。
事務一致性 :
- 支持跨分片的事務性操作(如復雜連接、觸發器),并通過分布式鎖機制保證一致性。
客戶端直連 :
- 支持應用程序直接連接分片,無需中間代理,減少延遲(通過 JDBC 驅動程序直接路由)。
高可用性 :
- 每個分片可配置主從副本,實現故障自動切換。
四、Oracle Sharding 功能多版本對比
1. Oracle 19c 的 Sharding 特性
多表家族支持 :
- 允許在單個數據庫中定義多個表家族(Table Families),每個表家族可基于不同的分片鍵(Sharding Key)進行分片,提升分片策略的靈活性。例如:訂單表按用戶 ID 分片,日志表按時間分片,滿足不同業務場景需求。
Data Guard 備庫 DML 自動重定向 :
- 支持將備庫上的 DML 操作自動重定向到主庫執行,確保 ADG(Active Data Guard)的 ACID 一致性。
RAC 集群增強 :
- 改進 RAC 集群的連續性保持機制,節點故障時事務可連續運行,提高高可用性。
Far Sync 特性 :
- 通過在主庫附近配置 Far Sync 實例,降低主備同步壓力,確保數據零丟失。
2. Oracle 23 ai 的 Sharding 新特性
Oracle 23ai 在 Sharding(分片)領域延續了 Oracle 19c 的核心功能,并在此基礎上引入了多項創新特性,結合分布式數據庫和 AI 技術,進一步增強了分布式數據庫的擴展性、高可用性和智能化管理能力:
基于 Raft 協議的分布式 Sharding
特性:
- 全局分布式數據庫(Globally Distributed Database)支持 Raft 復制協議,替代傳統主從復制(如 Oracle 19c 的 Far Sync)。
- 在節點或數據中心中斷時,實現 亞秒級故障切換(<3 秒),確保零數據丟失。
優勢:
- 提升跨地域分片的可靠性,滿足跨國業務的合規性需求(如數據本地化存儲)。
- 通過 Raft 協議的強一致性機制,減少數據同步延遲。
True Cache 與 Sharding 結合
特性 :
- True Cache 是內存中的一致性緩存服務,支持與 Sharding 聯動。
- 在分布式分片場景下,緩存熱點數據以加速查詢響應。
優勢 :
- 通過緩存減少跨分片的網絡開銷,提升讀寫性能。
- 支持自動化的緩存管理(如 LRU 策略),無需手動干預。
自動化分片管理
特性 :
- 動態擴縮容時,自動平衡數據分布(如新增分片后重新分區)。
- 通過 AI 驅動的負載分析,優化分片鍵選擇(如檢測熱點數據并建議調整分片策略)。
優勢 :
- 簡化運維復雜度,減少人工干預。
- 避免數據傾斜,提升整體系統吞吐量。
Shrink Tablespace 與分片存儲優化
特性 :
- 新增 Shrink Tablespace 功能,支持收縮大文件表空間(Bigfile Tablespace),回收未使用空間。
優勢 :
- 在分片場景下,優化存儲成本,匹配實際數據量。
JSON 與關系模型的統一分片
特性 :
- 結合 JSON 關系二元性(JSON-Relational Duality),支持將 JSON 文檔與關系表統一分片。
- 例如:用戶表按用戶 ID 分片,同時關聯的 JSON 日志數據可存儲在同一分片中。
優勢 :
- 簡化數據模型設計,避免跨分片的復雜 JOIN 操作。
AI Vector Search 與分片集成
特性 :
- 支持在分片數據庫中存儲和查詢向量數據(如 AI 向量搜索),結合分片策略實現分布式語義檢索。
優勢 :
- 在海量非結構化數據(如圖像、文檔)場景下,提升搜索效率。
3. 對比列表?
功能維度 | Oracle 19c | Oracle 23ai |
復制協議 | Far Sync(異步/半同步復制) | Raft 協議(強一致性、快速故障切換) |
分片管理 | 手動擴縮容,需人工調整分片策略 | AI 驅動的自動化擴縮容與負載均衡 |
緩存機制 | 無原生緩存 | True Cache 集成,加速分片查詢 |
存儲優化 | 傳統表空間管理 | Shrink Tablespace 回收未使用空間 |
AI 集成 | 無 | AI Vector Search、自動分片鍵優化 |
高可用性 | RAC 集群增強 | Raft 協議保障亞秒級故障切換 |
五、典型應用場景
跨國企業數據本地化
- 利用 Raft 分布式 Sharding,將用戶數據按地域分片存儲(國內出海企業將用戶分片部署在 EU 區域,國內用戶數據留在本地),滿足合規要求。
高并發電商系統
- 結合 JSON 關系二元性,將訂單表(按用戶 ID 分片)與 JSON 格式的用戶行為日志統一管理,避免跨分片查詢。
AI 驅動的推薦引擎
- 使用 AI Vector Search 在分片數據庫中存儲商品特征向量,支持分布式語義搜索,提升推薦效率。
六、分片的挑戰與優化策略
數據傾斜與熱點問題
- 優化策略:選擇高基數的分片鍵(如用戶 ID 而非性別),動態調整分片策略。
跨分片查詢復雜性
- 優化策略:避免跨分片的 JOIN 或聚合操作,通過冗余存儲或中間層緩存結果。
分片鍵的選擇
- 錯誤示例:使用低基數字段(如性別)作為分片鍵,導致數據分布不均。
- 正確示例:使用高頻查詢字段(如訂單 ID)或業務邏輯相關的字段(如用戶 ID)。
動態擴展成本
- 優化策略:預估數據增長趨勢,提前規劃分片數量;使用自動分片工具(國產 TiDB 就支持自動分片的特性)。
七、Sharing在Oracle 23ai實踐是不是最好的選擇呢?
Sharding 的本質是 通過分布式架構解決單節點數據庫的擴展性瓶頸,其核心在于合理設計分片策略、協調分布式事務,并通過動態管理應對數據增長和故障。無論是 Oracle 還是開源數據庫,Sharding 都是應對海量數據和高并發場景的關鍵技術,但其復雜性需要權衡性能、一致性和運維成本。
Oracle 23ai 的 Sharding 特性在 Oracle 19c 基礎上,通過 Raft 協議、True Cache、AI 自動化管理 和 向量搜索集成,顯著提升了分布式數據庫的可靠性、性能和智能化水平。其核心變化體現在 更強的分布式一致性、更低的運維成本 以及 更靈活的數據模型支持,為大規模、高并發的云原生應用提供了更優解決方案。