Apache service comb3.0 集成 Shardingsphere5.2.1以及华为gaussdb数据库

举报
troyxtroy 发表于 2024/12/23 11:41:05 2024/12/23
【摘要】 Apache service comb3.0 集成 Shardingsphere5.2.1以及华为gaussdb数据库, 并使用华为云CCE部署,完成鲲鹏、昇腾、欧拉、鸿蒙、高斯、云服务等与开源软件的适配开发。1.首先购买gaussDB 如下图所示,配置详情是gaussDB基础版,部署状态是1主1备1日志,其中主节点可读可写,备用节点只能读,是read-only模式,VPC网络选择之前已经购...

Apache service comb3.0 集成 Shardingsphere5.2.1以及华为gaussdb数据库, 并使用华为云CCE部署,完成鲲鹏、昇腾、欧拉、鸿蒙、高斯、云服务等与开源软件的适配开发。



1.首先购买gaussDB 如下图所示,配置详情是gaussDB基础版,部署状态是111日志,其中主节点可读可写,备用节点只能读,是read-only模式,VPC网络选择之前已经购买的default-vpc网络,费用先购买一个月。gaussDb数据库默认端口号为8000。       

2.购买一个弹性公网EIP方便本地连接gaussDb,这里购买了一个月的弹性公网IP,带宽大小为5M,接下来将弹性公网IP绑定之前购买的gauessDb。

3.将gaussDB的主节点绑定刚刚购买的弹性公网IP,备节点也能绑定公网IP,但是这里暂时不用绑定

4.使用navicator的工具使用弹性公网IP尝试连接华为云的gaussDB。

       


    5. 使用公网IP并未成功连接上gaussDB,这时候需要检测安全组是否放开了gaussDB的8000端口号。

       

         6. 针对本机IP放开8000端口号,只针对指定IP端放开端口号确保数据库的安全性。找到gaussdb的安全组配置信息,点击defualt到安全组的配置界面。用ipinfo查询本机的出口公网ip,在安全组针对公网ip的网段放行。

               

     7.再次连接发现已经可以连接上gaussDB。 

     

     8.authenticaiton数据库创建成功,gaussdb一个schema对应多个表,其他的数据库 一个就是一个schema

       

     9. 启动zookeeper注册中心,下载zookeeper 3.4.x 注册中心点击cmd 出现闪退问题,则在命令的结尾处加入pause 发现zookeeper目录不能设置中文,以及zookeeper依赖设置JAVA_HOME的环境变量。于是修改以上问题authentication-server启动成功。输入http://localhost:9090/ui/admin/ 可以跳入登录界面

     

     

     

  10.shardingshperestarter包加入到xml,这里需要注意shardingsphere5.3.X之后不提供springbootstarter,并且是以外部yml的方式引入分库分表的配置文件。

Shardingphere4.x与springboot3 并不兼容,目前使用的版本是 shardingphere 5.2.1,能与springboot3.x集成。警告如果是使用springboot3.x的版本需要使用shardingshphere5.x以上的版本才能适配。这里使用的数据库是gaussdb,所以添加的是gaussdb的驱动

    

      图片8.png

11. 由于5.2.xshardingphere最后一个使用starter方式的版本, 里面的yaml解析包如果使用5.2.x版本会报 org.yaml.snakeyaml.representer.Representer: method 'void <init>()' not found

的错误,原因是shardingphere 5.2.x调用了yaml解析的无参构造器,无参构造器在snake yaml 2.x的版本已经去除,解决方法有两个:一个是将项目中的snakeyaml的包版本改为1.x,如下

   

<dependency>
	<groupId>org.yaml</groupId>
	<artifactId>snakeyaml</artifactId>
	<version>1.33</version>
</dependency>

但是由于整个fence项目强依赖2.x版本,降级会导致项目启动发生怪异错误,所以该方法舍弃。第二种方案是将项目中填加带有无参构造器的Representer类,项目目录包名与该类所属包名一致。目前采用的是第二种方案

12.在springboot的yml文件中加入shardingsphere的配置,里面包括多个数据源的配置,以及分片规则的配置。

spring:
  shardingsphere:
    mode:
      type: Standalone
    datasource:
      names: db0, db1
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.opengauss.Driver
        url: ${DB_URL_ONE:jdbc:opengauss://113.45.162.168:8000/db0?currentSchema=public}
        username: ${DB_USERNAME:username}
        password: ${DB_PASSWORD:password}
        #初始连接数量
        initial-size: 20
        #最小连接数量
        min-idle: 20
        #最大连接数量
        max-active: 1000
        #获取连接等待超时的时间 单位是毫秒,这里配置60秒
        max-wait: 60000
        #查询超时时间 单位是毫秒 这里配置6秒,如果你查询数据量大的情况下这个配置的大一点,不然查询报错抛出异常
        query-timeout: 6000
        #事务发生回滚后多长时间响应用户单位是毫秒,这里这个时间和mysql的innodb_lock_wait_timeout是相加的关系,如果你在mysql配置文件配置了这个时间,那时间就会相加
        transaction-query-timeout: 2000
        #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒, 这里配置10分钟去检测一次是否存在空闲连接
        time-between-eviction-runs-millis: 600000
        #最大等待线程数量 这里配置50,当你的连接满了之后,其他的连接进入等待池子,最大的数量为50,超过这个数量的线程舍弃掉
        max-wait-thread-count: 50
        #最小连接时间,也就是说一条线程的空闲时间超过了这个数就会被关闭,这里的单位是毫秒,这里设置为10分钟
        min-evictable-idle-time-millis: 600000
        #最大连接时间,也就是说一条线程的空闲时间>最小连接时间,也>最大连接时间,直接关闭 这里设置为30分钟
        max-evictable-idle-time-millis: 1800000
        #申请连接时直接检测连接是否有效
        test-on-borrow: true
        #申请连接时检测空闲时间,根据空闲时间再检测连接是否有效
        test-while-idle: true
        #归还连接时检测连接是否有效,这个配置生产最好不要配置设置为ture,有性能问题
        test-on-return: true
        #初始连接失败是否抛出异常
        init-exception-throw: true
        #开启检查运行的状态
        check-execute-time: true
        #这里是健康检查sql语句,配合下面的使用
        validation-query: SELECT 1 FROM DUAL
        #多长时间进行一次心跳去检查是否连接了mysql,这里配置为30分钟
        validation-query-timeout: 1800000
        #连接出错后在尝试3次
        connection-error-retry-attempts: 3
        #数据库宕机后启用重连机制,true表示失败后立即断开,false表示失败后进行断线重连尝试,配合上面的重连次数
        break-after-acquire-failure: false
        #重连的间隔 单位毫秒 这里设置30分钟重连
        time-between-connect-error-millis: 1800000
        #开启保持连接有效性
        keep-alive: true
        #只有空闲时间大于keep-alive-between-time-millis并且小于min-evictable-idle-time-millis该参数才会有用,单位为毫秒 这里设置为15分钟
        #这个时间必须大于检测时间time-between-eviction-runs-millis
        keep-alive-between-time-millis: 900000
        #这个目前不知道做什么的,字面意思看是杀死什么时候的读的socket超时时间
        #kill-when-socket-read-timeout:
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.opengauss.Driver
        url: ${DB_URL_SECOND:jdbc:opengauss://113.45.162.168:8000/db1?currentSchema=public}
        username: ${DB_USERNAME:username}
        password: ${DB_PASSWORD:password}
        #初始连接数量
        initial-size: 20
        #最小连接数量
        min-idle: 20
        #最大连接数量
        max-active: 1000
        #获取连接等待超时的时间 单位是毫秒,这里配置60秒
        max-wait: 60000
        #查询超时时间 单位是毫秒 这里配置6秒,如果你查询数据量大的情况下这个配置的大一点,不然查询报错抛出异常
        query-timeout: 6000
        #事务发生回滚后多长时间响应用户单位是毫秒,这里这个时间和mysql的innodb_lock_wait_timeout是相加的关系,如果你在mysql配置文件配置了这个时间,那时间就会相加
        transaction-query-timeout: 2000
        #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒, 这里配置10分钟去检测一次是否存在空闲连接
        time-between-eviction-runs-millis: 600000
        #最大等待线程数量 这里配置50,当你的连接满了之后,其他的连接进入等待池子,最大的数量为50,超过这个数量的线程舍弃掉
        max-wait-thread-count: 50
        #最小连接时间,也就是说一条线程的空闲时间超过了这个数就会被关闭,这里的单位是毫秒,这里设置为10分钟
        min-evictable-idle-time-millis: 600000
        #最大连接时间,也就是说一条线程的空闲时间>最小连接时间,也>最大连接时间,直接关闭 这里设置为30分钟
        max-evictable-idle-time-millis: 1800000
        #申请连接时直接检测连接是否有效
        test-on-borrow: true
        #申请连接时检测空闲时间,根据空闲时间再检测连接是否有效
        test-while-idle: true
        #归还连接时检测连接是否有效,这个配置生产最好不要配置设置为ture,有性能问题
        test-on-return: true
        #初始连接失败是否抛出异常
        init-exception-throw: true
        #开启检查运行的状态
        check-execute-time: true
        #这里是健康检查sql语句,配合下面的使用
        validation-query: SELECT 1 FROM DUAL
        #多长时间进行一次心跳去检查是否连接了mysql,这里配置为30分钟
        validation-query-timeout: 1800000
        #连接出错后在尝试3次
        connection-error-retry-attempts: 3
        #数据库宕机后启用重连机制,true表示失败后立即断开,false表示失败后进行断线重连尝试,配合上面的重连次数
        break-after-acquire-failure: false
        #重连的间隔 单位毫秒 这里设置30分钟重连
        time-between-connect-error-millis: 1800000
        #开启保持连接有效性
        keep-alive: true
        #只有空闲时间大于keep-alive-between-time-millis并且小于min-evictable-idle-time-millis该参数才会有用,单位为毫秒 这里设置为15分钟
        #这个时间必须大于检测时间time-between-eviction-runs-millis
        keep-alive-between-time-millis: 900000
        #这个目前不知道做什么的,字面意思看是杀死什么时候的读的socket超时时间
        #kill-when-socket-read-timeout:
    props:
        # 日志显示 SQL
        sql-show: true


13.其中分片规则是以db0, db1为双数据源做分库,每个数据库分了2张表分别为cash_repay_apply_00,以及cash_repay_apply_01。分片的键使用了cash_repay_apply表的member_id字段,按member表id % 2的方式散列到不同的库中。分表的方式使用表数据库的主键id,使用id % 2的方式散列到不同的数据库中。

    rules:
      sharding:
        tables:
          cash_repay_apply:
            actualDataNodes: db$->{0..1}.cash_repay_apply_0$->{0..1}
            tableStrategy:
              standard:
                shardingColumn: id
                shardingAlgorithmName: t-user-inline
            keyGenerateStrategy:
              column: id
              keyGeneratorName: snowflake
            databaseStrategy:
              standard:
                shardingColumn: member_id
                shardingAlgorithmName: database-inline

        defaultShardingColumn: member_id
        bindingTables:
          - cash_repay_apply
        defaultDatabaseStrategy:
          standard:
            shardingColumn: member_id
            shardingAlgorithmName: database-inline
        defaultTableStrategy:
          none:

        shardingAlgorithms:
          database-inline:
            type: INLINE
            props:
              algorithm-expression: db$->{Long.parseLong(String.valueOf(member_id)) % 2}
          t-user-inline:
            type: INLINE
            props:
              algorithm-expression: cash_repay_apply_0$->{id % 2}

        keyGenerators:
          snowflake:
            type: SNOWFLAKE

   


14.在华为云的gaussdb中创建db0, db1 的数据库,并分别在两个数据库中创建cash_replay_apply_00的数据库和cash_replay_apply_01数据库。其中创建数据库的类型需要选择mysql。因为脚本执行的是mysql的语法。

     

     

DROP TABLE IF EXISTS `cash_repay_apply_00`;
CREATE TABLE `cash_repay_apply_00` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `member_id` varchar(50) NOT NULL,
  `repay_no` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


15.改造resource-server服务。在resource-server-api加入新的接口。以及新的实现,id的生成使用雪花算法。会员的id选择1-10的数字代表10个会员的信息。

 

   


16.在测试面板使用POST的方式调用接口/api/resource/v1/auth/handler/insertShardingCashApply可以看到数据库db0cash_repay_apply_00表和db1cash_repay_apply_00表分别都插入了会员的数据 7 % 2 = 1 到了db1库, 4 % 2 = 0 到了db0

     

   

   

16.将项目使用华为云的codeArs将应用打成容器,再用发布到CCE上。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。