文章目錄
目錄- 一、ShardingSphere簡介
- 二、Sharding-JDBC
- 2.1 Sharding-JDBC實作水平分表
- 2.2 Sharding-JDBC實作水平分庫
- 2.3 Sharding-JDBC操作公共表
- 2.4 Sharding-JDBC實作讀寫分離
- 三、Sharding-Proxy
學習之前先了解下分庫分表概念:https://spiritmark.blog.csdn.net/article/details/109524713
一、ShardingSphere簡介
在資料庫設計時候考慮垂直分庫和垂直分表,隨著資料庫資料量增加,不要馬上考慮做水平切分,首先考慮快取處理,讀寫分離,使 用索引等等方式,如果這些方式不能根本解決問題了,再考慮做水平分庫和水平分表,
分庫分表導致的問題:
- 跨節點連接查詢問題(分頁、排序)
- 多資料源管理問題
Apache ShardingSphere是一套開源的分布式資料庫中間件解決方案組成的生態圈,它由 JDBC、 Proxy和 Sidecar(規劃中)這 3 款相互獨立,卻又能夠混合部署配合使用的產品組成, 它們均提供標準化的資料分片、分布式事務和資料庫治理功能,可適用于如 Java同構、異構語言、云原生等各種多樣化的應用場景,
Apache ShardingSphere定位為關系型資料庫中間件,旨在充分合理地在分布式的場 景下利用關系型資料庫的計算和存盤能力,而并非實作一個全新的關系型資料庫, 它通過關注不變,進而抓住事物本質,關系型資料庫當今依然占有巨大市場,是各個公司核心業務的基石,未來也難于撼動,我們目前階段更加關注在原有基礎上的增量,而非顛覆,
二、Sharding-JDBC
Sharding-JDBC 是輕量級的 java 框架,是增強版的 JDBC 驅動,簡化對分庫分表之后資料相關操作,

新建專案并添加依賴:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-parentartifactId>
<version>2.2.1.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.20version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>sharding-jdbc-spring-boot-starterartifactId>
<version>4.0.0-RC1version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.0.5version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
2.1 Sharding-JDBC實作水平分表
① 按照水平分表的方式,創建資料庫和資料庫表
水平分表規則:如果添加 cid是偶數把資料添加 course_1,如果是奇數添加到 course_2

CREATE TABLE `course_1` (
`cid` bigint(16) NOT NULL,
`cname` varchar(255) ,
`userId` bigint(16),
`cstatus` varchar(16) ,
PRIMARY KEY (`cid`)
)
② 撰寫物體和 Mapper 類
@Data
public class Course {
private Long cid;
private String cname;
private Long userId;
private String cstatus;
}
@Repository
public interface CourseMapper extends BaseMapper<Course> {
}
③ 詳細組態檔
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db?serverTimezone=GMT%2B8
username: root
password: 1234
sharding:
tables:
course:
actual-data-nodes: m1.course_$->{1..2}
key-generator:
column: cid
type: SNOWFLAKE
table-strategy:
inline:
shardingcolumn: cid
algorithm-expression: course_$->{cid%2+1}
props:
sql:
show: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
④ 測驗
@RunWith(SpringRunner.class)
@SpringBootTest
public class ShardingSphereTestApplication {
@Autowired
CourseMapper courseMapper;
@Test
public void addCourse() {
for (int i = 1; i 10; i++) {
Course course = new Course();
course.setCname("java" + i);
course.setUserId(100L);
course.setCstatus("Normal" + i);
courseMapper.insert(course);
}
}
@Test
public void queryCourse() {
QueryWrapper<Course> wrapper = new QueryWrapper<>();
wrapper.eq("cid",493001315358605313L);
Course course = courseMapper.selectOne(wrapper);
System.out.println(course);
}
}


2.2 Sharding-JDBC實作水平分庫
① 需求分析

② 創建資料庫和表
③ 詳細組態檔
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1,m2
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db_2?serverTimezone=GMT%2B8
username: root
password: 1234
m2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db_3?serverTimezone=GMT%2B8
username: root
password: 1234
sharding:
tables:
course:
actual-data-nodes: m$->{1..2}.course_$->{1..2}
key-generator:
column: cid
type: SNOWFLAKE
database-strategy:
inline:
sharding-column: userId
algorithm-expression: m$->{userId%2+1}
table-strategy:
inline:
sharding-column: cid
algorithm-expression: course_$->{cid%2+1}
props:
sql:
show: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
④ 測驗代碼
@RunWith(SpringRunner.class)
@SpringBootTest
public class ShardingSphereTestApplication {
@Autowired
CourseMapper courseMapper;
@Test
public void addCourse() {
for (int i = 1; i 20; i++) {
Course course = new Course();
course.setCname("java" + i);
int random = (int) (Math.random() * 10);
course.setUserId(100L + random);
course.setCstatus("Normal" + i);
courseMapper.insert(course);
}
}
@Test
public void queryCourse() {
QueryWrapper<Course> wrapper = new QueryWrapper<>();
wrapper.eq("cid", 493001315358605313L);
Course course = courseMapper.selectOne(wrapper);
System.out.println(course);
}
}
查詢實際對應的 SQL:

2.3 Sharding-JDBC操作公共表
公共表 :
- 存盤固定資料的表,表資料很少發生變化,查詢時候經常進行關聯
- 在每個資料庫中創建出相同結構公共表
① 思路分析

② 在對應資料庫創建公共表 t_udict,并创建对应实体和 Mapper``
CREATE TABLE `t_udict` (
`dict_id` bigint(16) NOT NULL,
`ustatus` varchar(16) ,
`uvalue` varchar(255),
PRIMARY KEY (`dict_id`)
)
③ 詳細組態檔
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1,m2
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db_2?serverTimezone=GMT%2B8
username: root
password: 1234
m2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db_3?serverTimezone=GMT%2B8
username: root
password: 1234
sharding:
tables:
course:
actual-data-nodes: m$->{1..2}.course_$->{1..2}
key-generator:
column: cid
type: SNOWFLAKE
database-strategy:
inline:
sharding-column: userId
algorithm-expression: m$->{userId%2+1}
table-strategy:
inline:
sharding-column: cid
algorithm-expression: course_$->{cid%2+1}
t_udict:
key-generator:
column: dict_id
type: SNOWFLAKE
broadcast-tables: t_udict
props:
sql:
show: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
④ 進行測驗
經測驗:資料插入時會在每個庫的每張表中插入,洗掉時也會洗掉所有資料,
@RunWith(SpringRunner.class)
@SpringBootTest
public class ShardingSphereTestApplication {
@Autowired
UdictMapper udictMapper;
@Test
public void addUdict() {
Udict udict = new Udict();
udict.setUstatus("a");
udict.setUvalue("已啟用");
udictMapper.insert(udict);
}
@Test
public void deleteUdict() {
QueryWrapper<Udict> wrapper = new QueryWrapper<>();
wrapper.eq("dict_id", 493080009351626753L);
udictMapper.delete(wrapper);
}
}
2.4 Sharding-JDBC實作讀寫分離
為了確保資料庫產品的穩定性,很多資料庫擁有雙機熱備功能,也就是,第一臺資料庫服務器是對外提供增刪改業務的生產服務器;第二臺資料庫服務器主要進行讀的操作,
Sharding-JDBC通過 sql陳述句語意分析,實作讀寫分離程序,不會做資料同步,資料同步通常資料庫集群間會自動同步,
詳細組態檔:
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m0,s0
m0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3306/course_db?serverTimezone=GMT%2B8
username: root
password: 1234
s0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.182.200:3307/course_db?serverTimezone=GMT%2B8
username: root
password: 1234
masterslave:
master-data-source-name: m0
slave-data-source-names: s0
props:
sql:
show: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
經過測驗:增刪改操作都是會通過 master資料庫,同時 master資料庫會同步資料給 slave資料庫;查操作都是通過 slave資料庫.
三、Sharding-Proxy
Sharding-Proxy定位為 透明化的資料庫代理端,提供封裝了資料庫二進制協議的服務端版本,用于完成對異構語言的支持, 目前僅 MySQL和 PostgreSQL版本,
Sharding-Proxy是獨立應用,需要安裝服務,進行分庫分表或者讀寫分離配置,啟動使用,

Sharding-proxy的使用參考:Sharding-Proxy的基本使用,
微信搜一搜 : 全堆疊小劉 ,獲取文章 pdf 版本
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/204538.html
標籤:架構設計
上一篇:MySQL高級部分理論知識細講
