分庫分表ShardingSphere-JDBC筆記整理

来源:https://www.cnblogs.com/yuanbeier/archive/2022/08/10/16574366.html
-Advertisement-
Play Games

一、分庫分表解決的現狀問題 解決資料庫本身瓶頸 連接數: 連接數過多時,就會出現‘too many connections’的錯誤,訪問量太大或者資料庫設置的最大連接數太小的原因 Mysql預設的最大連接數為100.可以修改,而mysql服務允許的最大連接數為16384 資料庫分表可以解決單表海量數 ...


一、分庫分表解決的現狀問題

  • 解決資料庫本身瓶頸

    • 連接數: 連接數過多時,就會出現‘too many connections’的錯誤,訪問量太大或者資料庫設置的最大連接數太小的原因

    • Mysql預設的最大連接數為100.可以修改,而mysql服務允許的最大連接數為16384

    • 資料庫分表可以解決單表海量數據的查詢性能問題

    • 資料庫分庫可以解決單台資料庫的併發訪問壓力問題

  • 解決系統本身IO、CPU瓶頸

    • 磁碟讀寫IO瓶頸,熱點數據太多,儘管使用了資料庫本身緩存,但是依舊有大量IO,導致sql執行速度慢
    • 網路IO瓶頸,請求的數據太多,數據傳輸大,網路帶寬不夠,鏈路響應時間變長
    • CPU瓶頸,尤其在基礎數據量大單機複雜SQL計算,SQL語句執行占用CPU使用率高,也有掃描行數大、鎖衝突、鎖等待等原因
      • 可以通過 show processlist; 、show full processlist,發現 CPU 使用率比較高的SQL
      • 常見的對於查詢時間長,State 列值是 Sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result,Using filesort 等都是可能有性能問題SQL,清楚相關影響問題的情況可以kill掉
      • 也存在執行時間短,但是CPU占用率高的SQL,通過上面命令查詢不到,這個時候最好通過執行計劃分析explain進行分析

二、垂直和水平分庫分表區別

  • 垂直角度(表結構不一樣)
    • 垂直分表: 將一個表欄位拆分多個表,每個表存儲部分欄位
      • 好處: 避免IO時鎖表的次數,分離熱點欄位和非熱點欄位,避免大欄位IO導致性能下降
      • 原則:業務經常組合查詢的欄位一個表;不常用欄位一個表;text、blob類型欄位作為附屬表
    • 垂直分庫:根據業務將表分類,放到不同的資料庫伺服器上
      • 好處:避免表之間競爭同個物理機的資源,比如CPU/記憶體/硬碟/網路IO
      • 原則:根據業務相關性進行劃分,領域模型,微服務劃分一般就是垂直分庫
  • 水平角度(表結構一樣)
    • 水平分庫:把同個表的數據按照一定規則分到不同的資料庫中,資料庫在不同的伺服器上
      • 好處: 多個資料庫,降低了系統的IO和CPU壓力
      • 原則
        • 選擇合適的分片鍵和分片策略,和業務場景配合
        • 避免數據熱點和訪問不均衡、避免二次擴容難度大
    • 水平分表:同個資料庫內,把一個表的數據按照一定規則拆分到多個表中,對數據進行拆分,不影響表結構
      • 單個表的數據量少了,業務SQL執行效率高,降低了系統的IO和CPU壓力
      • 原則
        • 選擇合適的分片鍵和分片策略,和業務場景配合
        • 避免數據熱點和訪問不均衡、避免二次擴容難度大

2.1垂直分表

  • 也就是“大表拆小表”,基於列欄位進行的

  • 拆分原則一般是表中的欄位較多,將不常用的或者數據較大,長度較長的拆分到“擴展表 如text類型欄位

  • 訪問頻次低、欄位大的商品描述信息單獨存放在一張表中,訪問頻次較高的商品基本信息單獨放在一張表中

  • 垂直拆分原則

    • 把不常用的欄位單獨放在一張表;

    • 把text,blob等大欄位拆分出來放在附表中;

    • 業務經常組合查詢的列放在一張表中

2.2垂直分庫

  • 垂直分庫針對的是一個系統中的不同業務進行拆分, 資料庫的連接資源比較寶貴且單機處理能力也有限
  • 沒拆分之前全部都是落到單一的庫上的,單庫處理能力成為瓶頸,還有磁碟空間,記憶體,tps等限制
  • 拆分之後,避免不同庫競爭同一個物理機的CPU、記憶體、網路IO、磁碟,所以在高併發場景下,垂直分庫一定程度上能夠突破IO、連接數及單機硬體資源的瓶頸
  • 垂直分庫可以更好解決業務層面的耦合,業務清晰,且方便管理和維護
  • 一般從單體項目升級改造為微服務項目,就是垂直分庫

2.3水平分表

  • 把一個表的數據分到一個資料庫的多張表中,每個表只有這個表的部分數據

  • 核心是把一個大表,分割N個小表,每個表的結構是一樣的,數據不一樣,全部表的數據合起來就是全部數據

  • 針對數據量巨大的單張表(比如訂單表),按照某種規則(RANGE,HASH取模等),切分到多張表裡面去

  • 但是這些表還是在同一個庫中,所以單資料庫操作還是有IO瓶頸,主要是解決單表數據量過大的問題

  • 減少鎖表時間,沒分表前,如果是DDL(create/alter/add等)語句,當需要添加一列的時候mysql會鎖表,期間所有的讀寫操作只能等待

2.4水平分庫

  • 把同個表的數據按照一定規則分到不同的資料庫中,資料庫在不同的伺服器上
  • 水平分庫是把不同表拆到不同資料庫中,它是對數據行的拆分,不影響表結構
  • 每個庫的結構都一樣,但每個庫的數據都不一樣,沒有交集,所有庫的並集就是全量數據
  • 水平分庫的粒度,比水平分表更大

三、水平分庫分表常見策略

3.1 Range

  • 範圍角度思考問題 (範圍的話更多是水平分表)

    • 數字

      • 自增id範圍
    • 時間

      • 年、月、日範圍
      • 比如按照月份生成 庫或表 pay_log_2022_01、pay_log_2022_02
    • 空間

      • 地理位置:省份、區域(華東、華北、華南)

      • 比如按照 省份 生成 庫或表

例如:自增id,根據ID範圍進行分表(左閉右開)

  • 規則案例
    • 1~1,000,000 是 table_1
    • 1,000,000 ~2,000,000 是 table_2
    • 2,000,000~3,000,000 是 table_3
    • ...更多
  • 優點
    • id是自增長,可以無限增長
    • 擴容不用遷移數據,容易理解和維護
  • 缺點
    • 大部分讀和寫都訪會問新的數據,有IO瓶頸,整體資源利用率低
    • 數據傾斜嚴重,熱點數據過於集中,部分節點有瓶頸

基於Range範圍分庫分表業務場景

  • 微博發送記錄、微信消息記錄、日誌記錄,id增長/時間分區都行
    • 水平分表為主,水平分庫則容易造成資源的浪費
  • 網站簽到等活動流水數據時間分區最好
    • 水平分表為主,水平分庫則容易造成資源的浪費
  • 大區劃分(一二線城市和五六線城市活躍度不一樣,如果能避免熱點問題,即可選擇)
    • saas業務水平分庫(華東、華南、華北等)

3.2Hash取模

hash取模(Hash分庫分表是最普遍的方案)

  • 如果取模的欄位不是整數型要先hash,統一規則就行

  • 案例規則

    • 用戶ID是整數型的,要分2庫,每個庫表數量4表,一共8張表
    • 用戶ID取模後,值是0到7的要平均分配到每張表
A庫ID = userId % 庫數量 2 
表ID = userId / 庫數量 2 % 表數量4
  • 優點
    • 保證數據較均勻的分散落在不同的庫、表中,可以有效的避免熱點數據集中問題,
  • 缺點
    • 擴容不是很方便,需要數據遷移

四、實現方案ShardingSphere-JDBC

  • 地址:https://shardingsphere.apache.org/

  • Sharding-JDBC

    • 基於jdbc驅動,不用額外的proxy,支持任意實現 JDBC 規範的資料庫

    • 它使用客戶端直連資料庫,以 jar 包形式提供服務,無需額外部署和依賴

    • 可理解為加強版的 JDBC 驅動,相容 JDBC 和各類 ORM 框架

  • 它使用客戶端直連資料庫,以 jar 包形式提供服務

  • 無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全相容 JDBC 和各種 ORM 框架

  • 適用於任何基於 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis,或直接使用 JDBC

  • 支持任何第三方的資料庫連接池,如:DBCP, C3P0, BoneCP, HikariCP 等;

  • 支持任意實現 JDBC 規範的資料庫,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 訪問的資料庫

  • 採用無中心化架構,與應用程式共用資源,適用於 Java 開發的高性能的輕量級 OLTP 應用

4.1常見概念術語講解

  • 數據節點Node
    • 數據分片的最小單元,由數據源名稱和數據表組成
    • 比如:ds_0.product_order_0
  • 真實表
    • 在分片的資料庫中真實存在的物理表
    • 比如訂單表 product_order_0、product_order_1、product_order_2
  • 邏輯表
    • 水平拆分的資料庫(表)的相同邏輯和數據結構表的總稱
    • 比如訂單表 product_order_0、product_order_1、product_order_2,邏輯表就是product_order
  • 綁定表
    • 指分片規則一致的主表和子表
    • 比如product_order表和product_order_item表,均按照order_id分片,則此兩張表互為綁定表關係
    • 綁定表之間的多表關聯查詢不會出現笛卡爾積關聯,關聯查詢效率將大大提升
  • 廣播表
    • 指所有的分片數據源中都存在的表,表結構和表中的數據在每個資料庫中均完全一致
    • 適用於數據量不大且需要與海量數據的表進行關聯查詢的場景
    • 例如:字典表、配置表

4.2常見分片演算法講解

分片演算法包括兩部分:包含分片鍵和分片策略

  • 分片鍵 (PartitionKey)

    • 用於分片的資料庫欄位,是將資料庫(表)水平拆分的關鍵欄位
    • 比如prouduct_order訂單表,根據訂單號 out_trade_no做哈希取模,則out_trade_no是分片鍵
    • 除了對單分片欄位的支持,ShardingSphere也支持根據多個欄位進行分片
  • 分片策略

    • 行表達式分片策略 InlineShardingStrategy(必備

      • 只支持【單分片鍵】使用Groovy的表達式,提供對SQL語句中的 =和IN 的分片操作支持

      • 可以通過簡單的配置使用,無需自定義分片演算法,從而避免繁瑣的Java代碼開發

      • prouduct_order_$->{user_id % 8}` 表示訂單表根據user_id模8,而分成8張表,表名稱為`prouduct_order_0`到`prouduct_order_7
        
    • 標準分片策略StandardShardingStrategy(需瞭解)

      • 只支持【單分片鍵】,提供PreciseShardingAlgorithm和RangeShardingAlgorithm兩個分片演算法
      • PreciseShardingAlgorithm 精準分片 是必選的,用於處理=和IN的分片
      • RangeShardingAlgorithm 範圍分配 是可選的,用於處理BETWEEN AND分片
      • 如果不配置RangeShardingAlgorithm,如果SQL中用了BETWEEN AND語法,則將按照全庫路由處理,性能下降
    • 複合分片策略ComplexShardingStrategy(需瞭解)

      • 支持【多分片鍵】,多分片鍵之間的關係複雜,由開發者自己實現,提供最大的靈活度
      • 提供對SQL語句中的=, IN和BETWEEN AND的分片操作支持
    • Hint分片策略HintShardingStrategy(需瞭解)

      • 這種分片策略無需配置分片健,分片健值也不再從 SQL中解析,外部手動指定分片健或分片庫,讓 SQL在指定的分庫、分表中執行

      • 用於處理使用Hint行分片的場景,通過Hint而非SQL解析的方式分片的策略

      • Hint策略會繞過SQL解析的,對於這些比較複雜的需要分片的查詢,Hint分片策略性能可能會更好

    • 不分片策略 NoneShardingStrategy(需瞭解)

      • 不分片的策略。

4.3執行流程原理

執行過程為:SQL解析 -> SQL優化 -> SQL路由 -> SQL改寫 -> SQL執行 -> 結果歸併 ->返回結果


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Teleport 是一種能夠將我們的模板移動到 DOM 中 Vue app 之外的其他位置的技術,不受父級style、v-show等屬性影響,但data、prop數據依舊能夠共用的技術;類似於 React 的 Portal。主要解決的問題 因為Teleport節點掛載在其他指定的DOM節點下,完全不 ...
  • 解決某些情況下 ECharts 餅圖多行標簽重疊問題 對於多行標簽的重疊問題,其實一直沒有一個完美的解決方案。 我能在網上查到的比較全面的解決方法就是這個:https://zhuanlan.zhihu.com/p/272710806 但我的項目中某些東西是明確的:Label的行數、字體大小、數據個數 ...
  • 在前端開發過程中,我們也有可能遇到噪點插畫風格的設計稿,應用基礎的前端開發知識,能不能實現噪點風格的樣式呢,本文主要內容主要就是通過幾個示例來實現幾種噪點效果。本文包含的知識點包括:CSS 屬性 mask 遮罩、SVG 濾鏡 feTurbulence、CSS 屬性 filter 濾鏡、CSS 屬性 ... ...
  • 本文結合自身後臺開發經驗,從高可用、高性能、易維護和低風險(安全)角度出發,嘗試總結業界常見微服務介面設計原則,幫助大家設計出優秀的微服務。 ...
  • 本文由老王將建好的書房計劃請小王來幫忙,小王卻想謀權篡位,老王通過教育他引出裝飾器設計模式,第二部分針對老王提出的建設性意見實現裝飾器模式,第三部分針對裝飾器模式在Jdk中的IO、Spring中的緩存管理器、Mybatis的運用來加強我們的理解,第四部分說明裝飾器模式和代理模式的區別及他們各自的應用... ...
  • 冪等性在我們的工作中無處不在,無論是支付場景還是下訂單等核心場景都會涉及,也是分散式系統最常遇到的問題,除此之外,也是大廠面試的重災區。 知道了冪等性的重要性,下麵我就詳細介紹冪等性以及具體的解決方案,希望對大家有所幫助@mikechen 什麼是冪等性 冪等是一個數學與電腦學概念,在數學中某一元運 ...
  • 異常 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 運行下麵的代碼,看看有什麼問題->引出異常和異常處理機制 public static void main(String[] args) { int num1 =10; int n ...
  • 枚舉和註釋 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 自定義類實現枚舉 先看一個需求 要求創建季節(Season)對象,請設計並完成。 創建Season對象有如下特點 1.季節的值是有限的幾個值(spring, summer, ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...