ShardingJdbc實戰-分庫分表

文章目錄

  • 基本配置
  • 分庫分表的分片策略
    • 一、inline 行表達時分片策略
      • algorithm-expression行表達式
      • 完整案例和配置如下
    • 二、根據實時間日期 - 按照標準規則分庫分表
      • 標準分片 - Standard
      • 完整案例和配置如下


基本配置

邏輯表

邏輯表是指:水平拆分的數據庫或者數據表的相同路基和數據結構表的總稱。比如用戶數據根據用戶id%2拆分為2個表,分別是:ksd_user0和ksd_user1。他們的邏輯表名是:ksd_user。
在shardingjdbc中的定義方式如下:

spring:shardingsphere:sharding:tables:# ksd_user 邏輯表名ksd_user:

分庫分表數據節點 - actual-data-nodes

 tables:# ksd_user 邏輯表名ksd_user:# 數據節點:多數據源$->{0..N}.邏輯表名$->{0..N} 相同表actual-data-nodes: ds$->{0..2}.ksd_user$->{0..2}# 也可以這么寫,不同數據源不同表actual-data-nodes: ds0.ksd_user$->{0..2},ds1.ksd_user$->{2..4}# 指定單數據源的配置方式-同一個數據源,不同表actual-data-nodes: ds0.ksd_user$->{0..4}# 全部手動指定actual-data-nodes: ds0.ksd_user0,ds1.ksd_user0,ds0.ksd_user1,ds1.ksd_user1,

尋找規則如下
在這里插入圖片描述

分庫分表的分片策略

在這里插入圖片描述
分片策略由分片鍵和分片算法組成

一、inline 行表達時分片策略

對應InlineShardingStragey。使用Groovy的表達時,提供對SQL語句種的=和in的分片操作支持,只支持單分片鍵。對于簡單的分片算法,可以通過簡單的配置使用,從而避免繁瑣的Java代碼開放,如:ksd_user${分片鍵(數據表字段)userid % 5} 表示ksd_user表根據某字段(userid)模 5.從而分為5張表,表名稱為:ksd_user0到ksd_user4 。數據庫也是如此。

    # 配置默認數據源ds1sharding:# 默認數據源,主要用于寫,注意一定要配置讀寫分離 ,注意:如果不配置,那么就會把三個節點都當做從slave節點,新增,修改和刪除會出錯。default-data-source-name: ds0# 配置分表的規則tables:# ksd_user 邏輯表名ksd_user:key-generator:# 主鍵的列明,雪花算法,也可以是UUIDcolumn: idtype: SNOWFLAKE# 數據節點:數據源$->{0..N}.邏輯表名$->{0..N}actual-data-nodes: ds$->{0..2}.ksd_user$->{0..2}# 拆分庫策略,也就是什么樣子的數據放入放到哪個數據庫中。database-strategy:inline:sharding-column: sex    # 分片字段(分片鍵)algorithm-expression: ds$->{sex % 3} # 分片算法表達式# 拆分表策略,也就是什么樣子的數據放入放到哪個數據表中。table-strategy:inline:sharding-column: age    # 分片字段(分片鍵)algorithm-expression: ksd_user$->{age % 3} # 分片算法表達式

grove表達式說明:

  • ${begin…end} 表示區間范圍
  • ${[unit1,unit2,….,unitn]} 表示枚舉值
  • 行表達式種如果出現連續多個 e x p r e s s s i o n 或 {expresssion}或 expresssion->{expression}表達式,整個表達時最終的結果將會根據每個子表達式的結果進行笛卡爾組合

algorithm-expression行表達式

在這里插入圖片描述

完整案例和配置如下

  • 準備三臺服務器(測試用也可以用docker 安裝三個服務),三個數據庫ksd_sharding-db,名字相同,兩個數據源ds0,ds1,ds2
  • 每個數據庫下方新建ksd_user0、ksd_user1、ksd_user1即可
  • 數據庫規則,result = (sex%3),result=0的放入ds2庫,result=1的放入ds1庫,result=2的放入ds2庫
  • 數據表規則:result = (age%3),根據取模結果分別放入ksd_user0、ksd_user1、ksd_user1表
  • 如果數據庫配置了主從復制,需要將主從復制取消掉
mysql> stop slave;
server:port: 8085
spring:main:allow-bean-definition-overriding: trueshardingsphere:# 參數配置,顯示sqlprops:sql:show: true# 配置數據源datasource:# 給每個數據源取別名,下面的ds1,ds2,ds3任意取名字names: ds0,ds1,ds2# 給master-ds1每個數據源配置數據庫連接信息ds0:# 配置druid數據源type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://master:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 100minPoolSize: 5# 配置ds2-slaveds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://slave1:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 10minPoolSize: 5# 配置ds3-slaveds2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://slave2:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 10minPoolSize: 5# 配置默認數據源ds1sharding:# 默認數據源,主要用于寫,注意一定要配置讀寫分離 ,注意:如果不配置,那么就會把三個節點都當做從slave節點,新增,修改和刪除會出錯。default-data-source-name: ds0# 配置分表的規則tables:# ksd_user 邏輯表名ksd_user:key-generator:# 主鍵的列明,雪花算法,也可以是UUIDcolumn: idtype: SNOWFLAKE# 數據節點:數據源$->{0..N}.邏輯表名$->{0..N}actual-data-nodes: ds$->{0..2}.ksd_user$->{0..2}# 拆分庫策略,也就是什么樣子的數據放入放到哪個數據庫中。database-strategy:inline:sharding-column: sex    # 分片字段(分片鍵)algorithm-expression: ds$->{sex % 3} # 分片算法表達式# 拆分表策略,也就是什么樣子的數據放入放到哪個數據表中。table-strategy:inline:sharding-column: age    # 分片字段(分片鍵)algorithm-expression: ksd_user$->{age % 3} # 分片算法表達式
# 整合mybatis的配置XXXXX
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.shardingjdbc.sharding.entity
@GetMapping("/save")public String insert() {User user = new User();user.setNickname("test" + new Random().nextInt());user.setBirthday(new Date());// 3%3=0,所以這條數據應該在ds0這臺服務上user.setSex(3);// 25%3=1  所以這個條數據應該在ksd_user1這個表里面user.setAge(25);user.setPassword("123456");userMapper.addUser(user);return "success";}

在這里插入圖片描述

二、根據實時間日期 - 按照標準規則分庫分表

標準分片 - Standard

  • 對應StrandardShardingStrategy.提供對SQL語句中的=,in和惡between and 的分片操作支持
  • StrandardShardingStrategy只支持分片鍵。提供PreciseShardingAlgorithm和RangeShardingAlgorithm兩個分片算法
  • PreciseShardingAlgorithm是必選的,用于處理=和IN的分片
  • RangeShardingAlgorithm是可選的,是用于處理Betwwen and分片,如果不配置和RangeShardingAlgorithm,SQL的Between AND 將按照全庫路由處理

完整案例和配置如下

yml配置

server:port: 8085
spring:main:allow-bean-definition-overriding: trueshardingsphere:# 參數配置,顯示sqlprops:sql:show: true# 配置數據源datasource:# 給每個數據源取別名,下面的ds1,ds2,ds3任意取名字names: ds0,ds1,ds2# 給master-ds1每個數據源配置數據庫連接信息ds0:# 配置druid數據源type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://master:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 100minPoolSize: 5# 配置ds2-slaveds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://slave1:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 10minPoolSize: 5# 配置ds3-slaveds2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://slave2:port/ksd-sharding-db?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMTusername: rootpassword: 123456maxPoolSize: 10minPoolSize: 5# 配置默認數據源ds1sharding:# 默認數據源,主要用于寫,注意一定要配置讀寫分離 ,注意:如果不配置,那么就會把三個節點都當做從slave節點,新增,修改和刪除會出錯。default-data-source-name: ds0# 配置分表的規則tables:# ksd_user 邏輯表名ksd_user:key-generator:# 主鍵的列明,雪花算法,也可以是UUIDcolumn: idtype: SNOWFLAKE# 數據節點:數據源$->{0..N}.邏輯表名$->{0..N}actual-data-nodes: ds$->{0..2}.ksd_user$->{0..2}# 拆分庫策略,也就是什么樣子的數據放入放到哪個數據庫中。database-strategy:standard:sharding-column: birthday    # 分片字段(分片鍵)preciseAlgorithmClassName: com.example.shardingjdbc.sharding.algorithm.BirthdayAlgorithm# 拆分表策略,也就是什么樣子的數據放入放到哪個數據表中。table-strategy:inline:sharding-column: age    # 分片字段(分片鍵)algorithm-expression: ksd_user$->{age % 3} # 分片算法表達式
# 整合mybatis的配置XXXXX
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.shardingjdbc.sharding.entity

自定義日期規則


/*** @description: BirthdayAlgorithm*/
public class BirthdayAlgorithm implements PreciseShardingAlgorithm<Date> {List<Date> dateList = new ArrayList<>();{Calendar calendar1 = Calendar.getInstance();calendar1.set(2020, 1, 1, 0, 0, 0);Calendar calendar2 = Calendar.getInstance();calendar2.set(2021, 1, 1, 0, 0, 0);Calendar calendar3 = Calendar.getInstance();calendar3.set(2022, 1, 1, 0, 0, 0);dateList.add(calendar1.getTime());dateList.add(calendar2.getTime());dateList.add(calendar3.getTime());}@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {// 獲取屬性 數據庫中的值Date date = preciseShardingValue.getValue();// 獲取數據源名稱列表Iterator<String> iterator = collection.iterator();String target = null;for (Date item: dateList) {target = iterator.next();if (date.before(item)) {break;}}return target;}
}

測試結果

  • http://localhost:8085/user/save?sex=3&age=3&birthday=2020-03-09 —- ds1
    在這里插入圖片描述
  • http://localhost:8085/user/save?sex=3&age=3&birthday=2021-03-09 —- ds2

在這里插入圖片描述


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

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

相關文章

SpringBoot實戰(1)

SpringBoot總結 一,Spring 設計思想 OOP: 面向對象編程-》封裝、繼承、多態 BOP: 面向Bean編程-》一切從Bean開始 AOP: 面向切面編程-》解藕、專 人做專事 IOC: 控制反轉,將new 對象的操作交給Spring統一管理-》轉交控制權 DI/DL: 依賴注入/依賴查找-》自動賦值 DI和AOP…

LLVM 一些重要文檔 LLVM 3.0

基于LLVM 3.0: Documentation for the LLVM System at SVN head LLVM 作為庫的使用方法&#xff1a; Using The LLVM Libraries LLVM C 的編程規范&#xff1a; LLVM Coding Standards

stl 迭代器(Iterator)

定義 迭代器&#xff08;Iterator&#xff09;是STL&#xff08;Standard Template Library&#xff0c;標準模板庫&#xff09;中的一個核心概念&#xff0c;用于提供一種通用的方式來遍歷容器&#xff08;如vector、list、map等&#xff09;中的元素&#xff0c;而無需暴露容…

大小端問題

0. 介紹 大小端計算機存儲數據而安排字節的兩種順序。 針對的是字節。 大端與我們平時書寫的順序一致。 1. 大小端的判定 不需要手動判斷。 有一個頭文件endian.h; 可能會有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通過庫來進行判斷。 手動判斷 根據字節存取的順序…

【JSON2WEB】07 Amis可視化設計器CRUD增刪改查

總算到重點中的核心內容&#xff0c;CRUD也就是增刪改查&#xff0c;一個設計科學合理的管理信息系統&#xff0c;95%的就是CRUD&#xff0c;達不到這個比例要重新考慮一下你的數據庫設計了。 1 新增頁面 Step 1 啟動amis-editor Setp 2 新增頁面 名稱和路徑隨便命名&#xf…

Dynamo幕墻探究系列(一)

一直想寫個系列教程&#xff0c;但是沒有那么多時間整理資料&#xff0c;這次呢&#xff0c;先弄個小系列吧&#xff0c;還是和之前差不多的幕墻測試&#xff0c;我們分幾節課&#xff0c;一步一步深入研究。 今天先開個小頭兒&#xff0c;要弄的&#xff0c;就是下面這么個模型…

對象鎖與類鎖

不同鎖互不影響&#xff0c;共用一個鎖&#xff0c;可能會發生阻塞。 1.在修飾靜態方法時&#xff0c;鎖定的是當前類的 Class 對象&#xff0c;在下面的例子中就是SycTest1.class 2.當修飾非靜態方法時&#xff0c;鎖定的就是 this 對象&#xff0c;即當前的實例化對象 public…

【Git教程】(四)版本庫 —— 存儲系統,存儲目錄,提交對象及其命名、移動與復制~

Git教程 版本庫 1?? 一種簡單而高效的存儲系統2?? 存儲目錄&#xff1a;Blob 與 Tree3?? 相同數據只存儲一次4?? 壓縮相似內容5?? 不同文件的散列值相同6?? 提交對象7?? 提交歷史中的對象重用8?? 重命名、移動與復制&#x1f33e; 總結 事實上&#xff0c;我們…

keil MDK安裝armcc V5編譯器

不知道從什么時候開始&#xff0c;Keil MDK默認不支持V5的編譯器了&#xff0c;里面默認只有V6的編譯器&#xff0c;設置界面跟V5有很大的差異不太熟悉。最可怕的是&#xff0c;之前使用V5編譯的工程&#xff0c;換成V6編譯器后居然報錯...雖然修改一下應該也可以正常編譯&…

神經網絡基礎知識:LeNet的搭建-訓練-預測

1.參考視頻&#xff1a; 2.1 pytorch官方demo(Lenet)_嗶哩嗶哩_bilibili 2.總結&#xff1a; &#xff08;1&#xff09;LeNet網絡就是 我最開始用來預測mnist數據集的那個網絡&#xff0c;簡單的2個conv2個maxpool3個linear層 &#xff08;2&#xff09;up主整理的train.py…

SQL面試題(2)

第一題 創建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

web自動化筆記九:驗證碼的處理方式

一、驗證碼常用的處理方式 ①、說明&#xff1a;Selenium中并沒有對驗證碼處理的方法&#xff0c;在這里我們介紹一下針對驗證碼的幾種常用處理方式 ②、方式&#xff1a; 1&#xff09;、去掉驗證碼&#xff08;測試環境下采用&#xff09; …

RDD算子介紹

1. RDD算子 RDD算子也叫RDD方法&#xff0c;主要分為兩大類&#xff1a;轉換和行動。轉換&#xff0c;即一個RDD轉換為另一個RDD&#xff0c;是功能的轉換與補充&#xff0c;比如map&#xff0c;flatMap。行動&#xff0c;則是觸發任務的執行&#xff0c;比如collect。所謂算子…

LeetCode 1551.是數組中所有元素相等的最小操作數

存在一個長度為 n 的數組 arr &#xff0c;其中 arr[i] (2 * i) 1 &#xff08; 0 < i < n &#xff09;。 一次操作中&#xff0c;你可以選出兩個下標&#xff0c;記作 x 和 y &#xff08; 0 < x, y < n &#xff09;并使 arr[x] 減去 1 、arr[y] 加上 1 &…

Mac專用投屏工具AirServer 7.27 for Mac中文版2024最新圖文教程

Mac專用投屏工具AirServer 7.27 for Mac中文版是一款適用于Mac的投屏工具&#xff0c;可以將Mac屏幕快速投影到其他設備上&#xff0c;如電視、投影儀、平板等。 Mac專用投屏工具AirServer 7.27 for Mac中文版具有優秀的兼容性&#xff0c;可以與各種設備配合使用。無論是iPhon…

基于springboot+vue的在線考試系統(源碼+論文)

文章目錄 目錄 文章目錄 前言 一、功能設計 二、功能頁面 三、論文 前言 現在我國關于在線考試系統的發展以及專注于對無紙化考試的完善程度普遍不高&#xff0c;關于對考試的模式還大部分還停留在紙介質使用的基礎上&#xff0c;這種教學模式已不能解決現在的時代所產生的考試…

【MySQL】數據庫的操作

【MySQL】數據庫的操作 目錄 【MySQL】數據庫的操作創建數據庫數據庫的編碼集和校驗集查看系統默認字符集以及校驗規則查看數據庫支持的字符集查看數據庫支持的字符集校驗規則校驗規則對數據庫的影響數據庫的刪除 數據庫的備份和恢復備份還原不備份整個數據庫&#xff0c;而是備…

YOLOv9改進|增加SPD-Conv無卷積步長或池化:用于低分辨率圖像和小物體的新 CNN 模塊

專欄介紹&#xff1a;YOLOv9改進系列 | 包含深度學習最新創新&#xff0c;主力高效漲點&#xff01;&#xff01;&#xff01; 一、文章摘要 卷積神經網絡(CNNs)在計算即使覺任務中如圖像分類和目標檢測等取得了顯著的成功。然而&#xff0c;當圖像分辨率較低或物體較小時&…

【LeetCode刷題】146. LRU 緩存

請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&#xff0c;否則返回 -…

全量知識系統問題及SmartChat給出的答復 之9 三套工具之4語法解析器 之2

Q23. 一個語言的語法簡約規則 這些規則顯示show 在一個給定單詞&#xff08;a given word&#xff09;的右邊或左邊可能出現的單詞的類別。句型的多樣性variety不是復雜文法&#xff08;a complex grammar&#xff09;的結果&#xff0c;而是簡單語法&#xff08;a simple gra…