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。

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