ShardingSphere學習

1 基本概念

1.1 ShardingSphere概述

官網://shardingsphere.apache.org/index_zh.html

image

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