为Django Web应用程序实现多用户高效时间序列存储

4

我正在开发一个Django应用程序。使用案例如下:

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

每个用户随时都可以要求检索他们的所有300个时间序列,并要求对它们中的每一个在最后N行上执行一些高级数据分析。数据分析不能在SQL中完成,但在Pandas中可以完成,这不需要太长时间……但是检索30万行分别在数据框中完成!

用户还可以要求执行一些可以用SQL执行的分析结果(例如按日期聚合+总和),这样速度会快得多(如果只是这些问题,我就不会写这篇文章了)。

浏览和思考之后,我发现将时间序列存储在SQL中并不是一个好的解决方案(请参阅此处)。

理想的部署架构如下(每个bucket是一个单独的服务器!):

enter image description here

问题:在多用户应用程序中,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 个用户就必须生成一个单独的数据库的事实?


为什么如果你使用Arctic或PyStore,就不能将你的“db”解耦呢?它们都是存储库,可以在与Django应用程序不同的实例上运行。我认为你引用的那篇文章是回答你问题的最佳答案。你应该尝试它们,并看看哪一个最符合你的要求。 - dirkgroten
是的,它们可以在单独的实例上运行,但是我如何在它们之间传输数据呢?我必须在它们之间编写一个层,并且它的读写性能必须像PyStore一样高效,否则就失去了使用预制库的目的。例如,如果存储机器使用PyStore进行读取并发送JSON,则我必须在Django中解析JSON,这会增加大量开销...我甚至比现在使用SQL+Pandas还要慢。我想PyStore/Arctic 需要在使用数据的驱动器上运行,以便从其性能中受益:如果我错了,请纠正我。 - Saturnix
1
不要忘记其他提到的选项,比如InfluxDB。 - dirkgroten
哦,我懂了!所以你的意思是文件系统或mongoDB应该共享,并且Python库应该在与Django相同的机器上。有道理! - Saturnix
您可以将您的提案发布为答案,我会接受。 - Saturnix
显示剩余3条评论
1个回答

3
在您的帖子中提到的文章可能是对您问题最好的回答。显然,有良好的研究和一些提出的好解决方案(不要忘记查看InfluxDB)。
关于将存储解决方案与实例解耦,我认为没有问题:
- Arctic使用mongoDB作为备份存储 - pyStore使用文件系统作为备份存储 - InfluxDB是一个独立的数据库服务器
只要将备份存储与实例解耦并使它们在实例之间共享,就可以像您的posgreSQL数据库设置一样设置:mongoDB或InfluxDB可以在单独的集中实例上运行;pyStore的文件存储可以共享,例如使用共享挂载卷。访问这些存储的Python库当然在您的Django实例上运行,就像psycopg2一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接