最近工作的重心是容量規劃,當系統數據量上來之後。對系統就需要使用分庫分表了,分庫分表選型的是 apache sharding jdbc,他是通過客戶端來對數據源進行分庫分表的。
1、遇到問題
但是在分庫分表之後,不管是開發還是測試,當遇到問題需要查詢數據庫的時候面對多個庫多個表那就比較痛苦了。
如何透明化分庫分表所帶來的影響,讓使用方儘量像使用一個數據庫一樣使用水平分片之後的數據庫集羣。我們需要解決這個問題。
我們在開發的時候使用了 ShardingSphere 的客戶端中間件,sharding-jdbc 來開發。當我們需要查詢數據的時候可以使用它裏面的另外一箇中間件,基於服務端的中間件 sharding-proxy。
2、sharding proxy
ShardingSphere-Proxy是ShardingSphere的第二個產品。 它定位爲透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用於完成對異構語言的支持。 目前先提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL協議的訪問客戶端(如:MySQL Command Client, MySQL Workbench, Navicat等)操作數據,對DBA更加友好。
- 嚮應用程序完全透明,可直接當做MySQL/PostgreSQL使用。
- 適用於任何兼容MySQL/PostgreSQL協議的的客戶端。
~ | ShardingSphere-JDBC | ShardingSphere-Proxy | ShardingSphere-Sidecar |
---|---|---|---|
數據庫 | 任意 | MySQL/PostgreSQL | MySQL/PostgreSQL |
連接消耗數 | 高 | 低 | 高 |
異構語言 | 僅Java | 任意 | 任意 |
性能 | 損耗低 | 損耗略高 | 損耗低 |
無中心化 | 是 | 否 | 是 |
靜態入口 | 無 | 有 | 無 |
ShardingSphere-Proxy的優勢在於對異構語言的支持,以及爲DBA和測試人員提供可操作入口。
3、安裝和配置
可以通過 官方下載路徑 下載最新的 sharding-proxy 目錄。
不過我們可以在本地從 github下載 sharding-sphere 項目.sharding-proxy 包含這個項目當中。在本地進行調試好了再把配置上文件上放置到 sharding proxy 裏面這樣就特別方便。因爲 sharding proxy 是基於 spring boot 的項目,它可以很方便的進行啓動。
3.1 sharding proxy 項目結構
下面就是 sharding proxy 的項目結構,其實和下載的啓動配置類似,只不過這個是以 spring boot 的形式啓動,而它是以 bat 或者 shell 文件啓動。
sharding-proxy
--sharding-proxy-bootstrap
--src
--main
--java
--org.apache.shardingsphere.shardingproxy.Bootstrap // 啓動類
--resources
-conf
--config-xxx.yaml // 配置分庫分表規則
--server.yaml // 配置服務器信息
3.2 分片配置
下面是分庫分表規則,這裏只配置了從庫,沒有配置主庫,因爲在分片庫裏面的 id 都是基於數據庫的自增生成的。當我們通過 navicat 進行修改數據的時候是通過 Id 修改的,所以當修改一個數據的時候其實是修改了很多數據。如果你的 ID 能夠保證全局唯一可以配置主從規則。
config-pay-engine.yml
schemaName: pay-engine
dataSources:
pay_engine_0:
url: jdbc:mysql://localhost:3306/pay_engine_0?characterEncoding=utf8&useSSL=false
username: carl
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
pay_engine_1:
url: jdbc:mysql://localhost:3306/pay_engine_1?characterEncoding=utf8&useSSL=false
username: carl
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
shardingRule:
tables:
tb_collect_pay_order:
actualDataNodes: pay_engine_${0..1}.tb_collect_pay_order_${0..49}
databaseStrategy:
complex:
shardingColumns: pay_order_no,request_no
algorithmClassName: cn.carl.pay.engine.sharding.rule.CollectPayOrderModuloShardingDatabaseAlgorithm
tableStrategy:
complex:
shardingColumns: pay_order_no,request_no
algorithmClassName: cn.carl.pay.engine.sharding.rule.CollectPayOrderModuloShardingTableAlgorithm
sharding-proxy 的分庫分表規則可以 sharding-proxy 官網配置手冊。因爲它的分片規則 demo 只是使用了 hint 分片,所以如果你遇到其它分片算法的話還需要參考 sharding-jdbc 官網配置手冊。
3.3 服務端配置
server.yml
authentication:
users:
root:
password: root
sharding:
password: sharding
props:
executor.size: 16
sql.show: true
通過 sharding proxy 對分庫分表的數據源進行代理之後,DBA 或者 測試人員連接代理服務器只會看到一個庫一張表了。
服務端配置同樣要參考 sharding-proxy 官方配置手冊。
3.4 本地啓動
本地啓動成功之後可以使用 navicat 連接服務器。
連接數據源發現只會存在一個庫一張表:
4、服務器啓動
其實服務器啓動和本地啓動類似,你可以把你本地啓動的 sharing-proxy 打包成 jar 文件然後通過 java -jar sharding-proxy.jar
啓動。
同時也可以使用 sharding-proxy 官方下載的壓縮包啓動,在 linux 上是以 shell 腳本啓動的。只需要把我們剛纔測試好的配置文件寫入到:
- 下載ShardingSphere-Proxy的最新發行版。
- 解壓縮後修改conf/server.yaml和以config-前綴開頭的文件,如:conf/config-xxx.yaml文件,進行分片規則、讀寫分離規則配置
- Linux操作系統請運行bin/start.sh,Windows操作系統請運行bin/start.bat啓動ShardingSphere-Proxy。如需配置啓動端口、配置文件位置
如果後端連接PostgreSQL數據庫,不需要引入額外依賴。
如果後端連接MySQL數據庫,需要將mysql-connector-java-5.1.47.jar拷貝到 {shardingsphere-proxy}\lib目錄。
如果算法類需要自己實現,也需要把算法類打成 jar 包拷貝到 {shardingsphere-proxy}\lib目錄。
啓動服務
使用默認配置項
${shardingsphere-proxy}\bin\start.sh
配置端口
${shardingsphere-proxy}\bin\start.sh ${port}
引用文章: