Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于监控/记录应用程序的mongodb数据模型,具有10';2000名伐木工人_Mongodb_Database Design_Data Modeling - Fatal编程技术网

用于监控/记录应用程序的mongodb数据模型,具有10';2000名伐木工人

用于监控/记录应用程序的mongodb数据模型,具有10';2000名伐木工人,mongodb,database-design,data-modeling,Mongodb,Database Design,Data Modeling,我正在为使用MongoDB存储的监控/日志应用程序定义数据模型。由于我是MongoDB的新手,希望您能给我一些建议 应用程序的写入: 我有10000名记录器,对于每个记录器,我有: 不随时间变化的静态数据(每个记录器有几千字节) 我必须记录每几秒钟从每个记录器连续输入的数据 数据量为: 每个记录器每天1 MB或9000条消息 消除模式: 数据必须在创建30天后由系统自动删除 60%的数据在30天之前由其他系统获取,并将在获取时删除 该应用程序的内容如下: 如果数据被读取,则会立即删

我正在为使用MongoDB存储的监控/日志应用程序定义数据模型。由于我是MongoDB的新手,希望您能给我一些建议

应用程序的写入:

我有10000名记录器,对于每个记录器,我有:

  • 不随时间变化的静态数据(每个记录器有几千字节)
  • 我必须记录每几秒钟从每个记录器连续输入的数据
数据量为:

  • 每个记录器每天1 MB或9000条消息
消除模式:

  • 数据必须在创建30天后由系统自动删除
  • 60%的数据在30天之前由其他系统获取,并将在获取时删除
该应用程序的内容如下:

  • 如果数据被读取,则会立即删除所有消息,从而导致从系统中删除这些消息
  • 数据最快在创建后1小时读取,最晚在创建后30天读取。平均14天
平均数:

  • 我计算出数据存储的平均时间是14天,这会产生40000条消息或每个记录器13MB
  • 数据库中存储的数据总量平均为130GB
我的问题是:

  • 您将使用什么数据模型
  • 你会使用多少碎片
我考虑了以下数据模型:

  • 嵌入式:每个记录器的一个文档,包含一组消息;错误,因为文档增长时磁盘重新定位
  • 每个记录器的上限集合;坏的,因为磁盘使用量大,数据被覆盖之前的时间不精确
  • 静态数据记录器的集合,以及使用TTL功能的消息记录器的集合;一万件收藏品行吗
  • 静态数据记录器的集合,以及使用TTL和复合索引(包括车辆和消息ID)的所有消息的单一集合;那不是真的很大吗
  • 用于静态数据的记录器的集合,包括具有id引用的预分配数组,以及用于具有索引id的所有消息的集合;太复杂了

您可以自由提出其他数据模型

您的第四个选项听起来最好。不必担心集合有多大,只需确保选择了正确的碎片键即可

在这种情况下,选择一个好的碎片的关键将取决于如何实际找到消息。您是否有消息id,而读取它们的外部应用程序只是查询id?或者你正在对这些信息进行全文搜索?外部应用程序是否知道创建消息的记录器和日期时间

考虑事项:

  • 如果您将记录器设置为您的切分键,那么您将得到太大而无法分割的块
  • 如果您将datetime设置为您的共享密钥,那么由于共享密钥的原因,您最终将无法进行良好的分发
  • 如果外部应用程序将按消息id进行搜索,则将哈希消息id设置为您的分片密钥。这将确保良好的分布和可移动块
不要担心静态数据有一个单独的集合


正如我所说的,设计此日志的关键在于明确外部系统如何准确地找到日志消息。

根据每个记录器一次获取所有消息。外部应用程序在查询中放入的唯一内容是记录器id。db将对此记录器的所有消息进行响应。loggers id是每条消息的一部分。mongodb手册说拥有大量集合是有益的:我的情况不是这样吗?你可以绕过集合范围的锁,通过拥有大量集合来提高吞吐量;您的权衡是增加空间开销。在这一点上,您可能需要做一些测试,在决定任何体系结构时都应该这样做。把事情都安排好,然后投入生产负荷。看哪一个摔倒了。这在很大程度上取决于你的硬件。如果你决定走分片路线,那么你将不得不去分散-聚集。正如我提到的,使用logger ID作为shard键将导致过大的块,因此您可以使用创建日期的散列,并确保logger ID上有索引