01、Sharding-JDBC 实战;实现分库分表简介

1、分库分表场景介绍

垂直分表-分字段

将单表的字段分成多个表,每个表存储其中一部分字段。
优点:单一表数据量过大,区分大字段、热门字段、冷门字段,降低IO消耗,提高检索效率。

水平分表-多个相同表(拓展)

每个表所存在的字段信息一致,根据不同的规则将不同的数据分布到不同的表中。
优点:解决单一表数据量过大,而产生的性能问题。

当都是单表数据过大时,并且各字段都常用,相对推荐使用水平分表

垂直分库-按业务分表

将不同业务类型的表,分到不同的数据库中。
优点:业务数据库数据量过大,降低业务表耦合,提高系统并发性能。

水平分库-多个相同库(拓展)

每个数据库的表结构一致,根据不同的规则将不同的数据分布到不同的库中。
优点:解决单库数据量过大,而产生的性能问题。

四种分片方式在实际开发中可以进行多种相应的组合,比如:

根据不同业务系统进行 垂直分库。

根据不同业务系统进行 垂直分库,当单库数据过大时,可以进行水平分库。

根据不同业务系统进行 垂直分库,当单表数据过大时,可以进行水平分表。

根据不同业务系统进行 垂直分库,当单库数据过大时,可以进行水平分库,分库中单表数据过大时,可以进行水平分表。

不进行任何分库,当单表数据过大时,可以进行水平分表。

2、分库分表带来问题

  • 数据来自不同的数据库,产生分布式事务一致性。
  • 无法直接进行分库关联。
  • 无法直接分页、排序、聚合计算,会每个分库/表都进行分页,然后再将结果进行分页最终返回。
  • 需要使用分布式ID方案。

3、Sharding-JDBC介绍

它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

Sharding-JDBC的核心功能为数据分片和读写分离,通过Sharding-JDBC,应用可以透明的使用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布,必须事先建立需要进行分库分表、读写分离的数据库。

使用Sharding-JDBC时,程序不需要指定具体的分库或者分表,而有Sharding-JDBC进行底层的操作。

支持范围广:

  • 适用于任何基于Java的ORM框架,如: Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

 

分片键

用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。

分片算法

通过分片算法将数据分片,支持通过=>=<=><BETWEENIN分片。分片算法需要应用方开发者自行实现,可实现的灵活度非常高。

行表达式语法说明

${begin..end}表示范围区间 ${[unit1, unit2, unit_x]}表示枚举值

${
    
      ['online', 'offline']}_table${
    
      1..3}
// 最终会解析为:
online_table1, online_table2, online_table3, offline_table1, offline_table2, offline_table3

tb$->{
    
      1..2}_table$->{
    
      1..3}
// 最终会解析为:
tb1_table1,tb1_table2,tb1_table3,tb2_table1,tb2_table2,tb2_table3

// 通过取余的方式,设置分片的后缀,比如,分为:table_1/2/3
则表达式为:table_$->{
    
      id % 3 +1}