分库分表技术之ShardingJDBC(1)

591 阅读5分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

分库分表方式回顾

分库分表的目的就是将我们的单库的数据控制在合理范围内,从而提高数据库的性能。

  • 垂直拆分(按照结构分)
    • 垂直分表:将一张宽表(字段很多的表),按照字段的访问频次进行拆分,就是按照表单结构进行拆
    • 垂直分库:根据不同的业务,将表进行分类,拆分到不同的数据库。这些库可以部署在不同的服务器,分摊访问压力。
  • 水平拆分(按照数据行分)
    • 水平分库:将一张表的数据(按照数据行)分到多个不同的数据库。每个库的表结构相同。每个库都只有这张表的部分数据,当单表的数据量过大,如果继续使用水平分库,那么数据库的实例就会不断增加,不利于系统的运维。这时候就要采用水平分表。
    • 水平分表:将一张表的数据(按照数据行),分配到同一个数据库的多张表中,每个表都只有一部分数据。

什么时候用分库分表

  • 在系统设计阶段,就要完成垂直分库和垂直分表。在数据量不断上升,数据库性能无法满足需求的时候,首先要考虑的是缓存、读写分离、索引技术等方案。如果数据量不断增加,并且持续增长再考虑水平分库水平分表。

分库分表带来的问题

关系型数据库在单机单库的情况下,比较容易出现性能瓶颈问题,分库分表可以有效的解决这方面的问题,但是同时也会产生一些比较棘手的问题。

事务一致性问题

当我们需要更新的内容同时分布在不同的库时,不可避免的会产生跨库的事务问题。原来在一个数据库操作,本地事务就可以进行控制,分库之后 一个请求可能要访问多个数据库,如何保证事务的一致性,目前还没有简单的解决方案。

跨节点关联的问题

在分库之后,原来在一个库中的一些表,被分散到多个库,并且这些数据库可能还不在一台服务器,无法关联查询。

解决这种关联查询,需要我们在代码层面进行控制,将关联查询拆开执行,然后再将获取到的结果进行拼装。

分页排序查询的问题

分库并行查询时,如果用到了分页每个库返回的结果集本身是无序的,只有将多个库中的数据先查出来,然后再根据排序字段在内存中进行排序,如果查询结果过大也是十分消耗资源的。

主键避重问题

在分库分表的环境中,表中的数据存储在不同的数据库,主键自增无法保证ID不重复,需要单独设计全局主键。

公共表的问题

不同的数据库,都需要从公共表中获取数据。可以在每一个库都创建这个公共表,所有对公共表的更新操作,都同时发送到所有分库执行。ShardingJDBC可以帮助我们解决这个问题。

ShardingJDBC简介

什么是ShardingJDBC

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,我们只关注Sharding-JDBC即可。

官方地址:shardingsphere.apache.org/document/cu…

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

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

image.png

上图展示了Sharding-Jdbc的工作方式,使用Sharding-Jdbc前需要人工对数据库进行分库分表,在应用程序中加入Sharding-Jdbc的Jar包,应用程序通过Sharding-Jdbc操作分库分表后的数据库和数据表,由于Sharding-Jdbc是对Jdbc驱动的增强,使用Sharding-Jdbc就像使用Jdbc驱动一样,在应用程序中是无需指定具体要操作的分库和分表的。

Sharding-JDBC主要功能

  • 数据分片
  • 读写分离

通过Sharding-JDBC,应用可以透明的使用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

Sharding-JDBC与MyCat的区别

  1. mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包
  2. 使用mycat时不需要修改代码,而使用sharding-jdbc时需要修改代码
  3. Mycat是基于 Proxy,它复写了MySQL协议,将Mycat Server伪装成一个MySQL数据库,而Sharding-JDBC是基于JDBC的扩展,是以jar包的形式提供轻量级服务的。
  • Mycat(proxy中间件层)

image.png

  • Sharding-jdbc(应用层)

image.png