分库分表是解决关系数据库大表的一个很重要的方式,本文将详细讲解如何使用当当网开源的框架来实现分库分表的具体实现,本文是不可多得的详细讲解并亲自实践的Sharding-jdbc的文章,请大家收藏学习。
一:数据库分片方案
- 客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
- 中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现在谈的 Mycat、360的Atlas、网易的DDB等等都是这种架构的实现
二:Sharding-JDBC
Sharding-JDBC: https://github.com/dangdangdotcom/sharding-jdbc
Sharding-JDBC是一个开源的适用于微服务的分布式数据访问基础类库,它始终以云原生的基础开发套件为目标。
Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,可理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。
Sharding-JDBC完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。从2016年开源至今,在经历了整体架构的数次精炼以及稳定性打磨后,如今它已积累了足够的底蕴,相信可以成为开发者选择技术组件时的一个参考。
1.分库分表
- SQL解析功能完善,支持聚合,分组,排序,LIMIT,TOP等查询,并且支持级联表以及笛卡尔积的表查询
- 支持内、外连接查询
- 分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略
- 基于Hint的强制分库分表路由
2.读写分离
- 一主多从的读写分离配置,可配合分库分表使用
- 基于Hint的强制主库路由
3.柔性事务
- 最大努力送达型事务
- TCC型事务(TBD)
4.分布式主键
- 统一的分布式基于时间序列的ID生成器
5.兼容性
- 可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
- 可基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等
- 理论上可支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL
6.灵活多样的配置
- Java
- YAML
- Inline表达式
- Spring命名空间
- Spring boot starter
7.分布式治理能力 (2.0新功能)
- 配置集中化与动态化,可支持数据源、表与分片策略的动态切换(2.0.0.M1)
- 客户端的数据库治理,数据源失效自动切换(2.0.0.M2)
- 基于Open Tracing协议的APM信息输出(2.0.0.M3)
架构图
三:sharding-jdbc + jpa + druid集成
1. 数据库准备
-- 在db0数据库上分别创建t_order_0、t_order_1表USE db0;DROP TABLE IF EXISTS t_order_0; CREATE TABLE t_order_0 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS t_order_1; CREATE TABLE t_order_1 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- 在db1数据库上分别创建t_order_0、t_order_1表USE db1;DROP TABLE IF EXISTS t_order_0; CREATE TABLE t_order_0 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS t_order_1; CREATE TABLE t_order_1 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2. 引入依赖
<?xml version="1.0" encoding="UTF-8"?>4.0.0com.company sharding-jdbc 0.0.1-SNAPSHOTjarsharding-jdbcDemo project for Spring Bootorg.springframework.boot spring-boot-starter-parent 2.0.3.RELEASEUTF-8UTF-81.8mysql mysql-connector-java 5.1.41com.alibaba druid 1.1.10org.springframework.boot spring-boot-starter-data-jpa com.dangdang sharding-jdbc-core 1.5.4org.springframework.boot spring-boot-starter-web org.projectlombok lombok trueorg.springframework.boot spring-boot-starter-test testorg.springframework.boot