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天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您