在mongo中存储大量数据
Posted
技术标签:
【中文标题】在mongo中存储大量数据【英文标题】:storing huge amounts of data in mongo 【发布时间】:2017-07-05 19:09:29 【问题描述】:我正在为 radius 服务器开发前端系统。
radius 服务器将每 180 秒将更新传递给系统。这意味着,如果我有大约 15,000 个客户,那么每天将有大约 7,200,000 个条目......这是很多。
我试图了解存储和检索这些数据的最佳方式是什么。显然,随着时间的推移,这将变得很重要。 MongoDB会处理这个吗?典型的文档不多,东西这个
id: 1
radiusId: uniqueId
start: 2017-01-01 14:23:23
upload: 102323
download: 1231556
但是,会有很多这样的记录。我想这类似于 SNMP NMS 服务器处理数据的方式,据我所知,他们使用 RRD 来执行此操作。
目前在我的测试中,我只是将每个文档推送到一个集合中。所以我问,
A) Mongo 是适合这项工作的工具吗? B) 是否有更好/更优选/更优化的数据存储方式
编辑:
好的,万一有人遇到这个需要帮助。
我在mongo中运行了一段时间,对性能真的不满意。我们可以将其归结为我正在运行的硬件,也许是我的知识水平或我正在使用的框架。但是,我找到了一个非常适合我的解决方案。 InfluxDB 几乎可以直接处理所有这些,它是一个时间序列数据库,它实际上是我试图存储的数据 (https://github.com/influxdata/influxdb)。对我来说,表现就像白天和黑夜。再说一次,可能都是我的错,只是更新这个。
编辑 2:
所以过了一段时间,我想我明白了为什么我从来没有得到我想要的 Mongo 性能。我使用sailsjs 作为框架,它使用正则表达式按id 搜索,这显然对性能有很大影响。我最终会尝试迁移回 Mongo 而不是涌入,看看会不会更好。
【问题讨论】:
您能否分享一下您想要存储的数据量。另外请分享一下,如果您在特定时间后不再需要该数据,是否需要自动清除功能? 【参考方案1】:每 180 秒更新 15,000 个客户端 = ~83 次插入/秒。即使对于中等大小的数据库服务器,这也不是一个巨大的负载,尤其是考虑到您要插入的记录非常小。
我认为 MongoDB 可以很好地处理这种负载(老实说,几乎任何现代 SQL DB 都可能能够跟上)。恕我直言,要考虑的关键点是:
硬件:确保您有足够的 RAM。这主要取决于您定义了多少索引,以及您正在执行多少查询。如果这主要是一个很少被读取的日志,那么您的工作集将不需要太多 RAM(尽管您的索引需要足够的 RAM)。但是,如果您还要运行查询,那么您将需要更多资源 如果您正在运行大量查询,请考虑设置副本集。这样,您的主服务器可以保留用于写入数据,确保可靠性,而您的从服务器可以配置为在不影响写入可靠性的情况下为您的查询提供服务。 关于数据结构,我认为这很好,但这实际上取决于您希望针对它运行什么类型的查询。例如,如果大多数查询使用 radiusId 来引用另一个表并为每条记录提取一堆数据,那么您可能需要考虑对其中的一些数据进行非规范化。但同样,这实际上取决于您运行的查询。 如果您真的关心可靠地管理写入负载,请考虑仅使用 Mongo 前端来管理写入,然后将数据转储到数据仓库后端以运行查询。您可以通过运行我上面提到的副本集来部分地做到这一点,但副本集的缺点是您无法重组数据。副本集中每个成员中的数据完全相同(因此名称为副本集 :-) 通常,写入数据的最佳结构(规范化、小记录)并不是最佳结构用于读取数据(非规范化的大型记录,包含您需要完成的所有信息和连接)。如果您正在运行一堆引用其他表的复杂查询,那么在查询部分使用真正的数据仓库可能会更好。 随着写入负载的增加,您可以考虑分片。我假设 RadiusId 指向 Radius 服务器池中的每个特定服务器。您可能会对该密钥进行分片,这将根据哪个服务器发送数据来拆分写入。因此,随着您增加 radius 服务器,您可以按比例增加 mongo 服务器以保持写入可靠性。但是,我认为您不需要立即执行此操作,因为我敢打赌,一台配置合理的服务器应该能够管理您指定的负载。无论如何,这些都是我的初步建议。
【讨论】:
以上是关于在mongo中存储大量数据的主要内容,如果未能解决你的问题,请参考以下文章
如果已经使用 Hadoop,HBase 或 Mongo 用于分析数据库?