Sharding-JDBC将自己定义为一个轻量级的Java框架,在Java JDBC层提供额外的服务。客户端直接连接数据库,以jar的形式提供服务,不需要额外的部署和依赖。 它可以被认为是一个增强的 JDBC 驱动程序,它完全兼容 JDBC和各种 ORM 框架。
特征:(1) 数据库分片&表分片; (2) 读写分离; (3) 分片策略定制; (4) 无中心分布式主键。
Sharding-Proxy将自己定义为透明的数据库代理,提供封装数据库二进制协议以支持异构语言的数据库服务器。 对DBA来说更加友好,现在提供的MySQL版本可以使用任何兼容MySQL协议的终端(例如MySQL Command Client、MySQL Workbench等)来操作数据。
目前(2023年12月22日)还没没有完成。
Sharding-Sidecar(TODO)将自己定义为 Kubernetes 环境的云原生数据库代理,以 sidecar 的形式负责所有对数据库的访问。 它提供了一个与数据库交互的网格层,我们称之为Database Mesh。
Database Mesh强调如何将分布式数据库访问应用程序与数据库连接起来。 以交互为中心,有效地组织了杂乱的应用程序与数据库之间的交互。 使用Database Mesh访问数据库的应用程序和数据库将形成一个大的网格系统,只需将它们相应地放置到正确的位置即可。 它们都受网格层的控制。
Sharding-JDBC | Sharding-Proxy | Sharding-Sidecar | |
---|---|---|---|
数据库 | 任何 | MySQL | MySQL |
连接计数成本 | 高的 | 低的 | 高的 |
支持的语言 | 仅限 Java | 任何 | 任何 |
表现 | 低损耗 | 相对较高的损耗 | 低损耗 |
去中心化 | 是的 | 不 | 不 |
静态条目 | 不 | 是的 | 不 |
特点总结:
主要包括以下三步:
- 导入maven依赖
- 分片规则配置
- 创建数据源
Step 1 导入maven依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${latest.release.version}</version>
</dependency>
Step 2 分片规则配置
Sharding-JDBC 可以通过四种方式进行配置:Java、YAML、Spring namespace 和 Spring boot starter。
开发者可以根据不同的情况选择合适的方法。
Step 3 创建数据源
使用ShardingDataSourceFactory和规则配置对象创建ShardingDataSource,ShardingDataSource是由标准JDBC接口DataSource实现的。然后,用户可以使用原生的JDBC或JPA、MyBatis等ORM框架进行开发。
DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
Todo
Todo
传统的将所有数据存储在一个集中节点的解决方案在性能、可用??性和运营成本三个方面已经很难满足海量互联网数据场景的需求。
在传统关系数据库无法满足互联网需求的情况下,越来越多的尝试将数据存储在原生分布式NoSQL中。但其与SQL的不兼容以及生态系统的不完善,使其无法在竞争中击败关系数据库,因此关系数据库仍然占据着不可动摇的地位。
分片是指 将一个数据库中的数据按照一定的标准切分到多个表和数据库中,从而提高性能和可用性。 两种方法都可以有效避免由于数据超过可承受阈值而导致的查询限制。更重要的是,数据库分片还可以有效分散TPS。分表虽然不能缓解数据库压力,但可以提供将分布式事务转移到本地事务的可能性,因为一旦涉及到跨库升级,分布式事务有时会变得相当棘手。采用多主从分片方式,可以有效避免数据集中于一个节点,提高架构可用性。
分片方式可以分为垂直分片和水平分片。
按照业务分片的方式,称为垂直分片,或者说纵向分片,其核心理念是数据库的专用化。在分片之前,数据库由很多表组成,对应不同的业务。但分片后,**表按照业务分到不同的数据库,压力也分到不同的数据库。**下图给出了根据业务需求,通过垂直分片将用户表和订单表分配到不同数据库的解决方案。
垂直分片需要不时调整架构和设计。总体来说还不够快,无法应对互联网业务快速变化的需求,无法真正解决单节点问题。它可以缓解高数据量和并发量带来的问题,但不能完全解决。垂直分片后,如果表中的数据量仍然超过单节点阈值,则应进一步进行水平分片处理。
水平分片也称为横向分片。与垂直分片按照业务逻辑进行分类的方法相比,水平分片通过一定的字段,按照一定的规则将数据分类到多个数据库或表中,每个分片只包含部分数据。
例如,根据主键分片,偶数主键放入0数据库(或表),奇数主键放入1数据库(或表)。
理论上,水平分片克服了单机数据处理量的限制,并且可以相对自由地扩展,因此可以作为分库分表的标准解决方案。
分片虽然解决了性能、可用??性、单节点备份恢复等问题,但其分布式架构在获取利润方面也带来了一些新的问题。
互联网巨头并没有大量采用基于XA的分布式事务,因为他们无法保证其在高并发情况下的性能。它们通常用最终一致的软状态替换强一致的事务。
ShardingSphere数据分片模块的主要设计目标是尽量减少分片的影响,让用户像使用一个数据库一样使用水平分片数据库组。