- 一、ShardingProxy快速使用
- 1、ShardingProxy部署
- 2、ShardingProxy使用
- 3、ShardingProxy的服务治理
- 3.1 配置发布到zookeeper
- 4、Shardingproxy的其他功能
- 4.1 影子库
- 4.2 数据加密
- 4.3 主从配置
- 5、ShardingProxy的SPI扩展-主键生成
- 6、ShardingProxy-UI界面使用
- 二、ShardingSphere总结
- 三、与其他相关产品的对比
ShardingProxy的功能同样是分库分表,但是它是一个独立部署的服务端,提供统一的数据库代理服务。
注意,ShardingProxy目前只支持MySQL和PostgreSQL。并且,客户端连接ShardingProxy时,最好使用MySQL的JDBC客户端。下面我们来部署一个ShardingProxy服务。
1、ShardingProxy部署【注意】ShardingSphere是用java写的,所以环境需要安装JDK!
ShardingProxy在windows和Linux上提供了一套统一的部署发布包。我们可以从ShardingSphere官网下载4.1.1版本的ShardingProxy发布包apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz,解压到本地目录。
下载连接:https://archive.apache.org/dist/shardingsphere/
我们将下载后的zip包解压上传到linux服务器上,然后解压:
// yum install zip unzip unzip apache-shardingsphere-4.1.1-sharding-proxy-bin-test.zip // 重命名 mv ./apache-shardingsphere-4.1.1-sharding-proxy-bin ./sharding_proxy
解压完成之后,我们执行以下几个步骤来完成安装。
Step 1:
因为我们之前安装的mysql版本都是8.0.20,所以我们需要把MySQL的JDBC驱动包mysql-connector-java-8.0.20.jar手动复制到ShardingProxy的lib目录下。ShardingProxy默认只附带了PostgreSQL的JDBC驱动包,而不包含MySQL的JDBC驱动包。
注意,其实shardingproxy的lib包下是有一个自带的mysql驱动包的,我们上传完和自己版本复合的驱动包后,需要把自带的8.0.13的这个驱动包删除掉,否则后面启动proxy的时候会报错:
[root@localhost bin]# sh start.sh 3316 Starting the Sharding-Proxy ... The port is 3316 The classpath is /usr/software/sharding_sphere/sharding_proxy/conf:.:..:/usr/software/sharding_sphere/sharding_proxy/lib public class MyKeyGen implements ShardingKeyGenerator { private AtomicLong atomicLong = new AtomicLong(0); @Override public Comparable> generateKey() { // 可以使用redis生成, 这里为了简单, 我们使用当前时间 LocalDateTime dateTime = LocalDateTime.now(); String timeStamps = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(dateTime); // 为了保证再高并发的情况下不重复, 加一个原子类 return Long.parseLong("" + timeStamps + atomicLong.incrementAndGet()); } @Override public String getType() { return "MYKEY"; } @Override public Properties getProperties() { return null; } @Override public void setProperties(Properties properties) { } }
然后增加一个meta-INFservicesorg.apache.shardingsphere.spi.keygen.ShardingKeyGenerator文件:
com.jihu.sharding.spiextention.MyKeyGen
测试完成主键生成类可以正常工作之后,我们就需要将这个类打包成一个jar包。
我们需要将扩展类和这个SPI服务文件一起打成jar包,就可以直接放到ShardingProxy的lib目录下。
具体实现方式:
我们打开IDEA的project structure,再点击Artifacts,点击“+”,选择JAR==>Empty。
进入Artifacts界面后,name框中可以输入你的目的jar包的名称,也可以不动,系统默认是unnamed。后面的type选择框选择JAR;下面一行Output directory为jar包存放路径。在output Layout菜单下有加号,点击它,会出现几个下拉选项,选择File ,然后添加扩展类和SPI服务文件。如图所示
将文件添加完之后,找到idea第一行菜单的build,在下拉菜单中,选择Build Artfacts ,在弹出的框中选择build即可。
最后在输出路径下,找打的jar包。如下图
如果想改名可以直接rename。
然后我们可以直接将这个jar包放到ShardingProxy的lib目录下。
接下来就可以在config-sharding.yaml中以类似下面这种配置方式引入了。
【注意】配置之前注释掉zookeeper的配置。因为如果开启的话会从zk中读取配置,这样读取的是旧的配置。
shardingRule: tables: course: actualDataNodes: m1.course_$->{1..2} tableStrategy: inline: shardingColumn: cid algorithmexpression: course_$->{cid%2+1} keyGenerator: # type: SNOWFLAKE type: MYKEY # 自定义的主键生成器 column: cid
然后我们可以重新启动ShardingProxy,试试我们自定义的主键生成器。
mysql> select * from course; +---------------------+----------------+---------+---------+ | cid | cname | user_id | cstatus | +---------------------+----------------+---------+---------+ | 202109211007481711 | shardingsphere | 1000 | 1 | | 202109211007483972 | shardingsphere | 1001 | 1 | | 202109211007484223 | shardingsphere | 1002 | 1 | | 202109211007484494 | shardingsphere | 1003 | 1 | | 202109211007484735 | shardingsphere | 1004 | 1 | | 202109211007485046 | shardingsphere | 1005 | 1 | | 202109211007485677 | shardingsphere | 1006 | 1 | | 202109211007486008 | shardingsphere | 1007 | 1 | | 202109211007486669 | shardingsphere | 1008 | 1 | | 645951089950068736 | shardingsphere | 1000 | 1 | | 645951090923147264 | shardingsphere | 1002 | 1 | | 645951091007033344 | shardingsphere | 1004 | 1 | | 645951091099308032 | shardingsphere | 1006 | 1 | | 645951091187388416 | shardingsphere | 1008 | 1 | | 647705352472625152 | java2 | 1002 | 1 | | 647707283668598784 | test-key-gen1 | 9991 | 1 | | 2021092110074870210 | shardingsphere | 1009 | 1 | | 202109211007481711 | shardingsphere | 1000 | 1 | | 202109211007483972 | shardingsphere | 1001 | 1 | | 202109211007484223 | shardingsphere | 1002 | 1 | | 202109211007484494 | shardingsphere | 1003 | 1 | | 202109211007484735 | shardingsphere | 1004 | 1 | | 202109211007485046 | shardingsphere | 1005 | 1 | | 202109211007485677 | shardingsphere | 1006 | 1 | | 202109211007486008 | shardingsphere | 1007 | 1 | | 202109211007486669 | shardingsphere | 1008 | 1 | | 2021092110074870210 | shardingsphere | 1009 | 1 | +---------------------+----------------+---------+---------+ 27 rows in set (0.11 sec) mysql> insert into course(cname,user_id,cstatus) values ('test-key-gen2',9992,'2'); Query OK, 1 row affected (0.01 sec) mysql> insert into course(cname,user_id,cstatus) values ('test-key-gen3',9993,'3'); Query OK, 1 row affected (0.01 sec) mysql> select * from course; +---------------------+----------------+---------+---------+ | cid | cname | user_id | cstatus | +---------------------+----------------+---------+---------+ | 2009473292 | test-key-gen3 | 9993 | 3 | | 202109211007481711 | shardingsphere | 1000 | 1 | | 202109211007483972 | shardingsphere | 1001 | 1 | | 202109211007484223 | shardingsphere | 1002 | 1 | | 202109211007484494 | shardingsphere | 1003 | 1 | | 202109211007484735 | shardingsphere | 1004 | 1 | | 202109211007485046 | shardingsphere | 1005 | 1 | | 202109211007485677 | shardingsphere | 1006 | 1 | | 202109211007486008 | shardingsphere | 1007 | 1 | | 202109211007486669 | shardingsphere | 1008 | 1 | | 645951089950068736 | shardingsphere | 1000 | 1 | | 645951090923147264 | shardingsphere | 1002 | 1 | | 645951091007033344 | shardingsphere | 1004 | 1 | | 645951091099308032 | shardingsphere | 1006 | 1 | | 645951091187388416 | shardingsphere | 1008 | 1 | | 647705352472625152 | java2 | 1002 | 1 | | 647707283668598784 | test-key-gen1 | 9991 | 1 | | 2021092110074870210 | shardingsphere | 1009 | 1 | | 2007214401 | test-key-gen2 | 9992 | 2 | | 202109211007481711 | shardingsphere | 1000 | 1 | | 202109211007483972 | shardingsphere | 1001 | 1 | | 202109211007484223 | shardingsphere | 1002 | 1 | | 202109211007484494 | shardingsphere | 1003 | 1 | | 202109211007484735 | shardingsphere | 1004 | 1 | | 202109211007485046 | shardingsphere | 1005 | 1 | | 202109211007485677 | shardingsphere | 1006 | 1 | | 202109211007486008 | shardingsphere | 1007 | 1 | | 202109211007486669 | shardingsphere | 1008 | 1 | | 2021092110074870210 | shardingsphere | 1009 | 1 | +---------------------+----------------+---------+---------+ 29 rows in set (0.04 sec)
从结果可以看到,插入的两条记录,自动生成的CID分别为2007214401 、2009473292 。这样我们就很快的完成了一个自定义的主键生成策略。
【注意】在真实项目中我们不会这样使用。因为将整个项目都打成jar包,包含了太多无用的东西。在真实使用中,我们需要使用maven打包插件,只将主键生成类和创建的SPI扩展点的文件一起打包。
6、ShardingProxy-UI界面使用ShardingProxy-UI是一个springboot项目,下载之后运行即可。
1、下载
wget https://mirror.bit.edu.cn/apache/shardingsphere/shardingsphere-ui-4.1.0/apache-shardingsphere-4.1.0-shardingsphere-ui-bin.tar.gz
2、解压
tar -zxvf apache-shardingsphere-4.1.0-shardingsphere-ui-bin.tar.gz
3、修改名称
mv apache-shardingsphere-4.1.0-shardingsphere-ui-bin ./sharding_proxy_ui
4、查看配置文件
application.properties文件:
server.port=8088 user.admin.username=admin user.admin.password=admin
5、启动
sh start.sh
6、服务测试
启动后我们来访问:ip:8088
用户名密码默认都是admin。
可以添加注册中心:
还可以添加分配规则:
还在完善中,目前还不是很成熟…线上很少使用…
二、ShardingSphere总结我们现在已经学完了ShardingSphere除了Sharding-SideCar以外的所有产品了,整个sharding + proxy的所有这些功能,本质上其实都只解决了一个问题,就是单机数据库容量的问题。在软件层面对硬件资源进行管理,从而便于对数据库的横向扩展。
但是,我们也要意识到他带来的很多问题。
例如对业务的侵入大。业务系统写的SQL将不再是纯粹的能在服务器上运行的SQL了,对大量跨维度的JOIN、聚合、子查询、排序等功能在业务上很难进行验证。这必然会弱化数据库的功能。
并且,使用ShardingSphere管理后,数据库之间变成了结合非常紧密的依赖关系,对整个集群的扩容也会带来相当大的难度。
另外,ShardingSphere这种方式实际上将原本由业务管理SQL的工作方式,转化成了由业务管理逻辑SQL,而运维管理实际SQL的混合工作模式,再加上一大堆服务的引入,整个服务运维的维护工作量以及工作难度也上升了非常多。
当然,相信随着ShardingSphere后续版本的不断升级优化,这些问题都会得到不同程度的改善。
三、与其他相关产品的对比