栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 前沿技术 > 大数据 > 大数据系统

ShardingProxy分库分表实战及同类产品选型对比

ShardingProxy分库分表实战及同类产品选型对比

文章目录
  • 一、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的功能同样是分库分表,但是它是一个独立部署的服务端,提供统一的数据库代理服务

注意,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后续版本的不断升级优化,这些问题都会得到不同程度的改善。

三、与其他相关产品的对比

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/280092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号