Apache service comb3.0 集成 Shardingsphere5.2.1以及华为gaussdb数据库
Apache service comb3.0 集成 Shardingsphere5.2.1以及华为gaussdb数据库, 并使用华为云CCE部署,完成鲲鹏、昇腾、欧拉、鸿蒙、高斯、云服务等与开源软件的适配开发。
1.首先购买gaussDB 如下图所示,配置详情是gaussDB基础版,部署状态是1主1备1日志,其中主节点可读可写,备用节点只能读,是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.将shardingshpere的starter包加入到xml,这里需要注意shardingsphere的5.3.X之后不提供springboot的starter,并且是以外部yml的方式引入分库分表的配置文件。
Shardingphere4.x与springboot3 并不兼容,目前使用的版本是 shardingphere 5.2.1,能与springboot3.x集成。警告如果是使用springboot3.x的版本需要使用shardingshphere5.x以上的版本才能适配。这里使用的数据库是gaussdb,所以添加的是gaussdb的驱动。
11. 由于5.2.x为shardingphere最后一个使用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可以看到数据库db0的cash_repay_apply_00表和db1的cash_repay_apply_00表分别都插入了会员的数据 7 % 2 = 1 到了db1库, 4 % 2 = 0 到了db0库。
16.将项目使用华为云的codeArs将应用打成容器,再用发布到CCE上。
- 点赞
- 收藏
- 关注作者
评论(0)