ShardingSphere是开源的分布式数据库中间件解决方案组成的生态圈,由Sharding-jdbc、Sharding-Proxy等组成,提供标准化的数据分片、安全控制、分布式事务和数据库治理功能,本文主要介绍sharding-db在项目中的使用。

Sharding-db是对Sharding-jdbc的功能封装,方便功能的对接,统一项目团队对数据源的对接

项目地址:sharding-db

image
Sharding-jdbc分片过程

Sharding-jdbc根据SQL语句进行词语解析,上下文匹配数据库和表的分片策略生成路由路径,将分表配置中的逻辑库表改写为真实库表SQL语句,发送到底层数据源执行,将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户端。

POM配置

1
2
3
4
5
<dependency>
<groupId>cn.weiecho</groupId>
<artifactId>sharding-db</artifactId>
<version>1.0.3</version>
</dependency>

Database配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//单数据源模式
@Configuration
public class DatabaseConfig extends DatabaseSingletonConfigurator {

}

//主从数据源模式
@Configuration
public class DatabaseConfig extends DatabaseMasterSlaveConfigurator {

}

//分表数据源模式
@Configuration
public class DatabaseConfig extends DatabaseShardingConfigurator {

}

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
sharding.jdbc:
default-data-source-name: ms_ds_0
data-sources:
ds_master:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://127.0.0.1:3306/test_db?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username: root
password: root
initial-size: 1
minimum-idle: 3
maximum-pool-size: 20
idle-timeout: 60000
max-lifetime: 180000
connection-test-query: select 1
test-while-idle: true
test-on-borrow: true
connection-init-sql: set names utf8mb4
ds_slave:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://127.0.0.1:3307/test_db?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username: root
password: root
initial-size: 1
minimum-idle: 3
maximum-pool-size: 20
idle-timeout: 60000
max-lifetime: 180000
connection-test-query: select 1
test-while-idle: true
test-on-borrow: true
connection-init-sql: set names utf8mb4
master-slave-rules:
- name: ms_ds_0
master-data-source-name: ds_master
slave-data-source-names: ds_slave
load-balance-strategy: round_robin

分表策略配置

重写DatabaseShardingConfigurator 的分表策略实现相关功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 配置分表策略TableRule
*/
public Collection<TableRuleConfiguration> tableRuleConfigs() {
return Collections.emptyList();
}

/**
* 配置绑定表分组BindingTable
* 关联多表查询的时候避免笛卡尔积的组合出现
*/
public Collection<String> bindingTableGroups() {
return Collections.emptyList();
}

数据安全配置(脱敏)

敏感数据脱敏,重写DatabaseShardingConfigurator的加密规则实现相关功能

1
2
3
4
5
6
7

/**
* 数据脱敏策略EncryptRule
*/
public EncryptRuleConfiguration encryptRuleConfig() {
return null;
}

广播表策略

用于数据源分片下,每个数据源都保存相同表全量数据,如字典表,配置表等

1
2
3
4
5
6
7
8

/**
* 配置广播表列表BroadcastTables
*
*/
public Collection<String> broadcastTables() {
return Collections.emptyList();
}

强制路由至主库

1
2
HintManager hintManager = HintManager.getInstance();
hintManager.setMasterRouteOnly();

推荐使用try with resource方式

1
2
3
4
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.setMasterRouteOnly();

}

强制路由至指定读库

1
2
HintManager hintManager = HintManager.getInstance();
hintManager.setDatabaseShardingValue(1);

推荐使用try with resource方式

1
2
3
4
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.setDatabaseShardingValue(1);

}