Sharding-Proxy的基本功能使用

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官網上找的下載目錄,再找到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
  • logback.xml是日誌的配置。
  • server.yaml是Sharding-Proxy的一些基礎配置,好比:帳號、密碼、註冊中心等。
  • 剩下的全部以config開頭的yaml文件,都是一個邏輯數據源,咱們能夠看到最多見的兩個config-sharding.yaml(分片的配置),config-master_slave.yaml(讀寫分離的配置)。注意,若是咱們要配置分片+讀寫分離,要不要在兩個配置文件中配置呢?不須要的,咱們只須要在config-sharding.yaml中配置就能夠了,若是要配置單獨的讀寫分離,則須要按照config-master_slave.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配置

下面咱們看看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
  • 其中,orchestration是鏈接zookeeper註冊中心,這裏咱們暫時用不到,將其註釋掉。
  • authentication中,配置的是用戶名和密碼,以及受權的數據庫,在這裏,咱們配置了兩個用戶,分別爲:root/root和sharding/sharding,其中root默認受權全部的數據庫,而sharding用戶則受權sharding_db數據庫。在這裏的數據庫(schema)是邏輯數據庫,在config-*.yaml中配置的。

config-sharding.yaml的配置

這個文件是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
  • 在這個配置文件中,總共分爲3個部分,咱們先看看前面2個部分。
  • schemaName:是邏輯數據庫的名稱,這裏咱們叫作sharding_db。在server.yaml文件中,受權的schema就是這裏的schemaName。
  • 第二部分是數據源,在dataSources裏邊,咱們配置了3個數據源。分別是ds_一、master_ds和slave_ds_0。咱們先來講一下數據庫的規劃吧,咱們的數據將經過user_id進行數據庫的分片,總共有2個分片,user_id尾數爲奇數的將分配到ds_1的數據庫中,user_id尾數爲偶數的,將分配到ds_0中,可是咱們的數據源中沒有ds_0呀,ds_0將由master_ds和slave_ds_0組成一個讀寫分離數據源。

接下來再看看具體分片的配置,

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
  • 分片的配置都在shardingRule下。
  • 在這裏咱們要配置讀寫分離主從數據源,在這裏咱們配置的是分片+讀寫分離,和單純的讀寫分離配置是不同的。讀寫分離的配置在masterSlaveRules下,咱們配置讀寫分離數據源ds_0,指定主庫的數據源masterDataSourceName爲master_ds,master_ds在上面的數據源中已經配置,而從數據源slaveDataSourceNames能夠配置多個,也就是一主多從的配置,咱們用數組的方式進行配置,- slave_ds_0指定從數據源爲slave_ds_0,若是有多個從數據源,能夠配置多個。
  • 咱們先跳過tables的配置,往下看,defaultDataSourceName,默認數據源,咱們指定ds_0。這個配置很是有用,在咱們的項目中,並非全部的表都要進行水平切分,只有數據量比較大的表纔會用到水平切分,好比:訂單表(t_order)和訂單明細表(t_order_item)。而其餘的表數據量沒有那麼大,單庫單表就能夠徹底支撐,這些表沒有分片規則,而咱們指定了默認的數據源,當咱們操做這些沒有分片規則的表時,都統一使用默認的數據源。
  • defaultTableStrategy,默認表的分片規則,這裏咱們配置的是none,沒有。也就是說全部的分片表都要配置表的分片規則。
  • defaultDatabaseStrategy,默認數據庫的分片規則,這裏咱們配置它的規則爲行內表達式,分片字段爲user_id,規則爲ds_${user_id % 2},當user_id爲偶數時,數據源爲ds_0,也就是前面配置的讀寫分離數據源;而當user_id爲奇數時,數據源爲ds_1。若是咱們的表的分片規則中,沒有配置數據源的分片規則,將使用這個默認數據源的分片策略。
  • 最後再來看看tables的配置,這裏配置的是分片表的規則,咱們配置兩個表,t_order和t_order_item。每一個分片表都由3部分組成。首先,actualDataNodes,實際的數據節點,這個節點是在MySQL中真實存在的,以t_order的配置爲例,ds_${0..1}.t_order_${1..2},說明t_order的數據節點有4個,分表爲ds_0.t_order_一、ds_0.t_order_二、ds_1.t_order_1和ds_1.t_order_2。再來看錶的分片規則,tableStrategy,它的規則也是用行內表達式配置的,分片字段爲order_id,規則爲t_order_${order_id % 2 + 1},當order_id爲奇數時,數據會分配到表t_order_1中;當order_id爲偶數時,會分配到表t_order_2中。

整個的分片策略就配置完了,決定每條數據的具體分片由兩個字段決定,user_id決定數據分配到哪個數據源中,order_id決定數據分配到哪個表中。這就是分片+讀寫分離的配置,若是要進行更詳細的配置,能夠參考官方文檔,這裏不贅述了。

config-master_slave.yaml的配置

若是咱們只配置數據源的讀寫分離,而不進行分片配置,就須要參照這個配置文件進行配置了,雖然分片+讀寫分離的配置已經有了讀寫分離的配置,可是他倆之間仍是有一些細微的區別的,咱們來看看這個文件中的內容吧,

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
  • 首先,咱們仍是定義邏輯數據庫的名稱,schemaName: master_slave_db,叫作master_slave_db。
  • 而後在dataSources中定義數據源,這些配置的結構是通用,和前面沒有區別,咱們配置了3個數據源,一主兩從,master_ds(主)、slave_ds(從)和slave_ds_1(從)。
  • 最後就是主從的規則masterSlaveRule,在前面分片+讀寫分離的配置中,叫作masterSlaveRules,複數形式。說明在單獨的讀寫分離配置中,只能配置一個主從數據源。主從數據源的名字叫作ds_0,主數據源masterDataSourceName是master_ds,從數據源slaveDataSourceNames配置了兩個,slave_ds和slave_ds_1。

這裏只是單純的配置主從讀寫分離數據源,若是要配置分片+讀寫分離,請參照前面的配置。

config-shadow.yaml影子庫配置

在如今微服務盛行的狀況下,系統被切分的很細,這對於測試,尤爲是壓測是很是難的,若是在測試環境部署一套和生產如出一轍的環境,是很是浪費資源的。而若是隻部署一兩個服務,又不能進行全鏈路的總體壓測。而咱們的解決方案是在生產環境直接進行壓測,得出的結果也是真實有效的。那麼這些壓測的數據怎麼辦,若是不作特殊的處理,就和生產的真實數據混在一塊兒了。

這裏咱們就須要配置影子數據庫了,全部壓測數據都會有一個特殊的標識,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
  • 前面仍是邏輯數據庫的名稱和數據源的配置。在數據源咱們配置了兩個,一個是真實的數據庫ds,另外一個是影子庫shadow_ds,全部壓測的數據都會分配的影子庫中。
  • shadowRule中配置影子庫的規則,column,影子庫字段標識,全部壓測數據,在程序中,將此字段設置爲true。shadowMappings是主庫和影子庫的映射關係,ds數據庫的影子庫是shadow_ds。

影子庫的配置在咱們壓測中仍是十分有用的,將測試數據和生產數據隔離開,不會影響到生產數據。

config-encrypt.yaml數據加密配置

最後咱們再看看數據加密的配置,一些用戶的信息是不但願在數據庫中以明文存在的,好比:用戶的身份證號、銀行卡號。可是,在使用的時候,咱們還要把它解密回來。固然,咱們能夠在程序中,針對這些字段進行加解密,這裏呢,咱們看看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
  • 邏輯庫與數據源的配置略過。
  • 在加密規則encryptRule中,咱們先定義加密算法,encryptor_aes,它的類型是aes,key是123456abc,這個key咱們能夠修改,可是一旦用這個key產生數據,就不要再改了,若是改了,舊數據就不能正確的解密了。
  • 而後在tables中定義加密數據的表t_card_no,加密的列爲card_no,這個列是邏輯列,在表中不是真實存在的,當你的sql中不管查詢、插入,出現這個字段,都會進行加密處理。而cipherColumn是加密後存儲數據的列,encryptor則是加密的規則。例如,咱們執行insert into t_card_no (card_no) values ('123456'),card_no列在表t_card_no中並不存在,t_card_no中存在的是card_no_cipher列,咱們執行成功後,card_no_cipher列存的是密文數據;當咱們執行select card_no from t_card_no 時,雖然表t_card_no沒有card_no 列,可是能夠將card_no_cipher列解密,card_no 顯示解密後的值。

數據加密在實際的應用中仍是比較多的。

總結

這一篇咱們主要介紹了Sharding-Proxy的一些基本功能,下一篇將給你們shardingsphere-ui和註冊中心的應用。

相關文章
相關標籤/搜索