分库分表常见中间件介绍
- Cobar(被淘汰了)
- TDDL:淘宝根据自己的业务特点开发了TDDL,基于JDBC规范,没有server,以client-jar的形式存在,引入项目即可使用。开源功能较少,阿里内部使用为主。
- Mycat:地址http://www.mycat.org.cn/,java语言编写的Mysql数据库网络协议的开源中间件,前身是Cobar,遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。是基于Proxy,它复写了Mysql协议,将Mycat Server伪装成了一个Mysql数据库。和ShardingShere下的Sharding-Proxy作用类似,需要单独部署。
- ShardingSphere下的Sharding-JDBC,地址:https://shardingsphere.apache.org/。Apach下的一套开源的分布式数据库中间件解决方案组成的生态圈,由Sharding-JDBC,Sharding-Proxy,Sharding-Sidecar 3个产品组成。Sharing-JDBC基于jdbc驱动,不需要额外的proxy,支持任意实现JDBC规范的数据库,它使用客户端直接连接数据库,以jar包形式提供服务,无需要额外部署和依赖,可以理解为加强帮JDBC驱动,兼容JDBC和各种ORM框架。
其中最被面试官问到是Mycat和Sharding-JDBC。
其两者都是相同的设计理念,SQL解析->SQL路由->SQL改写->结果归并。
Sharding-JDBC:
- 基于jdbc驱动,不用额外的proxy,在本地应用层重新jdbc原生的方法,实现数据库分片形式。
- 是基于jdbc接口的扩展,以jar包的形式提供轻量级服务的,性能高。
- 代码具有侵入性。
Mycat:
- 是基于Proxy,它复写了Mysql协议,将Mycat Server伪装成一个Mysql数据库。
- 客户端所有的jdbc请求都必须要先交给MyCat,再有MyCat转发到具体的真实服务器。
- 缺点是效率偏低,中间包装了一层。
- 代码没有侵入性。
ShardingSphere认知
Sharding-Sidecar:定位是云原生数据库代理,以Sidecar的形式代理使所有对数据库的访问,通过无中心,零代码侵入的方案提供与数据库交互的齿合层,即DataBase Mesh,由可称数据库网络。
ShardingSphere-JDBC:它是使用客户端直接连接数据库,以jar包形式提供服务,无需额外部署和依赖,可以理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架,适用任何第三方的数据库连接池,;支持任意实现JDBC规范的数据库,目前支持Mysql,PostgreSQL,Oracle,SQLServer以及任何可以使用JDBC访问的数据库。采用无中心化架构,与应用程序共享资源,适用于Java开发的高性能的轻量级OLTP应用。

ShardingSphere-Proxy:数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。向应用程序完全透明,可以直接当作Mysql/PostgreSQL。它可以使用任意兼容Mysql/PostgreSql。它可以使用任何兼容Mysql/PostgreSQL协议的访问客户端操作数据。

三大组件对比:
| ShardingSphere-JDBC | ShardingSphere-Proxy | Sharding-Sidecar | |
| 数据库 | 任意 | Mysql/PostgreSQL | Mysql/PostgreSQL |
| 连接消耗数 | 高 | 低 | 高 |
| 异构语言 | 仅JAVA | 任意 | 任意 |
| 性能 | 损耗低 | 损耗偏高 | 损耗低 |
| 无中心化 | 是 | 否 | 是 |
| 静态入口 | 无 | 有 | 无 |
常见术语
数据节点Node:
数据分片的最小单元,由数据源名称和数据表组成。比如:ds_0.product_order_0。
真实表:
在分片的数据库中真实存在的物理表。比如:订单表product_order_0。
逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。比如订单表product_order_0,product_order_1等的逻辑表就是product_order。
绑定表:
指分片规则一致的主表和子表。比如product_order和product_order_item,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
广播表:
指所有的分片数据源中都存在的表,表结构和表中数据在每个数据库中均完全一致。适用与数据量不大且需要海量数据的表进行关联查询的场景。例如:字典表,配置表。
Sharding-JDBC常见分片算法
数据库表分片(水平库,表):包含分片键和分片策略。
第4章:分库分表常见中间件介绍和ShardingSphere极速认知
分片键(PartitionKey):
用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。比如product_order订单表,根据订单号out_trade_no做哈希取模,则out_trade_no是分片键,除了对单分片字段的支持,ShardingSpher也支持根据多个字段进行分片。
分片策略:
- 行表达式分片策略InlineShardingStrategy(必备):只支持单分片键使用的表达式,提供对SQL语句中的 = 和IN的分片操作支持。可以通过简单的配置使用,无需自定义分片算法,从而比避免繁琐的Java代码开发。
- 标准分片策略StandardShardingStrategy(需了解):只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm范围分配是可选的,用于处理BETWEEN AND分片;如果不配置RangeShardingAlgorithm,如果SQL中用了BETWEEN AND语法,则将按照全库路由处理,性能下降。
- 复合分片策略ComplexShardingStrategy(需了解):支持多分片键,多分片键之间的关系复杂,由开发者自己实现,提供最大的灵活度。提供对SQL语句中的 =,IN和BETWEEN AND的分片操作支持,
- Hint分片策略HintShardingStrategy(需了解):这种分片策略无需配置分片键,分片键值也不再从SQL中解析,外部手动指定分片键或分片库,让SQL在指定分库分表中执行。用于处理使用Hint行分片的场景,通过Hint而非SQL解析的方式分片的策略。Hint策略会绕过SQL解析的,对于这些比较复杂的需要分片的查询,HInt分片策略性可能会更好。
- 不分片策略NoneShardingStrategy(需了解):不分片的策略。
ShardingSphere核心组件与分片算法详解

1321

被折叠的 条评论
为什么被折叠?



