ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各类多样化的应用场景。java
ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并不是实现一个全新的关系型数据库。node
定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为加强版的JDBC驱动,彻底兼容JDBC和各类ORM框架。spring
在数据量不是不少的状况下,能够将数据库进行读写分离,以应对高并发的需求,经过水平扩展从库,来缓解查询的压力sql
在数据量达到500万的时候,能够将数据进行分表存储数据库
在数据量继续扩大,能够考虑分库分表,将数据存储在不一样数据库的不一样表中express
Sharding-JDBC分片策略存有两种维度:apache
1.应用api
spring boot 版本:2.1.8.RELEASE服务器
没使用最新的4.x,采用的3.x
(1)添加依赖
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
(2)增长配置
##数据库配置 sharding.jdbc.datasource.names=ds0,ds1 sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/db0?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true sharding.jdbc.datasource.ds0.username=root sharding.jdbc.datasource.ds0.password=root sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/db1?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true sharding.jdbc.datasource.ds1.username=root sharding.jdbc.datasource.ds1.password=root sharding.jdbc.config.sharding.default-data-source-name=ds0 sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=file_id sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{file_id % 2} sharding.jdbc.config.sharding.tables.assets.actual-data-nodes=ds$->{0..1}.assets$->{0..5} sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.sharding-column=id sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.algorithm-expression=assets$->{id % 6} sharding.jdbc.config.sharding.tables.assets.key-generator-column-name=id sharding.jdbc.config.sharding.tables.structures.key-generator-column-name=id sharding.jdbc.config.sharding.binding-tables=files sharding.jdbc.config.sharding.props.sql.show=true
说明:
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column 配置的分库的字段
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression 配置的分库的逻辑,根据file_id%2进行分
sharding.jdbc.config.sharding.tables.assets.actual-data-nodes 配置的是user表在真实数据库中的位置
sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.sharding-column 配置assets表数据切分的字段
sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.algorithm-expression=assets$->{id % 6} 配置assets表数据切分的策略
files表不分库
structures表只分库部分表
2.扩容
采用双倍扩容的方案
从2台服务器扩到4台,接着再扩到8台……