用于传感数据传输的 Oracle 物化视图

Oracle Materialized View for sensory data transfer

在应用程序中,我们必须通过 Internet 将来自多个客户端的传感数据流发送到中央服务器。一个明显的解决方案是使用 Kafka 等 MOM(面向消息的中间件),但我最近了解到我们可以使用 oracle 实体化视图等数据库同步工具来做到这一点。

后一种方法在某些应用程序中有效(将数据从中央服务器发送到多个客户端,与我们的应用程序相反),但它在我们的应用程序中的优缺点是什么?在速度、安全性等方面,哪一个更适合从多个(约 100 个)客户端向服务器发送传感数据流?

谢谢。

P.S.

有关更多详细信息,请考虑一个应用程序,其中许多(大约 100 个)客户端必须通过 Internet 将流数据(每分钟 1MB 数据)发送到中央服务器。服务器需要数据,用于在线监控、分析和一些计算,如机器学习和数据挖掘任务。

我的问题是关于 db-to-db 连接和流解决方案(例如用于将数据从客户端传输到服务器的 kafka)之间的区别。

序言

我将尝试将您的问题分解为更清楚地了解您当前的需求,然后重新构建它。写这篇文章花了很长时间,所以如果您能在后面做两件事,我将不胜感激:

  1. 持怀疑态度 - 绝对没有什么可以替代您自己进行测试。互联网作为 指南 非常有用,但不能保证您收到的帮助(如果这个答案有帮助的话!)是最适合您的具体情况的。在分配的 space 中不可能完全描述您的当前情况,因此任何答案都必然会缺少某些地方。
  2. 再看看你是如何解释自己的 - 这是一个有效的问题,由于你对系统的描述和你试图做的事情不够清晰而被部分停止达到。在发布复杂问题之前让不熟悉您的系统的人检查您的问题可能会有所帮助。

问题定义

sensory data stream from multiple clients to a central server

您正在将数据从多个位置发送到单个持久性存储

online monitoring

您将根据原始数据和可能的一些聚合数据触发进一步的操作

analysis and some computation such as machine learning and data mining tasks

您将对客户的数据执行一些聚合,即您需要聚合所有 的客户数据(但暂时)保存在某处

进一步假设

因为你在谈论物化视图,我们可以假设所有客户端都将数据保存在数据库中,可能是 Oracle。

来自您客户的数据与同一主题有关。

您有大约 100 个客户,我们可以假设这个数量:

  • 客户数量可能会发生变化
  • 您希望能够在不增加访问数据的方法数量的情况下添加客户端

您不为 Google、Amazon、Facebook、Quantcast、Apple 等之一工作

架构图

在这里,我不会对它的实际工作方式发表任何评论 - 这是基于我对您的系统缺乏了解的讨论的开始。 "raw data persistence" 可以是文件、Kafka、数据库等。这是对所需组件的描述以及对它们将如何连接的粗略猜测。

将假设的体系结构应用于物化视图

物化视图是一个持久化查询。因此你有两个选择:

  1. 创建一个将所有 100 个客户数据合并在一起的查询。如果添加或删除客户端,则必须更改查询。如果您的任何一个客户端出现网络问题,那么一切都会失败
  2. 编写并维护 100 个物化视图。您中心位置的 Oracle 数据库有 100 个传入连接。

正如您可能从必须做出的权衡中猜到的那样,我不喜欢将物化视图作为唯一的解决方案。我们应该努力减少重复代码和单点故障的数量。

不过您仍然可以使用实体化视图。如果我们拿走图表并删除中心位置的所有重复箭头,则意味着两件事。

  1. 有一个接受传入数据的服务
  2. 有一个服务可以将所有传入数据放在一个地方

然后您可以为聚合层使用单个物化视图(如果您的原始数据持久性不在 Oracle 中,您首先必须将数据放入 Oracle 中)。

更改的后果

现在我们决定您只有一个数据管道,您的决策实际上变得更加困难。我们已将您的客户端与中央位置和聚合层与我们的原始数据持久性分离。这意味着选择现在是你的,但它们也更容易改变。

重新构想架构

这里我们需要弄清楚哪些技术不会改变。

  • Oracle 数据库很昂贵,您正在将 140GB/天推入您的数据库(顺便说一下,这是 50TB/年,相当多)。我不知道您是否真的存储了所有原始数据,但在这些卷中,您不太可能是 - 您只存储聚合
  • 我假设您有一些首选的技术来进行机器学习和数据挖掘。如果你不那么考虑得到一些来防止疯狂支持一切

将所有这些放在一起,我们最终得到以下结果。实际上只有一个问题很重要:

您想从数据库中读取多少次原始数据。

如果答案是一次,那么我们刚刚描述了一些中间件。如果答案不止一次那么我会重新考虑,除非你有一些非常好的磁盘。这个中间层是否使用 Kafka 完全取决于你。使用您最熟悉的任何内容,以及您最愿意投入时间学习和支持的任何内容。您要处理的数据量非常大,需要反复试验才能做到这一点。

关于这一点的最后一点;我们已经定义了一个数据管道。数据流经系统的单一方法。这样做,我们增加了系统的灵活性。想要添加更多客户,无需执行任何操作。想要更改部分系统背后的技术,只要界面保持不变就没有问题。想往别处发数据,没问题,都在原始数据持久层。