网站建设实践收获,类似谷德设计网的网站,开发公司名字,网站建设在哪里接单1 引言 最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求#xff0c;参考官方文档#xff08;Sharding官方文档#xff09;感觉内容庞杂不够有条理#xff0c;重复内容比较多#xff1b;现结合项目应用整理笔记如下供大家参考和自己回忆使用#xff1b; 在…1 引言 最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求参考官方文档Sharding官方文档感觉内容庞杂不够有条理重复内容比较多现结合项目应用整理笔记如下供大家参考和自己回忆使用 在实现基于分布式数据库的应用系统ShardingShpere系列产品还是相当不错和成熟的本文重点讲述其第一款产品Sharding-JDBC的快速使用。 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar计划中这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere定位为关系型数据库中间件旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力而并非实现一个全新的关系型数据库。
1.1 Sharding-JDBC介绍 Sharding-JDBC是ShardingSphere的第一个产品也是ShardingSphere的前身。 它定位为轻量级Java框架在Java的JDBC层提供的额外服务。它使用客户端直连数据库以jar包形式提供服务无需额外部署和依赖可理解为增强版的JDBC驱动完全兼容JDBC和各种ORM框架。
1.2 Sharding-JDBC特点
适用于任何基于JDBC的ORM框架如JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池如DBCP, C3P0, BoneCP, Druid, HikariCP等。支持任意实现JDBC规范的数据库。目前支持MySQLOracleSQLServerPostgreSQL以及任何遵循SQL92标准的数据库。 Sharding-JDBC的优势在于对Java应用的友好度。
2 快速使用 这里重点讲述数据分片、读写分离
2.1 数据分片 传统的应用将数据集中存储至单一数据节点的解决方案在性能、可用性和运维成本这三方面已经难以应对数据海量的场景所以数据分片的概念就适时提出。 数据分片指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果。数据分片的有效手段是对关系型数据库进行分库和分表。分库和分表均可以有效的避免由数据量超过可承受阈值而产生的查询瓶颈。除此之外分库还能够用于有效的分散对数据库单点的访问量分表虽然无法缓解数据库压力但却能够提供尽量将分布式事务转化为本地事务的可能一旦涉及到跨库的更新操作分布式事务往往会使问题变得复杂。使用多主多从的分片方式可以有效的避免数据单点从而提升数据架构的可用性。
2.1.1 分片算法 通过分片算法将数据分片支持通过、、、、、between和in分片。分片算法需要应用开发者自行实现可实现的灵活度非常高目前提供4种分片算法。
PreciseShardingAlgorithm精确分片算法用于处理使用单一键作为分片键的或in进行分片的场景。需要配合StandardShardingStrategy使用RangeShardingAlgorithm范围分片算法用于处理使用单一键作为分片键的BETWEEN AND、、、、进行分片的场景。需要配合StandardShardingStrategy使用ComplexKeysShardingAlgorithm复合分片算法用于处理使用多键作为分片键进行分片的场景包含多个分片键的逻辑较复杂需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy使用HintShardingAlgorithmHint分片算法用于处理使用Hint行分片的场景。需要配合HintShardingStrategy使用。
2.1.2 分片策略 分片策略分片键分片算法。目前提供5种分片策略。
StandardShardingStrategy标准分片策略提供对SQL语句中的, , , , , IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的用于处理和IN的分片。RangeShardingAlgorithm是可选的用于处理BETWEEN AND, , , , 分片如果不配置RangeShardingAlgorithmSQL中的BETWEEN AND将按照全库路由处理。ComplexShardingStrategy复合分片策略提供对SQL语句中的, , , , , IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键由于多分片键之间的关系复杂因此并未进行过多的封装而是直接将分片键值组合以及分片操作符透传至分片算法完全由应用开发者实现提供最大的灵活度。InlineShardingStrategy行表达式分片策略使用Groovy的表达式提供对SQL语句中的和IN的分片操作支持只支持单分片键。对于简单的分片算法可以通过简单的配置使用从而避免繁琐的Java代码开发如: t_user_$-{u_id % 8} 表示t_user表根据u_id模8而分成8张表表名称为t_user_0到t_user_7。HintShardingStrategyHint分片策略通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略。NoneShardingStrategy不分片策略不分片的策略。
2.1.3 数据分片例子 这里将列举一个单表含多个分片键的列表查询示例这里使用Yaml的方式进行分片配置其他方式请读者参考官方文档
分片配置
spring:shardingsphere:datasource:names: ds0ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/db1?characterEncodingutf8username: rootpassword: 123456sharding:default-database-strategy:inline:sharding-column: idalgorithm-expression: ds$-{0}tables:t_order:actual-data-nodes: ds$-{0}.artb_area_receivable_$-{0..10}_$-{2010..2024}databaseStrategy:standard:shardingColumn: idpreciseAlgorithmClassName: org.jeecg.common.DBShardingAlgorithmtableStrategy:complex:shardingColumns: tenant_code,yearalgorithmClassName: org.jeecg.common.TableComplexKeysShardingAlgorithmkeyGenerator:column: idtype: SNOWFLAKEprops:worker:id: 123props:sql:show: true分片算法
/*** author 一朝风月* date 2024-01-02 10:50*/
Slf4j
public class TableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithmString {Overridepublic CollectionString doSharding(Collection collection, ComplexKeysShardingValue complexKeysShardingValue) {HashMapString, ArrayListString map (HashMapString, ArrayListString) complexKeysShardingValue.getColumnNameAndShardingValuesMap();String tenantCode map.get(tenant_code).get(0);String year map.get(year).get(0);collection.clear();collection.add(complexKeysShardingValue.getLogicTableName() _ tenantCode _ year);return collection;}
}测试结果
2024-01-03 15:36:16.847 [http-nio-7006-exec-1] INFO ShardingSphere-SQL:74 - Actual SQL: ds0 ::: SELECT id,tenant_code,year,order_name,archive FROM t_order_7_2023 AND WHERE year? AND tenant_code? AND archivefalse LIMIT ? ::: [2023, 7, 10]2.2 读写分离 将数据库拆分为主库和从库主库负责处理事务性的增删改操作从库负责处理查询操作这种拆分称之为读写分离它能够有效的避免由数据更新导致的行锁使得整个系统的查询性能得到极大的改善。
Yaml配置
spring:shardingsphere:dataSources:ds_master: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_masterusername: rootpassword: ds_slave0: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_slave0username: rootpassword: ds_slave1: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_slave1username: rootpassword: masterSlaveRule:name: ds_msmasterDataSourceName: ds_masterslaveDataSourceNames: - ds_slave0- ds_slave1props:sql.show: true