天天看點

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。