0

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

应用程序写道:

我有 10'000 个记录器,对于我拥有的每个记录器:

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

数据量为:

  • 每个记录器每天 1 MB 或 9000 条消息

淘汰模式:

  • 数据必须在创建后 30 天由系统自动删除
  • 60% 的数据在 30 天前被其他系统获取,并将在获取时删除

该应用程序的内容如下:

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

平均值:

  • 我计算出数据存储的平均时间为 14 天,即每个记录器提供 40'000 条消息或 13MB
  • 数据库中存储的数据总量平均为130GB

我的问题:

  • 你会使用什么数据模型?
  • 你会使用多少个分片?

我考虑了以下数据模型:

  • 嵌入:每个记录器的一个文档,其中包含一组消息;由于文档增长时磁盘重定位而导致错误
  • 每个记录器的上限集合;不好,因为磁盘使用量大并且数据被覆盖之前的时间不精确
  • 静态数据的记录器集合以及使用 TTL 功能的消息的每个记录器集合;10'000个收藏可以吗?
  • 静态数据的记录器集合以及使用 TTL 和复合索引(包括车辆和消息 ID)的所有消息的单个集合;那个收藏不是很大吗?
  • 静态数据的记录器集合,包括带有 id 引用的预分配数组以及带有索引 id 的所有消息的集合;太复杂?

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

4

1 回答 1

1

你的第四个选项听起来最好。不用担心集合有多大,您只需要确保选择了正确的 shard key。

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

注意事项:

  • 如果您将记录器设为您的分片键,那么您最终会得到太大而无法拆分的块
  • 如果您将日期时间设置为您的分片键,那么由于您的共享键,您最终会分配不佳
  • 如果外部应用程序将通过消息 id 进行搜索,则将散列消息 id 设为您的分片键。这将确保良好的分布和可移动的块

不用担心有一个单独的静态数据集合。

就像我说的那样,设计它的关键是阐明外部系统如何准确地找到日志消息。

于 2013-08-15T02:22:39.777 回答