在mongo

时间:2017-07-05 19:09:30

标签: mongodb rrd bigdata nosql

我正在为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 个答案:

答案 0 :(得分:0)

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

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

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

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