在mongo中存储大量数据

问题描述 投票:0回答:1

我正在为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而不是涌入,看看它是否更好。

mongodb rrd bigdata nosql
1个回答
0
投票

每180秒更新15,000个客户端= ~83次插入/秒。即使对于中等大小的数据库服务器来说,这也不是一个巨大的负载,特别是考虑到您插入的记录非常小。

我认为MongoDB可以很好地处理这个负载(同样,老实说,几乎任何现代SQL DB都可能能够跟上它)。恕我直言,要考虑的关键点是:

  • 硬件:确保你有足够的RAM。这主要取决于您定义的索引数量以及您正在执行的查询数量。如果这主要是一个很少被读取的日志,那么您的工作集就不需要太多的RAM(尽管您的索引需要足够的内存)。但是,如果您还在运行查询,那么您将需要更多资源
  • 如果您正在运行大量查询,请考虑设置副本集。这样,您的主服务器可以保留用于写入数据,确保可靠性,而您的从服务器可以配置为在不影响写入可靠性的情况下为您的查询提供服务。
  • 关于数据结构,我认为这很好,但它实际上取决于你希望对它运行什么类型的查询。例如,如果大多数查询使用radiusId引用另一个表并为每个记录提取一堆数据,那么您可能需要考虑对某些数据进行非规范化。但同样,这实际上取决于您运行的查询。
  • 如果您真的担心可靠地管理写入负载,请考虑仅使用Mongo前端来管理写入,然后将数据转储到数据仓库后端以运行查询。您可以通过运行上面提到的副本集来部分执行此操作,但副本集的缺点是您无法重构数据。副本集的每个成员中的数据完全相同(因此名称,副本集:-)通常,写入数据的最佳结构(规范化,小记录)不是读取数据的最佳结构(非规范化,大型)记录包含您已经完成的所有信息和联接)。如果您正在运行一堆引用其他表的复杂查询,那么使用真正的数据仓库来查询部分可能会更好。
  • 随着写入负载的增加,您可以考虑分片。我假设RadiusId指向Radius服务器池中的每个特定服务器。您可能会对该密钥进行分片,这会根据发送数据的服务器来分割写入。因此,在增加radius服务器时,可以按比例增加mongo服务器以保持写入可靠性。但是,我认为您不需要立即执行此操作,因为我打赌一个合理配置的服务器应该能够管理您指定的负载。

无论如何,这些是我的初步建议。

© www.soinside.com 2019 - 2024. All rights reserved.