Sharding-JDBC和Mycat在分库分表中的应用

一、背景介绍

        Sharding-JDBC本来是当当网内部解决分库分表的问题的一个内部组件,后来慢慢开源了然后现在捐给了Apache,成为了Apache的一个子项目,但是当当自己还在维护自己的。除了Shrading-JDBC,当当还开源了Elastic-Job、基于Dubbo的DubboX。

       在Apache中,Sharding-JDBC改名叫做ShardingSphere,其包含了Sharding-JDBC和Sharding-Proxy,其中Sharding-JDBC是应用在客户端的,而Sharding-Proxy应用在代理端的。

        一般来说,操作数据库可以从以下的顺序进行操作:

        

        其中DAO,ORM,JDBC都是代码层的操作。

        我们使用的Sharding-JDBC是JDBC层的,其实现了JDBC协议,而Mycat和Sharding-Proxy是Proxy层的。Mycat可以当做一个mysql数据库来使用,而且其也实现了JDBC协议。

二、Sharding-JDBC和Mycat在项目中的使用流程

    1、Sharding-JDBC的使用流程

        1.1、导入Sharding-JDBC的jar包;

        1.1、在yml中配置数据源,配置分片策略(包括分库的策略和分表的策略),Sharding-JDBC官网提供了一些分片策略和分片算法,也可以自定义分片算法,分片算法可用于分库也可用于分表;

    2、Mycat的使用流程

        Mycat需要在其配置文件中配置分片策略和分片算法,如果自己想自定义也可以,其主要的配置文件是server.xml,schema.xml,rule.xml和具体的分片配置文件。

        2.1、在server.xml文件中主要配置系统相关的信息,我们常用的是配置访问mycat这个mysql服务的用户名和密码;

        

        2.2、在schema.xml中配置逻辑库、表、分片规则、分片节点和数据源;

        定义了逻辑表,以及逻辑表分布的节点和分片规则:

        

        数据节点与物理数据库的对应关系:

        

        配置物理主机的信息,readhost 是从属于 writehost 的:

        

        2.3、在rule.xml中定义分片规则和算法,分片规则对应相应的算法,算法可能对应具体的分片配置文件;

        

        

         2.3、在具体的文件中配置分片,例如上面的rang-long-cust.txt,对应的就是一个txt文档,内容如下

        

三、动态数据源     

          

        说到分库分表,就要考虑动态数据源,毕竟分为不同的库,要根据不同的需求切分不同的库,动态数据源我们可以从上面说的五个角度来具体实现。

       DAO:可用Spring自带的AbstractRoutingDataSource动态数据源,自定义一个注解,然后再定义一个切面切注解,根据注解动态切换数据源;

       ORM:例如Mybatis的插件可以实现动态数据源;

       JDBC:可以使用Sharding-JDBC来实现,在其yml文件中配置动态数据源;

       Proxy:可以使用Mycat来实现,在schema.xml文件中配置动态数据源;

       Server:有的数据库自带能动态切换数据源,这个不常见。

四、分片的策略

    1、Mycat的分片策略:可以在rule.xml中找到mycat本身提供的分片规则和分片算法,也可以自定义算法,然后在rule.xml中命名然后指向相应的实现类即可;

    2、Sharding-JDBC有五种分片策略可供使用,但是也可以自定义分片规则,继承ShardingStrategy然后实现自定义的分片策略即可。五种分片策略分别为:

        2.1、行表达式分片策略:单个分片键,提供对=和IN操作的支持,行表达式配置的比较简单。

             

               

        2.2、标准分片策略:单个分片键,既可以使用精确分片算法又可以使用范围分片算法

        2.3、复合分片策略:多个分片键,使用的是复合分片算法;

        2.4、Hint分片策略:类似于Mycat的注解,使用的是Hint分片算法;

        2.5、不分片策略:看名字就知道,不说了。

五、分布式事务和全局id

    1、Sharding-JDBC中

        1.1、分布式事务 

        这里只介绍一种简单的,XA两阶段提交,有兴趣的可以去harding-JDBC官网看具体的其他分布式事务的解决方案。

        导入一下XA的jar包,XA默认是使用atomikos实现的。

        

        在 Service 类上加上注解即可解决分布式事务,但是并发性差:

        

        1.2、全局id

        默认使用雪花算法,也可以自定义一个算法,然后配置文件中配置即可。

    2、Mycat中

        2.1、全局id

        Mycat提供了四种方式,文件方式,数据库方式,本地时间戳方式,zk方式,其原理都是在四个地方都存相应的id数据,每次从这几个地方取。

六、Sharding-JDBC和JDBC四大核心的关系

   1、Sharding-JDBC和JDBC四大核心

        

        JDBC的四大核心:DataSource,Connection,Statement(PrepareStatement),ResultSet,而Sharding-JDBC的四大核心也是ShardingDataSource,ShardingConnection,ShardingStatement(ShardingPrepareStatement),ShardingResultSet,其实就是对JDBC的四大核心进行进一步封装而已。 

    2、为什么springboot项目中用到的是Sharding-JDBC的四大核心而不是JDBC本身的呢?

        因为使用了Sharding-JDBC的starter,容器将其四大核心注入到了容器中,当需要使用的时候会自动注入这个四个核心。当使用DataSource时选择了Sharding-JDBC的,然后当使用Connection创建连接时Sharding-JDBC会动态代理JDBC的Connection,因此 是用是Sharding-JDBC。然后创建出来的statement或者prepareStatement、ResultSet都是Sharding-JDBC的。

       例如整合mybatis以后的项目用Sharding-JDBC,看过源码的都知道查询最后都走到了SimpleExecutor的doQuery()方法,想看这个流程的同学可以自己在这个地方打断点看看。

七、Sharding-JDBC和Mycat的区别以及选择

    1、Sharding-JDBC和Mycat的区别

        1.1、工作层次:Sharding-JDBC实现了JDBC协议,工作在JDBC层;Mycat可以当做一个mysql数据库使用,其实就是在Proxy层的。

        1.2、运行方式:Sharding-JDBC只需要在工程中导入一个Sharding-JDBC的jar包,然后在配置文件中配置相应的数据源和分片策略即可;Mycat则是需要单独提供一个端口为8066的服务,然后在Mycat的配置文件中配置相关的数据源和分片策略。

        1.3、开发方式:Sharding-JDBC只需要在配置文件中进行配置即可使用;Mycat需要在其配置文件中修改数据源等一系列参数。

        1.4、运维成本:Sharding-JDBC的运维成本低,java开发人员的维护成本高;Mycat运维成本高,得配置Mycat的一系列参数以及高可用负载均衡的配置,需要一定的运维实力。

        1.5、支持的语言:Sharding-JDBC只支持java语言;Mycat支持实现了JDBC规范的语言。

    2、如何选择?

        如果项目比较简单,需要使用的分片策略和算法不复杂,那么可以用Sharding-JDBC;如果项目比较复杂,分片规则比较复杂,而且具有一定的运维能力,那么选择Mycat。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章