在数据库中存储大量数据



我目前正在从事一个家庭自动化项目,该项目为用户提供了在一段时间内查看其能源使用情况的可能性。目前,我们每15分钟请求一次数据,我们预计第一次大试点大约有2000个用户。

我的老板要求我们至少存储半年的数据。粗略计算,大概有3500万条记录。虽然这些记录很小(每个约500字节),我仍然想知道是否将这些存储在我们的数据库(Postgres)是一个正确的决定。 有没有人有一些好的参考资料和/或建议如何处理这么多的信息?

目前,35M条0.5K的记录意味着37.5G的数据。这适合您的试点数据库,但您还应该考虑试点后的下一步。当试点项目取得巨大成功时,你的老板可能会不高兴,因为你会告诉他,如果不重新设计一切,你就不能在接下来的几个月里向系统添加10万用户。此外,为VIP用户提供每分钟请求一次数据的新功能怎么样?

这是一个复杂的问题,您所做的选择将限制您的软件的发展。

对于试点,尽可能保持简单,以使产品尽可能便宜->对于数据库来说是ok的。但是告诉你的老板,你不能这样开放服务,在每周获得1万名新用户之前,你必须做出改变。

下一个版本的一件事:有许多数据存储库:一个用于经常更新的用户数据,一个用于查询/统计系统,…

你可以看看下一个版本的RRD。

还要记住更新频率:2000个用户每15分钟更新数据意味着每秒更新2.2次-> ok;100000个用户每5分钟更新一次数据意味着每秒333.3次更新。我不确定一个简单的数据库能不能做到这一点,而一个单独的web服务服务器肯定做不到。

我们经常碰到这样的表。显然,要根据使用情况(是否大量读写)来构建索引,并从一开始就考虑基于数据的高级分组来进行表分区。

同样,您可以实现一个归档的想法来保持活动表的精简。历史记录要么从未被触及,要么被报道,在我看来,这两种情况对活表都没有好处。

值得注意的是,我们有大约100万条记录的表,我们不认为存在性能问题。很多性能改进都可以轻松完成,因此您可以从常识性解决方案开始,只有在性能被证明很差时才进行调优。

使用适当的索引来避免缓慢的查询,我认为任何像样的RDBMS都不会在这种数据集上挣扎。很多人使用PostgreSQL来处理比这多得多的数据。

这就是数据库的作用:)

首先,我建议您做一个性能测试——编写一个程序,生成与您将在半年中看到的条目数量相对应的测试条目,插入它们并检查结果,看看查询时间是否令人满意。如果没有,请按照其他答案的建议进行索引。顺便说一句,写性能也值得尝试,以确保您可以实际插入15分钟内生成的数据量。15分钟或更短。

进行测试将避免所有问题之母——假设:-)

还要考虑生产性能—您的试点将有2000个用户—您的生产环境将在一两年内拥有4000个用户还是200,000个用户?

如果我们谈论的是一个非常大的环境,你需要考虑一个解决方案,允许你通过添加更多的节点来扩展,而不是依赖于总是能够在单个机器上添加更多的CPU,磁盘和内存。你可以在你的应用程序中通过跟踪多个数据库机器中哪一个托管特定用户的详细信息来做到这一点,或者你可以使用Postgresql集群方法之一,或者你可以走一条完全不同的道路——NoSQL方法,在那里你完全摆脱RDBMS,使用构建为水平扩展的系统。

有许多这样的系统。我对卡桑德拉只有个人经验。你必须与你习惯的RDBMS世界完全不同,这是一个挑战——更多地考虑你想要什么如何访问数据而不是如何存储数据。例如,我认为以user-id作为键存储数据,然后添加一个列,其中列名是时间戳,列值是该时间戳的数据,这是有意义的。然后,您可以请求这些列的片段,例如在Web UI中绘制结果——Cassandra对于UI应用程序具有足够好的响应时间。

投入时间学习和使用nosql系统的好处是,当你需要更多的空间时,你只需要添加一个新节点。如果您需要更高的写性能或读性能,也是如此。

整个时期不保留个别样本不是更好吗?您可以实现某种整合机制,将每周/每月的样本连接到一个记录中。并按时间表运行上述整合。

您的决定必须取决于您需要能够在数据库上运行的查询类型。

有很多技术可以处理这个问题。只有当您接触到最少数量的记录时,您才能获得性能。在您的情况下,您可以使用以下技巧:

  1. 尝试将旧数据保存在单独的表中,您可以使用表分区或使用不同的方法,您可以将旧数据存储在文件系统中,并且可以直接从应用程序提供服务,而无需连接到数据库,这样您的数据库将是自由的。我正在为我的一个项目这样做,它已经有超过50GB的数据,但它运行得非常顺利。
  2. 尝试索引表列,但要小心,因为它会影响您的插入速度。
  3. 尝试对插入或选择查询进行批处理。你可以很巧妙地处理这个问题。例如:假设你每隔1秒就请求在任何表中插入记录,然后你做一个机制,你以这种方式处理5条记录的批处理这个请求,你会在5秒后击中你的数据库,这要好得多。是的,你可以让用户等待5秒等待他们的记录插入,就像在Gmail中,你发送电子邮件,它要求你等待/处理。对于select,你可以定期将结果集放在文件系统中,并且可以像大多数股票市场数据公司那样直接将结果集提供给用户,而不需要接触数据库。你也可以使用一些ORM,比如Hibernate。他们将使用一些缓存技术来提高数据的速度。

如需进一步查询,请发邮件至ranjeet1985@gmail.com

相关内容

  • 没有找到相关文章

最新更新