时间序列数据和MongoDB:第二部分

  • 时间:
  • 浏览:0
  • 来源:uu快3app_uu快3预测苹果

图5:PerSecond 和 PerMinute之间的索引大小(MB)比较

图6:稀疏数据的基于大小的分段

此方案中的最佳索引将在 {deviceid:1,sensorid:1,day:1,nsamples:1} 上。当亲戚亲戚朋友更新数据时,这个 天完整性匹配,这是超级高效的。查询时,亲戚亲戚朋友可还还能能 在单个字段上指定日期或日期范围,这也是有效的,后后 使用 UNIX 时间戳首先和最后另兩个进行过滤。请注意,亲戚亲戚朋友使用整数值。那先 实际上存储为 UNIX 时间戳,仅占用32位存储,而 ISODate占用64位。着实与 ISODate 相比这样显着的查询性能差异,但可能您计划最终获得数 TB的摄取数据后后 不需用存储小于一秒的粒度,则存储为UNIX时间戳可能会有点硬要。

图3:文档计数随时间的变化,比较每秒与每分钟下发

为了帮助说明下发和分组怎样影响性能,请考虑亲戚亲戚朋友要存储和分析历史股票价格数据的场景。亲戚亲戚朋友的样本股票价格生成器应用系统任务管理器每秒为其跟踪的给定数量的股票创建样本数据。一秒是本例中每个股票代码下发的最小数据时间间隔。可能您想在自己的环境中生成样本数据,可还还能能 在GitHub上使用StockGen工具。值得注意的是,尽管本文档中的样本数据使用了股票代码作为示例,但您可还还能能 将那先 相同的设计概念应用于任多会儿间序列场景,类式 物联网传感器的温度和湿度读数。

用于生成样本数据的 StockGen 工具将生成相同的数据并将其存储在另兩个不同的集合中:StockDocPerSecond

图6中显示了另兩个基于大小的示例存储桶。在此设计中,尝试将每个文档的插入限制为任意数量或特定时间段似乎很困难; 后后 ,使用 upsert 很容易,如下面的代码示例所示:

查询数据池中的数据

解决旧数据有多种依据,根据您的具体要求,一点依据可能比一点依据更适用。选者最符合您要求的产品。

可能不突然访问您的归档数据后后 查询性能不需用满足任何严格的延迟 SLA,请考虑使用 MongoDB Atlas 或 MongoDB OpsManager 的可查询备份功能备份数据。 可查询备份允许您连接到备份并向备份本身生活发出只读命令,而这样多再先恢复备份。

场景一:

当索引的大小超过托管 MongoDB 的服务器上的内存量时,请考虑水平扩展以扩展索引并加载多个服务器。

图4显示了每个集合的本身生活尺寸。系列中的第另兩个值是存储在磁盘上的集合的大小,而第兩个值是数据库中数据的大小。那先 数字不同,可能 MongoDB 的 WiredTiger 存储引擎支持静态数据压缩。从逻辑上讲,PerSecond 集合是305MB,但在磁盘上它占用大概 190 MB的存储空间。

本文分析了本身生活不同的模式设计,用于存储股票价格的时间序列数据。最终赢得此股票价格数据库的架构与否 您方案中最佳的架构?你爱不爱我。可能时间序列数据的性质和典型的数据快速提取,答案实际上可能是利用针对读取或写入几瓶用例的集合的组合。庆贺是,使用 MongoDB 灵活的架构,很容易进行更改。实际上,您可还还能能 运行另兩个不同版本的应用系统任务管理器,将另兩个不同的模式写入同另兩个集合。后后 ,无须等到查询性能后后 刚结束了了了受到影响还还能能 找到最佳设计,可能将现有文档的 TB 迁移到新架构可能需用时间和资源,并延迟应用系统任务管理器的未来版本。在进行最终设计后后 ,您应该进行实际测试。引用一句着名的谚语:“三思而后行”。

亲戚亲戚朋友应该永久存储所有数据吗?超过特定时间的数据对您的组织有用吗?旧数据应该怎样访问?它与否 可还还能能 在您需用时从备份中简单地恢复,还是需用在线后后 可还还能能 作为历史分析的活动存档实时访问用户?正如亲戚亲戚朋友在本系列博文的第1次责中所述,那先 是在上线后后 应该提出的一点难题。

比较后后 的场景时的关键点是,分段数据具有显着的优势。方案2中描述的基于时间的分段将整整一分钟的数据存储到单个文档中。在诸如 IoT 的基于时间的应用中,传感器数据可还还能能 以不规则的间隔生成,后后 一点传感器可还还能能 提供比一点传感器数据更多的数据。在那先 场景中,基于时间的分段可能完整性都在下发的最佳依据。另本身生活策略是基于大小的分组。

”中,介绍了时间序列数据的概念,后后 介绍了一点常见难题,可用于帮助下发时间序列应用系统任务管理器。那先 难题的答案能助 指导支持大批量生产应用系统任务管理器部署所需的架构和 MongoDB 数据库配置。现在,亲戚亲戚朋友将重点介绍本身生活不同的模式设计怎样影响读取,写入,更新和删除操作下的内存和磁盘利用率。0

预聚合

请注意,字段“p”蕴藏另兩个子文档,其中蕴藏每分钟的值。

时间序列应用系统任务管理器传统上捕获非常几瓶的数据,后后 只创建它们对应用系统任务管理器的查询模式有用的索引。

水平缩放

在线档案策略

您的应用系统任务管理器与否 真的需用为多年前生成的每个事件提供单个数据点?在大多数情况汇报下,保持这个 数据粒度的资源成本超过了还还能能 随时查询到这个 级别的好处。在大多数情况汇报下,可还还能能 预先聚合和存储数据以便快速查询。在亲戚亲戚朋友的股票示例中,亲戚亲戚朋友可能只想将每天的收盘价存储为值。在大多数体系特性中,预聚合值存储在单独的集合中,可能通常对历史数据的查询与实时查询不同。通常使用历史数据,查询会查找随时间推移的趋势与个别实时事件。通过将此数据存储在不同的集合中,您可还还能能 通过创建更高效的索引来提高性能,而完整性都在在实时数据之上创建更多索引。

主要提示:

场景二:

对数据存储的影响

通过数据库备份或 ETL 过程将数据克隆好友到归档存储库后,可还还能能 通过 remove话语从MongoDB集合中删除数据,如下所示:

图4:次责方案的数据大小和存储大小之间的比较

通过可查询备份访问存档数据

了解时间序列应用系统任务管理器的数据访问要求。

通过基于大小的分组,亲戚亲戚朋友根据一定数量的发射传感器事件或一整天(以先到者为准)围绕另兩个文档设计亲戚亲戚朋友的模式。

请务必注意,使用 remove 命令或 TTL 索引会原因分析分析高磁盘I / O。 在可能居于高负载的数据库上,这可能是不可取的。从实时数据库中删除记录的最有效和最快捷的依据是删除集合。可能您可还还能能 设计应用系统任务管理器,使每个集合代表一段时间,当您需用存档或删除数据时,您需用做的而是删除集合。这可能需用您的应用系统任务管理器代码中的一点查询还还能能 知道应该删除那先 集合。当您发出删除时,MongoDB 也需用从所有受影响的索引中删除数据,这可能需用一段时间,具体取决于数据和索引的大小。

这个 灵活性还允许您的数据模型随着时间的推移适应新的要求 - 类式 无须属于原始应用系统任务管理器设计的新硬件传感器捕获数据。那先 新传感器提供的元数据和属性与您在原始设计中使用的传感器不同。有了那先 灵活性,您可能会认为 MongoDB 数据库是无主之地,无论居于那先 事情,您都可还还能能 快速找到另兩个充满无组织数据的数据库。MongoDB通过模式验证提供尽可能多的控制,允许您完整性控制并强制执行诸如必填字段和可接受值范围类式 的事情,仅举几例。

考虑多个集合:另兩个集中于编写几瓶插入和最近的数据查询,曾经集合具有重叠在预聚合数据上的历史查询的分块数据。

在下一篇博客文章“ 使用 MongoDB 查询,分析和呈现时间序列数据 ”中,亲戚亲戚朋友将研究怎样有效地从MongoDB 中存储的时间序列数据中获取价值。

后后 的文章“

在这篇博文中,亲戚亲戚朋友将介绍各种下发配置。首先,每个数据样本存储另兩个文档,后后 使用每个时间序列时间范围的另兩个文档和每个固定大小的另兩个文档来存储数据。每个文档存储多个数据样本称为分组。这将在应用系统任务管理器级别实现,后后 不需用在 MongoDB 中专门配置任何内容。借助MongoDB 灵活的数据模型,您可还还能能 优化数据,从而为应用系统任务管理器的要求提供最佳性能和粒度。

选者数据到期的时间点以及要采取的操作,类式 归档或删除。

删除集合删除文档

图7:要换成到基于大小的存储桶的示例代码

离线档案策略

不推荐使用 MMAPV1 存储引擎,后后 请使用默认的 WiredTiger 存储引擎。请注意,可能您从几年前后后 刚结束了了了阅读较旧的下发最佳实践,则它们通常基于较旧的 MMAPV1 技术构建。

设计时间序列模式

怎样解决旧数据

一旦应用系统任务管理器在生产中生效后后 大小为 TB 级,从资源的深度1来看,任何重大变化都可能非常昂贵。考虑曾经本身生活情况汇报,即您拥有6 TB的 IoT 传感器数据,并以每秒十五万次插入的波特率单位次责新数据。读取的性能后后 刚结束了了了成为另兩个难题,您意识到您这样正确扩展数据库。除非您愿意停止应用,后后 此配置中的架构更改(类式 ,从原始数据存储迁移到分区存储)可能需用构建填充系统任务管理器,临时暂存区域和各种临时解决方案以将应用系统任务管理器移动到新的架构。文章的寓意是规划增长并正确设计适合您的应用系统任务管理器的 SLA 和要求的最佳时间序列模式。

场景三:

几瓶文档不仅会增加数据存储消耗,都在增加索引大小。在每个集合上创建了另兩个索引,并覆盖了符号和日期字段。与将自己定位为时间序列数据库的一点键值数据库不同,MongoDB提供了二级索引,使您可还还能能 灵活地访问数据并允许您优化应用系统任务管理器的查询性能。

分片存档数据

另兩个集合中每个集合中定义的索引的大小如图5所示。当索引和最近使用的文档适合由WiredTiger 缓存分配的内存(亲戚亲戚朋友称之为“工作集”)时,提供 MongoDB 的最佳性能。在亲戚亲戚朋友的例子中,亲戚亲戚朋友在4周内仅生成了5只股票的数据。鉴于这个 小测试用例,亲戚亲戚朋友的数据可能为 PerSecond 场景生成了另兩个大小为103MB的索引。请记住,有一点优化,如索引前缀压缩这能助 减少索引的内存占用。后后 ,即使使用那先 优化,正确的模式设计对于解决失控的索引大小都在点硬要。鉴于增长的轨迹,应用系统任务管理器需求的任何变化,类式 在亲戚亲戚朋友的示例场景中跟踪超过5种股票或超过4周的价格,将对内存施加更大的压力,并最终需用索引分页到磁盘。居于这个 情况汇报时,表现会降低。要缓解这个 情况汇报,请考虑水平扩展。

下发会影响资源。关于模式设计和索引,“三思而后行”。

归档数据和保持数据实时可访问的本身生活策略是使用分区分片来对数据进行分区。分片不仅能助 跨多个节点水平扩展数据,还可还还能能 标记分片范围,以便将数据分区固定到特定分片。节省成本的依据可能是将存档数据存储在运行成本较低的磁盘的分片上,并定期调整分片本身生活定义的时间范围。那先 范围将使平衡器自动在那先 存储层之间移动数据,为您提供分层的多维度存储。

和 StockDocPerMinute,每个集合蕴藏以下模式:

关键要点

对内存利用率的影响

在亲戚亲戚朋友的应用系统任务管理器中,最小级别的时间粒度是秒。如方案1中所述,每秒存储另兩个文档对于来自关系数据库背景的人来说是最舒适的模型概念。这是可能亲戚亲戚朋友每个数据点使用另兩个文档,类式 似于表格模式中每个数据点的行。如图3和图4所示,该设计将产生每单位时间最大数量的文档和集合大小。

固定大小的分段数据将产生非常类式 的数据库存储和索引改进,如在场景2中每次分段时所见。这是在 MongoDB 中存储稀疏的 IoT 数据的最有效依据之一。

在分析后后 结束了了了时,您可能会发现应用系统任务管理器的最佳模式设计可能正在利用模式设计的组合。按照亲戚亲戚朋友下面列出的建议,您将有另兩个良好的起点,为您的应用系统任务管理器开发设计最佳架构,并适当调整您的环境。

可能仍需用实时访问归档数据,请考虑那先 查询居于的频率以及仅存储预聚合结果与否 足够。

分段数据减少了索引大小,从而大大降低了硬件要求。

要查看基于大小的存储分区,请考虑存储传感器数据并将存储区大小限制为每个文档30个事件或一天(以先到者为准)的方案。注意:30限制是任意数字,可还还能能 根据需用进行更改,这样多再更改应用系统任务管理器或模式迁移。

设计架构比较

让亲戚亲戚朋友首先说,这样另兩个下发能适合所有的应用场景规范。无论哪种架构,都需用权衡利弊。理想情况汇报下,您希望在内存和磁盘利用率之间实现最佳平衡,以获得满足应用系统任务管理器要求的最佳读写性能,并使您还还能能 一齐支持数据读取和时间序列数据流分析。

当新的传感器数据进入时,它而是附加到文档,直到样本数达到30,后后 可能亲戚亲戚朋友的upsert:true子句而创建另兩个新文档。

可能可能,使用真实数据和实际应用系统任务管理器测试模式模式。

让亲戚亲戚朋友根据 StockGen 工具生成的4周数据,比较和对比存储大小和内存影响的数据库指标。在评估数据库性能时,衡量那先 指标非常有用。

归档数据时,与数据检索相关的 SLA 是那先 ?与否 恢复可接受的数据备份,可能数据与否 需用在线并准备好在任何给定时间查询?那先 难题的答案将能助 推动您的档案设计。可能您不需用实时访问归档数据,则可能需用考虑备份数据并将其从实时数据库中删除。可还还能能 使用 MongoDB Ops Manager备份生产数据库,可能可能使用 MongoDB Atlas 服务,则可还还能能 使用完整性托管的备份解决方案。

尽管TTL索引很方便,但请记住每分钟都在进行一次检查,后后 无法配置间隔。可能您需用更多控制以便在一天的特定时间内这样多再居于删除,则可能需用安排执行删除的批解决作业,而完整性都在使用TTL索引。

每分钟另兩个文档的基于时间的分段

每个数据点另兩个文档

图一:表示每秒另兩个文档粒度的示例文档

MongoDB 是本身生活廉价的解决方案,不仅适用于长期存档,也适用于您的数据池。投资Apache Spark 等技术的公司可还还能能 利用 MongoDB Spark Connector。此连接器将MongoDB 数据实现为 DataFrames 和 Datasets,以便与 Spark 和机器学习,图形,数据流和 SQL API 一齐使用。

使用 remove 话语删除文档

图2:表示一分钟粒度的示例文档

随着数据大小的增加,当达到 MongoDB 副本集中托管的主要 mongod 服务器的物理限制时,最终可能会水平扩展。

通过 MongoDB Sharding 水平扩展,可还还能能 提高性能,可能索引和数据将分布在多个MongoDB 节点上。查询不再针对特定的主节点。相反,它们由称为查询路由器(mongos)的上面服务解决,该服务将查询发送到蕴藏满足查询的数据的特定节点。这对应用系统任务管理器完整性透明 - MongoDB会解决所有路由。