分库分表框架Sharding-jdbc以及分布式worker:Elastic-job的使用与踩坑

一、为什么要使用Sharding

      在当今互联网企业中,数据成倍增长是一个很头疼的问题。由于数据库中一张表存入的数据越多,对数据库操作的数据就越慢。但是我们如果根据指定的分库分表策略,将数据分散的到不同的表上,我们查询时,根据全局主键,只扫某个库的某一张表,这样即减少了单个库的压力,又可以加快我们的查询速度。就好像JDK中ConcurrentHashMap似的。将大的问题分治到小的问题上,以提高效率问题。

二、使用sharding要确定的要素

   2.1、 全局主键的方式

            2.1.1  根据业务自己选择主键

                 在本教程中我们只是使用了sharding简单的分库分表的方式,分库的策略就是取模。可以根据业务区选择全局主键,  只要其全局唯一,并且尽可能的随机Hash就好。

           2.1.2  使用sharding生成全局主键

                 sharding官方文档中对主键生成的文档如下:http://shardingjdbc.io/docs/02-guide/key-generator/

   2.2、 多数据源配置

      在传统的ORM项目中,我们只需要配置一个DataBase(只考虑最基本的情况,不包括动态数据源,读写分类等),但是在分库分表中,我们将数据存入多个不同的库上,这个时候我们就需要配置多个分数据源,再将多个数据源集中到一个总数据源上。当我们进行处理时,我们根据分片策略和全局主键,动态就将操作分配到多个数据源上。

   2.3、 分片算法

   我们已经拥有了全局的主键,和多个数据库。那怎么根据主键分配到不同的数据库上呢,我们就需要分片算法,使得sharding-jdbc知道如何分配数据的处理。sharding提供了多种不同的分库分表策略以便于我们去实现。

官方文档如下:

”Sharding-JDBC提供了5种分片策略。由于分片算法和业务实现紧密相关,因此Sharding-JDBC并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。

  • StandardShardingStrategy

标准分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

  • ComplexShardingStrategy

复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此Sharding-JDBC并未做过多的封装,而是直接将分片键值组合以及分片操作符交于算法接口,完全由应用开发者实现,提供最大的灵活度。

  • InlineShardingStrategy

Inline表达式分片策略。使用Groovy的Inline表达式,提供对SQL语句中的=和IN的分片操作支持。InlineShardingStrategy只支持单分片键,对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: tuser${user_id % 8} 表示t_user表按照user_id按8取模分成8个表,表名称为t_user_0到t_user_7。

  • HintShardingStrategy

通过Hint而非SQL解析的方式分片的策略。

  • NoneShardingStrategy

不分片的策略。”

   2.4    事务处理

由于我们本文目的是完成最基础的sharding的使用,没有主从同步等设置,因此我们像处理单表那样处理事务就好。当进行insert,delete,uodate等操作时。我们在Service上加事务,当其进行处理时,会根据你传入的值得全局主键去操作。这样,就会使操作映射在某一个库的某一个表上。

三、代码实现



 

你可能感兴趣的:(sharding)