【问题标题】:Multi-user efficient time-series storing for Django web appDjango Web 应用程序的多用户高效时间序列存储
【发布时间】:2020-01-07 10:35:16
【问题描述】:

我正在开发一个 Django 应用程序。用例场景是这样的:

50 个用户,每个用户最多可以存储 300 个时间序列,每个时间序列大约有 7000 行。

每个用户都可以随时要求检索他们所有的 300 个时间序列,并要求为每个用户对最后 N 行执行一些高级数据分析。数据分析不能在 SQL 中完成,而是在 Pandas 中完成,它不需要太多时间......但是在单独的数据帧中检索 300,000 行!

用户还可以询问可以在 SQL 中执行的一些分析的结果(如聚合+按日期求和),而且速度要快得多(如果这就是全部,我就不会写这篇文章了) .

浏览和思考,我发现在 SQL 中存储时间序列并不是一个好的解决方案(阅读 here)。

理想的部署架构如下所示(每个存储桶都是一个单独的服务器!):

问题:SQL 中的时间序列太慢,无法在多用户应用中检索。

研究解决方案(来自this article):

这里有一些问题:

1) 虽然这些解决方案在将数百万行时间序列拉入单个数据帧时速度要快得多,但我可能需要将大约 500.000 行数据拉入 300 个不同的数据帧。还会这么快吗?

这是我正在使用的当前数据库结构:

class TimeSerie(models.Model):
    ...

class TimeSerieRow(models.Model):
    date = models.DateField()
    timeserie = models.ForeignKey(timeserie)
    number = ...
    another_number = ...

这是我的应用程序的瓶颈:

for t in TimeSerie.objects.filter(user=user):
    q = TimeSerieRow.objects.filter(timeserie=t).orderby("date")
    q = q.filter( ... time filters ...)
    df = pd.DataFrame(q.values())
    # ... analysis on df

2) 即使 PyStore 或 Arctic 可以更快地做到这一点,这也意味着我将失去将我的数据库与 Django 实例分离的能力,更有效地使用一台机器的资源,但只能使用一台机器并且不可扩展(或使用与机器一样多的独立数据库)。 PyStore/Arctic 能否避免这种情况并为远程存储提供适配器?

有没有可以解决这个问题的 Python/Linux 解决方案?我可以使用哪种架构来克服它?我应该放弃我的应用程序的可扩展性和/或接受每 N 个新用户我必须生成一个单独的数据库吗?

【问题讨论】:

  • 如果你使用Arctic或PyStore,为什么不能解耦你的“db”?两者都是存储,它们可以在与 Django 应用程序不同的实例上运行。我认为您引用的文章是您问题的最佳答案。您应该尝试一下,看看哪一种最适合您的要求。
  • 是的,它们可以在单独的实例上运行,但我将如何在两者之间传输数据?我必须在它们之间写一个层,而且它在读写性能方面必须与 PyStore 一样高效,这违背了首先拥有预制库的目的。例如,如果存储机器使用 PyStore 读取并发送 JSON,那么我必须在 Django 中解析 JSON,这会增加大量开销……我会比现在使用 SQL+Pandas 更慢。我想 PyStore/Arctic 需要 在使用数据的驱动器上运行以提高其性能:如果我错了,请纠正我
  • 别忘了提到的其他选项,比如 InfluxDB。
  • 不,它没有。北极使用 mongoDB 来存储数据,并且可以在任何地方。 pyStore 使用类似文件的系统来存储数据,并且可以在任何可以访问文件的地方。在 AWS 上,您可以使用由多个运行 pystore 的 EC2 实例共享的 S3 或 EFS 卷。
  • 如何在一台机器和另一台机器之间传输 Pandas 数据帧?您是否不必序列化数据(如果是:哪种格式?)。或者 pyStore 有序列化/反序列化支持吗?我认为序列化/反序列化将是一个巨大的开销,但如果不是这种情况,这可能是解决方案......我也会研究 InfluxDB。感谢您的提示!

标签: python django pandas


【解决方案1】:

您在帖子中引用的文章可能是您问题的最佳答案。很明显,很好的研究和一些很好的解决方案正在被提出(别忘了看看 InfluxDB)。

关于存储解决方案与您的实例的解耦,我没有看到问题:

  • Arctic 使用 mongoDB 作为后备存储
  • pyStore 使用文件系统作为后备存储
  • InfluxDB 本身就是一个数据库服务器

只要您将后备存储与实例分离并在实例之间共享它们,您将拥有与 posgreSQL 数据库相同的设置:mongoDB 或 InfluxDB 可以在单独的集中式实例上运行; pyStore 的文件存储可以共享,例如使用共享的安装卷。访问这些存储的 python 库当然运行在您的 django 实例上,就像 psycopg2 一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2020-01-02
    • 2012-10-26
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多