一、背景介紹
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。