作者:伯岁月
导语
项目 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&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,搜索“产品升级”)。