Sharding-Jdbc 插件应用
Sharding-Jdbc介绍
Sharding-Jdbc在3.0后改名为Shardingsphere它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
Sharding-Sphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。 应用场景: 数据库读写分离 数据库分表分库
相关资料:
Sharding-Jdbc官方网址: https://shardingsphere.apache.org/
Sharding-Jdbc与MyCat区别
MyCat是一个基于第三方应用中间件数据库代理框架,客户端所有的jdbc请求都必须要先交给MyCat,再有MyCat转发到具体的真实服务器中。
Sharding-Jdbc是一个Jar形式,在本地应用层重写Jdbc原生的方法,实现数据库分片形式。 MyCat属于服务器端数据库中间件,而Sharding-Jdbc是一个本地数据库中间件框架。
从设计理念上看确实有一定的相似性。主要流程都是SQL 解析 -> SQL 路由 -> SQL 改写 -> SQL 执行 -> 结果归并。但架构设计上是不同的。Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的。
类似于在微服务中的SpringCloud Ribbon与Nginx区别。
Sharding-Jdbc实现读写分离
Sharding-Jdbc实现读写分离原理,非常容易。只需要在项目中集成主和从的数据源,Sharding-Jdbc自动根据DML和DQL 语句类型连接主或者从数据源。
注意: Sharding-Jdbc只是实现连接主或者从数据源,不会实现主从复制功能,需要自己配置数据库自带主从复制方式。
查看MasterSlaveDataSource即可查看该类getDataSource方法获取当前数据源名称
DML:数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
DQL:数据操纵语言DML主要有三种形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 删除:DELETE
实现读写分离原理:
1.需要在配置文件中配置读写分离jdbc连接全部都交给Sharding-jdbc,配置主数据和从数据库。主数据库与从数据库是通过二进制文件进行数据同步的。
2.Sharding-jdbc 会自动判断sql 语句类型(DML或者DQL),如果是DML语句的话 会获取主数据库的jdbc连接配置进行发送请求。如果是DQL语句的话,获取从数据库的配置文件进行发送请求。
Sharding-Jdbc分表分库
LogicTable
数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。
订单信息表拆分为2张表,分别是t_order_0、t_order_1,他们的逻辑表名为t_order。
ActualTable
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0、t_order_1。
DataNode
数据分片的最小单元。由数据源名称和数据表组成,例:test_msg0.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。
ShardingColumn
分片字段。用于将数据库(表)水平拆分的关键字段。SQL中如果无分片字段,将执行全路由,性能较差。Sharding-JDBC支持多分片字段。
ShardingAlgorithm
分片算法。Sharding-JDBC通过分片算法将数据分片,支持通过等号、BETWEEN和IN分片。分片算法目前需要业务方开发者自行实现,可实现的灵活度非常高。未来Sharding-JDBC也将会实现常用分片算法,如range,hash和tag等。
SpringBoot整合Sharding-Jdbc分为两种方式
第一种为原生配置方式,自己需要实现接口。 1.分库算法类需要实现SingleKeyDatabaseShardingAlgorithm<T>接口 2.分表算法类需要实现SingleKeyTableShardingAlgorithm<T>接口
第二种通过配置文件形式配置。 案例比如:t_order 拆分程t_order_0 t_order _1
Sharding-Jdbc日志分析与原理图
1.Sharding-JDBC中的路由结果是通过分片字段和分片方法来确定的,如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片。
2.如果查询没有分片的字段,会向所有的db或者是表都会查询一遍,让后封装结果级给客户端。 Sharding-Jdbc和MyCat查询原理大致相同。
源码地址:https://gitee.com/MingTian-NiHao/springbootZhengHemysql/tree/dev-sharding-jdbc/