文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Sharding-Proxy基本功能用法介绍

2024-04-02 19:55

关注

Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端。作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置。它的整体架构图如下:

在架构图中,中间的蓝色方块就是我们的中间件Sharding-Proxy,下面连接的是数据库,我们可以配置每一个数据库的分片,还可以配置数据库的读写分离,影子库等等。上方则是我们的业务代码,他们统一连接Sharding-Proxy,就像直接连接数据库一样,而具体的数据插入哪一个数据库,则由Sharding-Proxy中的分片规则决定。再看看右侧,右侧是一些数据库的工具,比如:MySQL CLI,这是MySQL的命令行;Workbench是MySQL自己出的一个管理工具;还可以连接其他的工具,比如:Navicat,SQLYog等。最后再来看看左侧,是一个注册中心,目前支持最好的是Zookeeper,在注册中心中,我们可以统一配置分片规则,读写数据源等,而且是实时生效的,在管理多个Sharding-Proxy时,非常的方便。而官方也给我们提供了界面化的工具——ShardingSphere-UI,使用起来非常的方便。

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的配置目录,我们所有的数据源、分片规则、读写分离等都在此目录下配置。

[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可能会有一些位置的错误。

最后,我们执行bin目录下的start.sh就可以运行了。

 ./bin/start.sh

Sharding-Proxy默认的启动端口是3307,我们在连接的时候要格外注意一下。

server.yaml配置

下面我们看看server.yaml文件中,都具体配置哪些内容,我们用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

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

接下来再看看具体分片的配置,

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

整个的分片策略就配置完了,决定每条数据的具体分片由两个字段决定,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

这里只是单纯的配置主从读写分离数据源,如果要配置分片+读写分离,请参照前面的配置。

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

影子库的配置在我们压测中还是十分有用的,将测试数据和生产数据隔离开,不会影响到生产数据。

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

数据加密在实际的应用中还是比较多的。

总结

到此这篇关于Sharding-Proxy基本功能用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯