数据库中间件ShardingSphere-ShardingProxy使用(一)数据分片、读写分离

数据库中间件ShardingSphere-ShardingProxy使用(一)数据分片、读写分离

背景

数据库中间件ShardingSphere-ShardingJdbc使用(一)数据分片中介绍了数据库中间件的两种代理方式,客户端代理(即数据源代理),服务端代理(代理数据库实例)。

而ShardingJdbc属于数据源代理,目前只有Java语言可用。实际情况中,一个庞大的系统架构,不可能只使用一种语言,Java、C、C++、php、Python等等,都可能会访问数据库,如果对应的数据库都存在分库、分表的情况。如何让其他语言的业务开发同学也享受到不用关心底层分库分表的逻辑就可以开发的福利呢?ShardingProxy的就出现了。

ShardingProxy也就是逻辑上的数据库实例,它背后管理着N个真实的实例

下载/配置

ShardnigSphere官网中,可以下载对应的ShardingProxy版本。下载对应的tar.gz文件

  1. 解压

    tar -xvf apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz
    
  2. 修改config-配置,进入conf文件下,选择conf-sharding.yaml文件

    • 配置数据分片

      schemaName: sharding_db
      
      dataSources:
        # 主库1
       ds0:
          url: jdbc:mysql://localhost:3306/dhb?serverTimezone=UTC
          password: 12345
          username: root
      # 主库1的从库1
       ds0-slave0:
         url: jdbc:mysql://localhost:3307/dhb?serverTimezone=UTC
         password: 12345
         username: root
       # 主库1的从库2
       ds0-slave1:
         url: jdbc:mysql://localhost:3308/dhb?serverTimezone=UTC
         password: 12345
         username: root
        # 主库2
       ds1:
         url: jdbc:mysql://localhost:3310/dhb?serverTimezone=UTC
         password: 12345
         username: root
      # 数据分片配置
      shardingRule:
         # 默认分库策略
         defaultDatabaseStrategy:
           inline:
             shardingColumn: id
             algorithmExpression: ds$->{id % 2}
         # 默认分表策略
         defaultTableStrategy:
           inline:
             shardingColumn: age
             algorithmExpression: user_$->{age % 2}
         # 数据节点
         tables:
           user:
             actualDataNodes: ds$->{0..1}.user_$->{0..1}
         # 默认数据库
         defaultDataSourceName: ds0
      
    • 配置读写分离

      注意:ShardingProxy每一个config-的文件都是一个数据源,所以这里我们只使用一个数据源,在这个数据源中完成数据分片、读写分离等。官方默认带了4个config-配置文件。可根据需要,自行使用。

      同时注意:在一个配置文件里,masterSlaveRules要放在shardingRule的下一级。

      # 读写分离配置---start
      masterSlaveRules:
        ds0:
           masterDataSourceName: ds0
           slaveDataSourceNames: 
            - ds0-slave0
            - ds0-slave1
           #从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM。
           #若`load-balance-algorithm-class-name`存在则忽略该配置
           loadBalanceAlgorithmType: ROUND_ROBIN
           #从库负载均衡算法类名称。该类需实现MasterSlaveLoadBalanceAlgorithm接口且提供无参数构造器
           #load-balance-algorithm-class-name=
      # 读写分离配置---end
      
  3. 修改server配置文件,authentication相当于为逻辑上的数据库实例设置用户、密码。可配置多个。将SQL打印放开,以便稍后验证配置是否正确

    authentication:
     users:
       root:
         password: 123456
       sharding:
         password: 123456 
         authorizedSchemas: sharding_db
    props:
     sql.show: true
    
  4. 进入bin文件夹下启动,使用13306启动proxy

    start.sh 13306
    
  5. 进入log文件夹下查看有无报错

  6. 使用Navicat新建连接13306。此时ShardingProxy帮我们管理4个真实的MySQL实例,分别为主库1-3306,主库2-3310,主库1的从库1-3307,主库1的从库2-3308.
    在这里插入图片描述
    连接成功之后查看,数据库,数据表
    在这里插入图片描述
    可以看到,这里所有的user_N的表都展示位一张user表了。

代码中使用

以上配置好了以后,在实际代码中,不再去连接物理的MySQL实例,而是连接此时启动的逻辑上的MySQL实例,proxy 13306。

此时在程序中配置数据源,这里连接的是逻辑的数据库实例

spring:
  application:
    name: mybatis-demo
  datasource:
    url: jdbc:mysql://localhost:13306/sharding_db?serverTimezone=UTC
    username: sharding
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  1. 验证ShardingProxy配置是否成功

    • 查询数据,正常情况会在3307、3308之间进行轮询查询,因为配置了读写分离
      在这里插入图片描述
      根据日志,查看确实是在两个从库之间轮询查询。

    • 插入数据
      在这里插入图片描述

        • 根据id对2求余,定位到主库2上,根据age对库求余,定位到user_1表上

注意事项

  1. 如果程序中使用的mysql-connector连接是MySQL8.0的,那么也要讲ShardingProxy下的lib文件夹中加入mysql-connector8.0的jar包

  2. 如果加入了上述jar包之后还是存在问题,那么检查proxy的版本是多少,4.0.0的话肯定是不行的,目前,社区在4.1.1中已经修复了这个bug,可升级到4.1.1。下载地址相关issue,相关PR.

    发布截图如下
    在这里插入图片描述

总结

  1. ShardingProxy不仅支持了多种语言,而且对于程序配置而言,仅仅配置一个逻辑上的数据库实例即可
  2. 对于DBA来说,减轻了不少压力,不会再根据分库分表规则,算完了之后再去查数据了
  3. 欢迎大家多多参与ShardingSphere的社区建设,与社区一起成长。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值