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

  • 时间:
  • 浏览:3
  • 来源:UU直播快三官方_大发UU直播快3

让当当我们首先说,没二个分发能适合所有的应用场景规范。无论哪种架构,都都要权衡利弊。理想情况汇报下,您希望在内存和磁盘利用率之间实现最佳平衡,以获得满足应用守护任务管理器要求的最佳读写性能,并使您要能共同支持数据读取和时间序列数据流分析。

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

场景一:

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

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

不推荐使用 MMAPV1 存储引擎,假使 请使用默认的 WiredTiger 存储引擎。请注意,原困您从几年前现在现在结束阅读较旧的分发最佳实践,则它们通常基于较旧的 MMAPV1 技术构建。

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

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

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

在分析现在现在结束时,您原困会发现应用守护任务管理器的最佳模式设计原困正在利用模式设计的组合。按照当当我们下面列出的建议,您将二个良好的起点,为您的应用守护任务管理器开发设计最佳架构,并适当调整您的环境。

尽管TTL索引很方便,但请记住每分钟后要 进行一次检查,假使 无法配置间隔。原困您都要更多控制以便在一天的特定时间内不用发生删除,则原困都要安排执行删除的批出理 作业,而都要使用TTL索引。

原困不总爱访问您的归档数据假使 查询性能不都要满足任何严格的延迟 SLA,请考虑使用 MongoDB Atlas 或 MongoDB OpsManager 的可查询备份功能备份数据。 可查询备份允许您连接到备份并向备份本身发出只读命令,而不用先恢复备份。

一旦应用守护任务管理器在生产中生效假使 大小为 TB 级,从资源的深度图来看,任何重大变化都原困非常昂贵。考虑二个本身情况汇报,即您拥有6 TB的 IoT 传感器数据,并以每秒10万次插入的传输波特率要素新数据。读取的性能现在现在结束成为二个大大问题 ,您意识到您这样正确扩展数据库。除非您不用停止应用,假使 此配置中的架构更改(类似,从原始数据存储迁移到分区存储)原困都要构建填充守护任务管理器,临时暂存区域和各种临时出理 方案以将应用守护任务管理器移动到新的架构。文章的寓意是规划增长并正确设计适合您的应用守护任务管理器的 SLA 和要求的最佳时间序列模式。

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

离线档案策略

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

原困仍都要实时访问归档数据,请考虑那此查询发生的频率以及仅存储预聚合结果与非 足够。

通过 MongoDB Sharding 水平扩展,都要能 提高性能,原困索引和数据将分布在多个MongoDB 节点上。查询不再针对特定的主节点。相反,它们由称为查询路由器(mongos)的底下服务出理 ,该服务将查询发送到包含满足查询的数据的特定节点。这对应用守护任务管理器完整篇 透明 - MongoDB会出理 所有路由。

出理 旧数据有多种办法,根据您的具体要求,这样来越多办法原困比这样来越多办法更适用。确定最符合您要求的产品。

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

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

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

确定数据到期的时间点以及要采取的操作,类似归档或删除。

时间序列应用守护任务管理器传统上捕获非常少许的数据,假使 只创建它们对应用守护任务管理器的查询模式有用的索引。

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

设计时间序列模式

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

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

每个数据点二个文档

和 StockDocPerMinute,每个集合包含以下模式:

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

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

场景二:

比较以前的场景时的关键点是,分段数据具有显着的优势。方案2中描述的基于时间的分段将整整一分钟的数据存储到单个文档中。在诸如 IoT 的基于时间的应用中,传感器数据都要能 以不规则的间隔生成,假使 这样来越多传感器都要能 提供比这样来越多传感器数据更多的数据。在那此场景中,基于时间的分段原困都要分发的最佳办法。另本身策略是基于大小的分组。

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

水平缩放

当当我们应该永久存储所有数据吗?超过特定时间的数据对您的组织有用吗?旧数据应该咋样访问?它与非 都要能 在您都要时从备份中简单地恢复,还是都要在线假使 都要能 作为历史分析的活动存档实时访问用户?正如当当我们在本系列博文的第1要素中所述,那此是在上线以前应该提出的这样来越多大大问题 。

关键要点

主要提示:

使用 remove 话语删除文档

查询数据池中的数据

对数据存储的影响

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

考虑多个集合:二个集中于编写少许插入和最近的数据查询,二个集合具有重叠在预聚合数据上的历史查询的分块数据。

归档数据时,与数据检索相关的 SLA 是那此?与非 恢复可接受的数据备份,原困数据与非 都要在线并准备好在任何给定时间查询?那此大大问题 的答案将有有利于推动您的档案设计。原困您不都要实时访问归档数据,则原困都要考虑备份数据并将其从实时数据库中删除。都要能 使用 MongoDB Ops Manager备份生产数据库,原困原困使用 MongoDB Atlas 服务,则都要能 使用完整篇 托管的备份出理 方案。

少许文档不仅会增加数据存储消耗,后要 增加索引大小。在每个集合上创建了二个索引,并覆盖了符号和日期字段。与将被委托人定位为时间序列数据库的这样来越多键值数据库不同,MongoDB提供了二级索引,使您都要能 灵活地访问数据并允许您优化应用守护任务管理器的查询性能。

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

对内存利用率的影响

原困原困,使用真实数据和实际应用守护任务管理器测试模式模式。

分片存档数据

以前的文章“

设计架构比较

请务必注意,使用 remove 命令或 TTL 索引会原困高磁盘I / O。 在原困发生高负载的数据库上,这原困是不可取的。从实时数据库中删除记录的最有效和最快捷的办法是删除集合。原困您都要能 设计应用守护任务管理器,使每个集合代表一段时间,当您都要存档或删除数据时,您都要做的也不 删除集合。这原困都要您的应用守护任务管理器代码中的这样来越多查询要能知道应该删除那此集合。当您发出删除时,MongoDB 也都要从所有受影响的索引中删除数据,这原困都要一段时间,具体取决于数据和索引的大小。

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

”中,介绍了时间序列数据的概念,假使 介绍了这样来越多常见大大问题 ,可用于帮助分发时间序列应用守护任务管理器。那此大大问题 的答案有有利于指导支持大批量生产应用守护任务管理器部署所需的架构和 MongoDB 数据库配置。现在,当当我们将重点介绍本身不同的模式设计咋样影响读取,写入,更新和删除操作下的内存和磁盘利用率。0

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

咋样出理 旧数据

删除集合删除文档

为了帮助说明分发和分组咋样影响性能,请考虑当当我们要存储和分析历史股票价格数据的场景。当当我们的样本股票价格生成器应用守护任务管理器每秒为其跟踪的给定数量的股票创建样本数据。一秒是本例中每个股票代码分发的最小数据时间间隔。原困您想在被委托人的环境中生成样本数据,都要能 在GitHub上使用StockGen工具。值得注意的是,尽管本文档中的样本数据使用了股票代码作为示例,但您都要能 将那此相同的设计概念应用于任啥后后间序列场景,类似物联网传感器的温度和湿度读数。

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

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

预聚合

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

当新的传感器数据进入时,它也不 附加到文档,直到样本数达到3000,假使 原困当当我们的upsert:true子句而创建二个新文档。

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

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

请注意,字段“p”包含二个子文档,其中包含每分钟的值。

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

在线档案策略

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

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

场景三:

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

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

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