mongodb - 如何提高应用性能?[更新]
问题描述
为了让您了解数据:
DB 有一个集合/表,其中包含超过一亿个文档/记录,每个文档/记录包含 100 多个属性/列。预计数据量将很快增长数百倍。
对数据的操作:
对数据的操作主要有以下几种:
- 验证数据,然后将数据导入数据库,每天发生多次
- 对此导入数据的聚合
- 搜索/发现
- 更新
- 删除
使用的工具/软件:
- MongoDB for database:基于 PSS 架构的副本集、索引(大部分查询都是 INDEX 扫描)
- 使用 Koa.js 的 NodeJS
问题:
但是,该工具在聚合、查找等方面非常缓慢。
到目前为止,我为性能实施了什么?:
- 数据库索引
- 缓存
- 预聚合(使用 MongoDB 聚合预先聚合数据并在导入期间将其存储在不同的集合中,以避免在运行时聚合)
- 增加数据库服务器上的 RAM 和 CPU 内核
- NodeJS 服务器和前端构建的单独服务器
- PM2 管理 NodeJS 服务器应用程序和生成集群
但是根据我的经验,即使在实现了上述所有操作之后,应用程序的性能也不够。我觉得这样做的原因是数据非常庞大。我不知道如何管理大数据应用程序以提供高性能。请指教。
此外,技术的选择是否不合适,或者改变技术/工具会有帮助吗?如果是,在这种情况下有什么建议?
我请求您提供建议,以帮助我提高应用程序的性能。
解决方案
很难给出正确的答案,因为我们真的没有那么多细节。我要做的是详细的监控,至少如下:
机器等级:
- 监控数据库机器上的总体 CPU 负载(所有内核)和 RAM 使用情况
- 监控存储数据的磁盘上的磁盘 IO
- 这应该表明,如果机器规格是瓶颈
数据库和数据库进程级别(我的第一个猜测,这是关键部分):
- 目前您的数据的总体大小是多少(我知道,它会急剧增加,但如果它现在已经变慢,这可能是一个有趣的信息 - 特别是与当前 RAM 大小和 CPU 内核数量有关)
- 监视 mongo DB 进程的内存使用情况和 CPU 负载...
- 查看查询计划(在进行聚合时)是否指导您,可以进行哪些改进?
- 看看缓存策略。你使用什么策略?
- 这应该会给出更详细的结果,说明在数据库级别进行改进的地方。仅仅是因为硬件瓶颈还是聚合问题...
Node.JS 应用级别:
- node.js 应用程序:这个需要多少 RAM 和 CPU 使用量......?
- 如果 node.js 应用程序有多个实例,请跟踪所有实例
- 数据导入也是通过 nodejs 应用程序进行的。导入数据时应用程序的负载是否会急剧增加?
- 如果您发现此应用程序负载很高,需要在此处采取行动(增加实例,将其拆分为单独的应用程序(例如作为单独的应用程序导入)