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臺……