Apache ShardingSphere是一个分布式数据库生态系统,包含两大产品:ShardingSphere-Proxy和ShardingSphere-JDBC。
ShardingSphere-JDBC已经被广泛使用,但关于ShardingSphere-Proxy 5.5的使用教程却非常少。因此,本文将尝试带大家快速入门ShardingSphere-Proxy 5.5,理解其基本原理以及实战流程。
1 理解 Proxy 模式
ShardingSphere-Proxy定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。目前提供MySQL和PostgreSQL协议,透明化数据库操作,对DBA更加友好。
代理层介于应用程序与数据库间,每次请求都需要做一次转发,请求会存在额外的时延。这种方式对于应用非常友好,应用基本零改动,和语言无关,可以通过连接共享减少连接数消耗。
2 Proxy 模式 VS JDBC 模式
当我们在Proxy和JDBC两种模式选择时,可以参考下表对照:
JDBC | Proxy | |
---|---|---|
数据库 |
任意
|
MySQL/PostgreSQL |
连接消耗数 |
高
|
低 |
异构语言 |
仅Java
|
任意 |
性能 |
损耗低
|
损耗略高 |
无中心化 |
是
|
否 |
静态入口 |
无
|
有 |
ShardingSphere-Proxy提供静态入口以及异构语言的支持,独立于应用程序部署,适用于OLAP应用以及对分片数据库进行管理和运维的场景。ShardingSphere-JDBC采用无中心化架构,与应用程序共享资源,适用于Java开发的高性能的轻量级OLTP应用。在业务相对复杂的场景里,可以采用混合部署的模式。
3 快速启动
ShardingSphere-Proxy的启动方式有三种:二进制包、Docker和Helm,可以选择单机部署或集群部署。
本文将介绍如何通过单机二进制包方式启动ShardingSphere-Proxy版本号:v 5.5.0。
1、下载
访问下载页面,获取ShardingSphere-Proxy二进制安装包,解压缩的文件目录如下:
2、将MySQL的JDBC驱动复制到ext-lib目录
下载驱动mysql-connector-java-5.1.49.jar或者mysql-connector-java-8.0.11.jar放入lib包。
3、进入conf目录,内容如下图:
4、模式配置global.yaml
因为默认文件内容被注释掉了,所以去掉注释,如下图:
5、验证启动proxy服务
在Linux操作系统上,运行
bin/start.sh
;在Windows操作系统上,运行
bin/start.bat
,以启动ShardingSphere-Proxy。
然后使用MySQL终端命令连接ShardingSphere-Proxy服务端:
# 将 {xx} 替换为实际参数
mysql -h {ip} -u {username} -p{password} -P 3307
# 示例命令
mysql -h 127.0.0.1 -u root -proot -P 3307
4 配置订单分片策略
现在我们需要展示新的订单库(8个分片),需要修改分片策略。ShardingSphere-Proxy支持配置多个逻辑数据源,每个以
database-
前缀命名的YAML配置文件,即为一个逻辑数据源。
因为我们是自定义分片算法,shardingsphere内置算法并不满足,所以我们必须先编写自定义算法类。
1、实现
ShardingAlgorithm
接口定义的算法实现类HashSlotAlgorithm;
2、在项目
resources
目录下创建
META-INF/services
目录;
3、在
META-INF/services
目录下新建文件
org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
;
4、将实现类的全限定类名写入至文件
org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
;
5、将上述Java文件打包成jar包,将jar包拷贝至
ext-lib
目录;
6、配置分片文件database-myorder.yaml,该文件用来定义订单的4个分片的路由策略;
最后,我们启动Proxy服务,我们发现通过MySQL Client查询数据库时,出现了我们配置的订单库:myorder,以及订单库里的三个逻辑表。如下图:
4 Navicat连接shardingsphere proxy
通过shardingjdbc5-spring模块,插入多条记录到4个分片里,可以通过navicat连接proxy查看效果:
然后我们模拟在myorder逻辑数据库中新增一条订单记录,执行成功并且查询页正常的情况下,发现分片ds0中存储了刚插入的那条数据。
笔者将proxy算法模块也添加到了分库分表实战项目shardingsphere-jdbc-demo里,有兴趣的同学,可以看看这个项目。
Github地址:https://github.com/makemyownlife/shardingsphere-jdbc-demo