Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。
Apache ShardingSphere 设计哲学为 Database Plus,旨在构建异构数据库上层的标准和生态。 它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。 它站在数据库的上层视角,关注它们之间的协作多于数据库自身。
ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。
环境准备
版本
软件 | 版本 |
---|---|
spring boot | 3.4.5 |
shardingsphere-jdbc | 5.5.2 |
druid | 1.2.24 |
postgreSQL | 17 |
JDK | 21 |
功能
已实现配置功能:
- 单机模式服务;
- 数据源(druid加解密数据库密码);
- 规则配置:
数据分片:多个分库分表键策略
读写分离
数据加密:SM4自定义算法
单表
算法:自定义雪花算法动态worker.id
其他
待新增补充功能:
混合规则等。
数据库说明
本示例数据库为PostgreSQL,以一主二从作为集群架构演示,转为数据库架构时,可自定义修改配置。
集群
一主二从:
逻辑主库:ds_basic、ds0000、ds0001(ds_basic为数据简单、量少的元数据库)
逻辑从库:ds0000_slave1、ds0001_slave1、ds0000_slave2、ds0001_slave2
Maven依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
<version>5.5.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-test-util</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
配置
配置文件
spring boot配置
application.yml
spring:
application:
name: demo
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding.yaml
shardingsphere-jdbc配置
完整的基础配置
sharding.yaml
mode:
type: Standalone
repository:
type: JDBC
databaseName: aya_db
dataSources:
ds_aya_basic:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_basic
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0000:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0000
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0001:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0001
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0000_slave1:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0000_slave1
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0001_slave1:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0001_slave1
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0000_slave2:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0000_slave2
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 600000
timeBetweenEvictionRunsMillis: 300000
testOnBorrow: true
testWhileIdle: true
filters: config, stat, wall
connectProperties:
connectTimeout: 5000
socketTimeout: '20000'
config.decrypt: 'true'
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==
ds_aya_0001_slave2:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5433/aya_0001_slave2
username: postgres
password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
initialSize: 1
minIdle: 1
maxActive: 64
maxWait: 20000
validationQuery: SELECT 1
validationQueryTimeout: 30000
minEvictableIdleTimeMillis: 300000
maxEvictable