ShardingSphere學習
- 2021 年 10 月 24 日
- 筆記
- ShardingSphere, 組件學習
1 基本概念
1.1 ShardingSphere概述
官網://shardingsphere.apache.org/index_zh.html
1.2 分庫分表概述
分庫分表是為了解決由於數據量過大而導致資料庫性能降低的問題,將原來獨立的資料庫拆分成若干資料庫組成 ,將數據大表拆分成若干數據表組成,使得單一資料庫、單一數據表的數據量變小,從而達到提升資料庫性能的目的。
● 水平分表
將一個表的數據按一定規則拆分到多個表結構相同的表中。
● 垂直分表
將一個表按照欄位拆分成多個表,每個表存儲其中一部分欄位。
● 水平分庫
同一個表的數據按一定規則拆到不同的資料庫中,每個庫可以放在不同的伺服器上。
● 垂直分庫
按照業務將表分布到不同的資料庫上,達到專庫專用。
2 簡單使用
第一步:創建資料庫,執行腳本;
第二步:創建springboot工程,引入依賴;
<!-- sharding-jdbc依賴 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
第三步:編寫測試相關程式碼;
第四步:編寫配置文件,測試。
2.1 水平分表
策略:cid為偶數數據添加到course_db的course_0表,cid為奇數數據添加到course_db的course_1表。
配置:
# sharding-jdbc 水平分表
# 一個實體類對應兩張表,覆蓋
spring.main.allow-bean-definition-overriding=true
# 配置數據源,給數據源起名
spring.shardingsphere.datasource.names=ds
# 配置數據
spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds.username=root
spring.shardingsphere.datasource.ds.password=1234
# 指定course表分布情況,配置表在哪個資料庫裡面,表名稱都是什麼 ds.course_0 ds.course_1
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds.course_$->{0..1}
# 指定表分片策略
# cid為偶數數據添加到ds(course_db)的course_0表,cid為奇數數據添加到ds(course_db)的course_1表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2}
# 指定course表裡面主鍵cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 打開sql輸出日誌
spring.shardingsphere.props.sql.show=true
2.2 垂直分表
可直接手動拆分表實現。
2.3 水平分庫
策略:sid是偶數數據添加到course_db_0的course表,sid是奇數數據添加到course_db_1的course表。
配置:
# sharding-jdbc 水平分庫
# 一個實體類對應兩張表,覆蓋
spring.main.allow-bean-definition-overriding=true
# 配置數據源,給數據源起名
spring.shardingsphere.datasource.names=ds0,ds1
# 配置第一個數據源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/course_db_0?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=1234
# 配置第二個數據源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/course_db_1?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=1234
# 指定course表分布情況,配置表在哪個資料庫裡面,表名稱都是什麼 ds0.course d1.course
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds$->{0..1}.course
# 指定資料庫分片策略
# sid是偶數數據添加到ds0(course_db_0)的course表,sid是奇數數據添加到ds1(course_db_1)的course表
spring.shardingsphere.sharding.tables.course.database-strategy.inline..sharding-column=cid
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=ds$->{cid % 2}
#spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=cid
#spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{cid % 2}
# 指定course表裡面主鍵cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 打開sql輸出日誌
spring.shardingsphere.props.sql.show=true
2.4 垂直分庫
策略:操作course表調用course_db,操作student表調用student_db。
配置:
# sharding-jdbc 垂直分庫
# 一個實體類對應兩張表,覆蓋
spring.main.allow-bean-definition-overriding=true
# 配置數據源,給數據源起名
spring.shardingsphere.datasource.names=m0,m1
# 配置第一個數據源
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=1234
# 配置第二個數據源
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/student_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=1234
# 操作course表調用m0(course_db),操作student表調用m1(student_db)
# 配置student表分布情況
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m0.course
# 指定student表裡面主鍵sid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 配置student表分布情況
spring.shardingsphere.sharding.tables.student.actual-data-nodes=m1.student
# 指定student表裡面主鍵sid生成策略
spring.shardingsphere.sharding.tables.student.key-generator.column=sid
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE
# 打開sql輸出日誌
spring.shardingsphere.props.sql.show=true
2.5 廣播表
策略:添加、刪除dictionary表數據時,同時操作course_db中dictionary表與student_db中dictionary表。
配置:
# sharding-jdbc 操作廣播表
# 一個實體類對應兩張表,覆蓋
spring.main.allow-bean-definition-overriding=true
# 配置數據源,給數據源起名
spring.shardingsphere.datasource.names=m0,m1
# 配置第一個數據源
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=1234
# 配置第二個數據源
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/student_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=1234
# 配置course表分布情況
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m0.course
# 指定course表裡面主鍵cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 配置student表分布情況
spring.shardingsphere.sharding.tables.student.actual-data-nodes=m1.student
# 指定student表裡面主鍵sid生成策略
spring.shardingsphere.sharding.tables.student.key-generator.column=sid
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE
# 配置廣播表
# 添加、刪除dictionary表數據時,同時操作m0(course_db)中dictionary表與m1(student_db)中dictionary表
spring.shardingsphere.sharding.broadcast-tables=dictionary
spring.shardingsphere.sharding.tables.dictionary.key-generator.column=id
spring.shardingsphere.sharding.tables.dictionary.key-generator.type=SNOWFLAKE
# 打開sql輸出日誌
spring.shardingsphere.props.sql.show=true
2.6 讀寫分離
主從複製通過MySQL自身配置實現,Sharding-JDBC通過對SQL語義的分析,將寫操作與讀操作分別路由至主庫與從庫實現讀寫分離。
策略:寫操作course_db(127.0.0.1)從庫中course表,讀操作course_db(192.168.1.107)主庫中course表。
配置:
# sharding-jdbc 讀寫分離
# 一個實體類對應兩張表,覆蓋
spring.main.allow-bean-definition-overriding=true
# 配置數據源,給數據源起名
spring.shardingsphere.datasource.names=s0,s1
# 配置主庫數據源
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s0.username=root
spring.shardingsphere.datasource.s0.password=1234
# 配置從庫數據源
spring.shardingsphere.datasource.s1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s1.url=jdbc:mysql://192.168.1.107:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s1.username=root
spring.shardingsphere.datasource.s1.password=root
# 主庫從庫邏輯數據源定義
# 寫操作s0(course_db)主庫中course表,讀操作s1(course_db)從庫中course表
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=s0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s1
# 配置course表分布情況
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds0.course
# 指定course表裡面主鍵cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 打開sql輸出日誌
spring.shardingsphere.props.sql.show=true