3

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

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

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

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

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

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

在此处输入图像描述

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

研究的解决方案(来自本文):

这里有一些问题:

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 个新用户我必须生成一个单独的数据库吗?

4

1 回答 1

3

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

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

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

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

于 2019-09-04T18:26:53.167 回答