针对高并发场景,如何优化iPortal中信息存储?

作者:伯岁月

导语

项目 iPortal 门户产品 在高并发场景下,查看“服务访问统计”页面,出现了响应时间过长的情况。针对这个问题,我们应该如何分析和解决呢?

问题分析

我们 SuperMap iPortal 默认存放数据的数据库是 SQLite,它是一个轻量级的关系型数据库,它适合单体应用场景下的数据存储和查询,不支持高并发场景下的编辑和存储千万级别的数据。客户生产环境项目的 iPortal 服务和地图访问请求高频,导致iportal.db 数据库下日志表 proxyserviceaccessrecords 膨胀存储达到1.29+亿数据,单表大小达 126 GB,从而影响查询太慢导致了 iPortal 响应时间过长。

解决办法

1、首先解决响应时间过长的问题,需要先停止 iPortal 服务,将【iPortal 安装目录】/webapps/iportal/WEB-INF/iportaldata/iportal.db 文件拷贝一份,注意:如果不停止 iPortal 直接拷贝 iportal.db,由于db文件被服务进程占用,拷贝会导致数据库损坏无法使用。

(1)使用 Navicat 打开 iportal.db,找到 proxyserviceaccessrecords 表,先复制表(仅复制表结构),然后删除表 proxyserviceaccessrecords,将复制的表重命名为 proxyserviceaccessrecords 。

-- 注意不要用delete,一定要用drop命令,否则上亿条数据删除特别慢
DROP TABLE proxyserviceaccessrecords;

(2)执行 VACUUM 释放数据库空间,结果是 iportal.db 从126GB缩小到 8MB。

-- 使用VACUUM命令进行清理  
VACUUM;

2、响应时间过长的问题解决后,为了防止同样的问题发生,可以迁移 iPortal 数据库或者是升级 iPortal 版本

迁移

迁移 iPortal 存储的数据库,不将访问统计数据存在 SQLite 中,可以选择将其迁移到关系型数据库:MySQL、PostgreSQL、Oracle。下面将以 MySQL 为例,介绍如何迁移 iPortal 的数据库:

(1)迁移门户数据(门户数据存储于 iportal.db,iPortal 提供了迁移工具)

①修改配置【iPortal安装目录】/support/migration/config.properties 文件,按照示例配置MySQL数据库,停止运行 iPortal。

②运行【iPortal安装目录】/support/migration/migration.(bat|sh)。

③当脚本运行完成后修改【iPortal安装目录】/webapps/iportal/WEB-INF/iporatl.xml 修改 iportalConfig -> modulesConfig -> searchModuleConfig -> reindexAllResources 为 true 重新进行资源索引。

(2)迁移安全数据

①在MySQL中新建一个数据库,用于存储安全数据,如 security 数据库

②将旧版本的【iPortal安装目录】/webapps/iportal/WEB-INF/iserver-security.db 和 iserver-services.db 复制到新版本的同样位置。

③在【iPortal安装目录】/webapps/iportal/WEB-INF/iserver-system.xml 中,在 security 节点下添加以下代码配置安全数据库:

<storage  class="com.supermap.server.config.SQLSecurityInfoStorageSetting"> 
    <type>MYSQL</type>  
    <connInfo> 
     <username>root</username>  
     <password>root</password>  
     <dbType>MYSQL</dbType>  
     <driverClass>org.mariadb.jdbc.Driver</driverClass>  
     <jdbcUrl>jdbc:mysql://localhost:3306/security?useUnicode=true&amp;characterEncoding=UTF-8</jdbcUrl> 
     <maxPoolSize>30</maxPoolSize>  
     <initialPoolSize>5</initialPoolSize>  
     <minPoolSize>5</minPoolSize>  
     <maxIdleTime>3000</maxIdleTime>  
     <maxWait>300000</maxWait> 
    </connInfo>  
    <useStoredAdmin>false</useStoredAdmin> 
</storage>

④启动 iPortal,让 MySQL 中对应数据库中生成相关表。

⑤使用 Navicat 打开 MySQL 中 security、iserver-security.db 和 iserver-services.db,利用 Navicat 将 db 数据库表中的数据导出,再导入到 MySQL 的 security 中;

⑥完成安全数据的迁移

(3)迁移监控数据:

①在 MySQL 中新建一个数据库,用于存储监控数据,如 monitor 数据库

②将旧版本的【iPortal安装目录】/webapps/iportal/WEB-INF/iportaldata/monitor.db 复制到新版本的同样位置。

③在【iPortal安装目录】/webapps/iportal/WEB-INF/iportal-monitor.xml中,只需将 SQLite 数据库连接池配置信息注释掉或删除掉,将 MySQL 数据库连接池配置信息的注释符号去掉即可;

④启动 iPortal,让 MySQL 中对应数据库中生成相关表。

⑤使用Navicat,打开MySQL中 monitor 和 monitor.db,利用 Navicat 将 db 数据库表中的数据导出,再导入到 MySQL 的 monitor 中;

⑥完成安全数据的迁移

升级

使用更高版本的 iPortal (SuperMap iPortal 11i(2022) Service Pack 1 及以后版本)后,会优化数据的存储,有些的访问记录会存储到自带 ES 库里,提高统计查询效率。如何升级 iPortal,可以参考帮助文档(https://iportal.supermap.io/iportal/help/html/zh/index.htm,搜索“产品升级”)。

猜你喜欢

转载自blog.csdn.net/supermapsupport/article/details/132495551
今日推荐