跟我学ShardingSphere之ShardingProxy

ShardingProxy

定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持

前面我们学习了ShardingJDBC的分库分表用法,Sharding-JDBC的定位是客户端的一个jar包,集成到客户端去就可以进行数据库的连接和操作,而ShardingProxy的定位是一个数据库的代理端,所有访问数据库的操作都统一访问ShardingProxy,由ShardingProxy再根据分片算法操作对应的数据库和表,如下图

在这里插入图片描述

简单示例

1、先下载shardingProxy运行包

在这里插入图片描述

注意,这里下载的是tar.gz压缩包,这种格式的压缩文件需要在linux环境下进行解压,反正我在windows下使用WinRAR解压出现问题,可以正常解压,就是里面很多包有缺失,运行的时候会出问题,我是将压缩文件放到linux系统下解压后再拿回来的

2、修改配置文件

主要是修改server.yaml和config-×××.yaml文件

server.yaml

#权限配置
authentication:
  users:
    root:   # 自定义用户名
      password: root  # 自定义用户名密码
    sharding: # 自定义用户名
      password: sharding   # 自定义用户名
      authorizedSchemas: testdb    # 该用户授权可访问的数据库,多个用逗号分隔。缺省将拥有root权限,可访问全部数据库

props:
  max.connections.size.per.query: 1
  acceptor.size: 16  # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
  executor.size: 16  # Infinite by default.
  proxy.frontend.flush.threshold: 128  # The default value is 128.
    # LOCAL: Proxy will run with LOCAL transaction.
    # XA: Proxy will run with XA transaction.
    # BASE: Proxy will run with B.A.S.E transaction.
  proxy.transaction.type: LOCAL   #默认为LOCAL事务,允许LOCAL,XA,BASE三个值,XA采用Atomikos作为事务管理器,BASE类型需要拷贝实现ShardingTransactionManager的接口的jar包至lib目录中
  proxy.opentracing.enabled: false #是否开启链路追踪功能,默认为不开启。详情请参见[链路追踪](/cn/features/orchestration/apm/)
  proxy.hint.enabled: false
  query.with.cipher.column: true   #是否使用密文列查询
  sql.show: true
  allow.range.query.with.inline.sharding: false

config-sharding.yaml

schemaName: testdb
dataSources:
  testdb0:
    url: jdbc:mysql://localhost:3306/testdb0?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  testdb1:
    url: jdbc:mysql://localhost:3306/testdb1?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50

shardingRule:
  tables:
    tb_user:
      actualDataNodes: testdb$->{0..1}.tb_user
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: testdb$->{user_id % 2}

另外,如果你配置的数据源是mysql,需要把mysql的驱动包放到lib目录下

3、运行项目

Windows下运行bin目录下的start.bat文件,linux下运行start.sh

在这里插入图片描述

如上图所示说明已经启动成功,在启动日志中可以看到配置的分片策略,默认启动3307端口,也可以自定义端口

4、功能测试

ShardingProxy相当于一个数据库的代理层,统一受理应用的数据库访问请求,应用方可以不用关心数据库的存储,ShardingProxy可以根据路由策略将不同的请求路由到不同的库和表上

我们在testdb0、testdb1两个库中分别创建tb_user表,路由规则如下:

shardingRule:
  tables:
    tb_user:
      actualDataNodes: testdb$->{0..1}.tb_user
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: testdb$->{user_id % 2}
          

根据路由规则,会将user_id的奇偶分别命中到testdb0、testdb1两个数据库上,下面我们来测试一下

CREATE TABLE `tb_user` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(20) NOT NULL COMMENT '用户名称',
  `user_address` varchar(100) NOT NULL COMMENT '用户地址',
  `age` int(11) NOT NULL COMMENT '年龄',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户信息表';

在testdb0和testdb1分别创建tb_user表

在这里插入图片描述

现在通过ShardingProxy暴露出来的3307端口连上去,如下图看到的数据库名称是testdb,只有一张表tb_user

在这里插入图片描述

现在我们插入两笔数据

insert into tb_user(user_id,user_name,user_address,age) values(1,'张三','武汉市',20);
insert into tb_user(user_id,user_name,user_address,age) values(2,'李四','上海市',18);

可以查看在testdb0和testdb1两个库的tb_user表中各插入了一笔数据,说明ShardingProxy是通过我们配置的路由规则进行操作的

该如何选择

ShardingSphere提供了两种分库分表的方式,Sharding-JDBC集成在客户端,通过与应用程序共享资源的方式来实现分库分表,而Sharding-Proxy提供了统一的访问入口,可以让客户端像访问正常的数据库连接一样来访问Sharding-Proxy,对客户端屏蔽了分库分表的路由规则,那么我们在实际工作中该如何选择呢?小孩子才做选择,成年人都要!!!

在这里插入图片描述

如上图的混合架构,将ShardingJDBC和ShardingProxy结合起来使用

ShardingJDBC 采用无中心化架构,与应用程序共享资源,适用于 Java 开发的高性能的轻量级 OLTP 应用;

ShardingProxy 提供静态入口以及异构语言的支持,独立于应用程序部署,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。

通过混合使用 ShardingJDBC 和 ShardingProxy,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,使得架构师更加自由地调整适合与当前业务的最佳系统架构

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值