Sharding-Proxy是一個分佈式數據庫中間件,定位爲透明化的數據庫代理端。做爲開發人員能夠徹底把它當成數據庫,而它具體的分片規則在Sharding-Proxy中配置。它的總體架構圖以下:java
在架構圖中,中間的藍色方塊就是咱們的中間件Sharding-Proxy,下面鏈接的是數據庫,咱們能夠配置每個數據庫的分片,還能夠配置數據庫的讀寫分離,影子庫等等。上方則是咱們的業務代碼,他們統一鏈接Sharding-Proxy,就像直接鏈接數據庫同樣,而具體的數據插入哪個數據庫,則由Sharding-Proxy中的分片規則決定。再看看右側,右側是一些數據庫的工具,好比:MySQL CLI,這是MySQL的命令行;Workbench是MySQL本身出的一個管理工具;還能夠鏈接其餘的工具,好比:Navicat,SQLYog等。最後再來看看左側,是一個註冊中心,目前支持最好的是Zookeeper,在註冊中心中,咱們能夠統一配置分片規則,讀寫數據源等,並且是實時生效的,在管理多個Sharding-Proxy時,很是的方便。而官方也給咱們提供了界面化的工具——ShardingSphere-UI,使用起來很是的方便。mysql
咱們能夠在Sharding-Proxy官網上找的下載目錄,再找到Sharding-Proxy的下載連接,下載最新版本的二進制包。而後把二進制包(tar.gz)上傳到服務器的目錄中,這個目錄能夠自定義,/opt
或者/usr/local
均可以,而後解壓,命令以下:算法
tar -zxvf apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz
解壓後,進入到sharding-proxy的conf目錄,這個目錄sharding-proxy的配置目錄,咱們全部的數據源、分片規則、讀寫分離等都在此目錄下配置。sql
[root@centOS-1 conf]# ll 總用量 28 -rw-r--r--. 1 root root 3019 6月 4 15:24 config-encrypt.yaml -rw-r--r--. 1 root root 3633 7月 7 13:51 config-master_slave.yaml -rw-r--r--. 1 root root 2938 6月 4 15:24 config-shadow.yaml -rw-r--r--. 1 root root 5463 7月 7 14:08 config-sharding.yaml -rw-r--r--. 1 root root 1322 6月 4 15:24 logback.xml -rw-r--r--. 1 root root 2171 7月 7 15:19 server.yaml
這些配置咱們在後面會展開講。Sharding-Proxy默認支持的數據庫是PostgreSQL,而咱們大多數都是使用的MySQL,在這裏咱們的數據庫使用的是MySQL,咱們要將mysql-connector-java.jar這個jar包放入lib目錄,這裏推薦使用5.x版本的jar包,若是使用8.x可能會有一些位置的錯誤。shell
最後,咱們執行bin目錄下的start.sh就能夠運行了。數據庫
./bin/start.sh
Sharding-Proxy默認的啓動端口是3307,咱們在鏈接的時候要格外注意一下。apache
下面咱們看看server.yaml文件中,都具體配置哪些內容,咱們用vim打開文件,vim
vim server.yaml
文件的內容以下:數組
######################################################################################### # # If you want to configure orchestration, authorization and proxy properties, please refer to this file. # ######################################################################################### # #orchestration: # orchestration_ds: # orchestrationType: registry_center,config_center # instanceType: zookeeper # serverLists: 192.168.73.131:2181 # namespace: sharding-proxy # props: # overwrite: false # retryIntervalMilliseconds: 500 # timeToLiveSeconds: 60 # maxRetries: 3 # operationTimeoutMilliseconds: 500 authentication: users: root: password: root sharding: password: sharding authorizedSchemas: sharding_db
這個文件是Sharding-Proxy的核心的配置,全部的分片規則都在這個文件中配置,讓咱們一塊兒來看看吧,服務器
schemaName: sharding_db dataSources: ds_1: url: jdbc:mysql://192.168.73.132:3306/shard_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 master_ds: url: jdbc:mysql://192.168.73.131:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds_0: url: jdbc:mysql://192.168.73.130:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50
接下來再看看具體分片的配置,
shardingRule: masterSlaveRules: ds_0: masterDataSourceName: master_ds slaveDataSourceNames: - slave_ds_0 tables: t_order: actualDataNodes: ds_${0..1}.t_order_${1..2} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order_${order_id % 2 + 1} keyGenerator: type: SNOWFLAKE column: order_id t_order_item: actualDataNodes: ds_${0..1}.t_order_item_${1..2} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order_item_${order_id % 2 + 1} keyGenerator: type: SNOWFLAKE column: id defaultDatabaseStrategy: inline: shardingColumn: user_id algorithmExpression: ds_${user_id % 2} defaultTableStrategy: none: defaultDataSourceName: ds_0
ds_${user_id % 2}
,當user_id爲偶數時,數據源爲ds_0,也就是前面配置的讀寫分離數據源;而當user_id爲奇數時,數據源爲ds_1。若是咱們的表的分片規則中,沒有配置數據源的分片規則,將使用這個默認數據源的分片策略。整個的分片策略就配置完了,決定每條數據的具體分片由兩個字段決定,user_id決定數據分配到哪個數據源中,order_id決定數據分配到哪個表中。這就是分片+讀寫分離的配置,若是要進行更詳細的配置,能夠參考官方文檔,這裏不贅述了。
若是咱們只配置數據源的讀寫分離,而不進行分片配置,就須要參照這個配置文件進行配置了,雖然分片+讀寫分離的配置已經有了讀寫分離的配置,可是他倆之間仍是有一些細微的區別的,咱們來看看這個文件中的內容吧,
schemaName: master_slave_db dataSources: master_ds: url: jdbc:mysql://192.168.73.131:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds: url: jdbc:mysql://192.168.73.130:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds_1: url: jdbc:mysql://127.0.0.1:3306/demo_ds_slave_1?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 masterSlaveRule: name: ds_0 masterDataSourceName: master_ds slaveDataSourceNames: - slave_ds - slave_ds_1
這裏只是單純的配置主從讀寫分離數據源,若是要配置分片+讀寫分離,請參照前面的配置。
在如今微服務盛行的狀況下,系統被切分的很細,這對於測試,尤爲是壓測是很是難的,若是在測試環境部署一套和生產如出一轍的環境,是很是浪費資源的。而若是隻部署一兩個服務,又不能進行全鏈路的總體壓測。而咱們的解決方案是在生產環境直接進行壓測,得出的結果也是真實有效的。那麼這些壓測的數據怎麼辦,若是不作特殊的處理,就和生產的真實數據混在一塊兒了。
這裏咱們就須要配置影子數據庫了,全部壓測數據都會有一個特殊的標識,sharding-proxy根據這個特殊的標識,將壓測的數據分配到影子庫中,和生產的真實數據隔離開,咱們看看具體怎麼配置
schemaName: sharding_db dataSources: ds: url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 shadow_ds: url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 shadowRule: column: shadow shadowMappings: ds: shadow_ds
影子庫的配置在咱們壓測中仍是十分有用的,將測試數據和生產數據隔離開,不會影響到生產數據。
最後咱們再看看數據加密的配置,一些用戶的信息是不但願在數據庫中以明文存在的,好比:用戶的身份證號、銀行卡號。可是,在使用的時候,咱們還要把它解密回來。固然,咱們能夠在程序中,針對這些字段進行加解密,這裏呢,咱們看看Sharding-Proxy爲咱們提供的數據加密配置。咱們看一下配置文件,
schemaName: encrypt_db dataSource: url: jdbc:mysql://127.0.0.1:3306/demo_ds?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 encryptRule: encryptors: encryptor_aes: type: aes props: aes.key.value: 123456abc tables: t_card_no: columns: card_no: cipherColumn: card_no_cipher encryptor: encryptor_aes
數據加密在實際的應用中仍是比較多的。
這一篇咱們主要介紹了Sharding-Proxy的一些基本功能,下一篇將給你們shardingsphere-ui和註冊中心的應用。