1.什么是 Sharding Sphere
Apache ShardingSphere(Incubator) 是一套开源的分布式数据库中间件解决方案组成的生态圈。
组成:
1.Sharding-JDBC
2.Sharding-Proxy
3.Sharding-Sidecar
功能:提供标准化的数据分片、分布式事务和数据库治理功能
目的:
充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。它通过关注不变,进而抓住事物本质。
2.什么是分库分表 :
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展, 库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销 也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内 存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据 库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数 据表的数据量变小,从而达到提升数据库性能的目的。
数据库的切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。 数据的切分根据其切分规则的类型,可以分为 垂直切分 和水平切分。
拆分方式;
(1)垂直切分: 把单一的表拆分成多个表,并分散到不同的数据库(主机)上。
(2)水平切分:根据表中数据的逻辑关系,将表中的数据按照某种条件拆分到多台数据库上。
垂直分库 :
垂直分表:
(1)操作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一 部分字段数据存到另外一张表里面 。
垂直切分的优点如下:
(1)拆分后业务清晰,系统之间进行整合或扩展很容易。
(2)按照成本、应用的等级、应用的类型等奖表放到不同的机器上,便于管理,数据维护 简单。
垂直切分的缺点如下:
(1)部分业务表无法关联(Join), 只能通过接口方式解决,提高了系统的复杂度。
(2)受每种业务的不同限制,存在单库性能瓶颈,不易进行数据扩展和提升性能。
(3)事务处理变得复杂。
水平分表 :
水平分库:
距离:
在博客类系统中,读取量一般都会很大。当同时有 100 万个用户在浏览时,如果是单表,则单表会进行 100 万次请求,如果是单库,数据库就会承受 100 万次的请求压力。 如果采取水平切分来减少每个单表的压力,将其分为 100 个表,并且分布在 10 个数据库中,每个表进行 1 万次请求,则每个数据库会承受 10 万次的请求压力,虽然这不可能绝对 平均,但是这样,压力就减少了很多,并且是成倍减少的。
水平切分的优点:
(1)单库单表的数据保持在一定的量级,有助于性能的提高。
(2)切分的表的结构相同,应用层改造较少,只需要增加路由规则即可。
(3)提高了系统的稳定性和负载能力。
水平切分的缺点如下:
(1)切分后,数据是分散的,很难利用数据库的 Join 操作,跨库 Join 性能较差。
(2)分片事务的一致性难以解决,数据扩容的难度和维护量极大。
分库分表带来的问题 :
综上所述,垂直切分和水平切分的共同点如下:
• 存在跨节点 Join 的问题。
• 存在跨节点合并排序、分页的问题。
• 存在多数据源管理的问题。
Sharding-JDBC:
Sharding-JDBC是当当网研发的开源分布式数据库中间件,从 3.0 开始 Sharding-JDBC 被包含在 Sharding-Sphere中,之后该项目进入进入 Apache孵化器,4.0版本之后的 版本为Apache版本。
Sharding-JDBC 是 ShardingSphere的第一个产品,也是 ShardingSphere的前身。 它定位为轻量级 Java框架,在 Java的 JDBC层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容JDBC和各种 ORM 框架
Sharding-JDBC的核心功能为数据分片和读写分离,通过Sharding-JDBC,应用可以透明的使 用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分 布。
- 适用于任何基于JDBC的ORM框架,例如JPA,Hibernate,Mybatis,Spring JDBC模板或直接使用JDBC。
- 支持任何第三方数据库连接池,例如DBCP,C3P0,BoneCP,Druid,HikariCP。
- 支持任何种类的JDBC标准数据库:MySQL,Oracle,SQLServer,PostgreSQL和任何遵循SQL92的数据库。
Sharding-Proxy:
分片代理将自身定义为透明的数据库代理,它提供了一种数据库服务器,该服务器封装了数据库二进制协议以支持异构语言。对DBA友好的是,现在提供的MySQL版本可以使用与MySQL协议兼容的任何类型的终端(例如MySQL Command Client,MySQL Workbench等)来操作数据。
- 对应用程序完全透明,可以直接用作MySQL。
- 适用于与MySQL和PostgreSQL协议兼容的任何类型的终端。
Sharding-Sidecar:
Sharding-Sidecar(TODO)将自己定义为Kubernetes环境的云原生数据库代理,以sidecar的形式负责对数据库的所有访问。它提供了一个与数据库交互的网格层,我们称之为Database Mesh
。
Database Mesh强调如何将分布式数据库访问应用程序与数据库连接。着重于交互,它有效地组织了杂乱的应用程序与数据库之间的交互。使用数据库网格访问数据库的应用程序和数据库将形成一个大型网格系统,只需将它们放在相应的正确位置即可。它们都由网格层控制。
混合架构:
Sharding-JDBC采用分散式架构,适用于用Java开发的高性能轻量级OLTP应用程序;Sharding-Proxy提供了静态输入和所有语言支持,适用于OLAP应用程序和分片数据库的管理和操作情况。
ShardingSphere是一个由多个端点组成的生态圈。通过在同一注册中心混合使用Sharding-JDBC和Sharding-Proxy和统一的分片策略.
ShardingSphere可以构建适用于各种情况的应用程序系统。架构师可以更自由地将系统架构调整为最适合当前业务的架构。
特征
数据分片
- 数据库分片和表分片
- 读写分割
- 分片策略定制
- 无中心分布式主键
分布式交易
- 统一交易API
- XA交易
- 基础交易
数据库编排
- 动态配置
- 编排与治理
- 数据加密
- 追踪与可观察性
- 弹性向外扩展(Planing)