【问题标题】:Scheme-less database solution to work on one machine only?仅在一台机器上工作的无方案数据库解决方案?
【发布时间】:2011-04-08 03:38:33
【问题描述】:

我正在寻找一个无方案的数据库来在磁盘上存储大约 10[TB] 的数据,理想情况下,使用 python 客户端。建议的解决方案应该可以免费用于商业用途,并且具有良好的读写性能。

这里的主要目标是存储时间序列数据,包括由time stamp 访问的超过十亿条记录。

数据将存储在以下方案中:

KEY --> "FIELD_NAME.YYYYMMDD.HHMMSS"

--> [v1, v2, v3, v4, v5, v6](v1..v6 只是floats

例如,假设:

FIELD_NAME = "番茄"

TIME_STAMP = "20060316.184356"

= [72.34, -22.83, -0.938, 0.265, -2047.23]

考虑到FIELD_NAMETIME_STAMP 的组合,我需要能够检索VALUE(整个数组)。

查询 VALUES["TOMATO.20060316.184356"] 将返回向量 [72.34, -22.83, -0.938, 0.265, -2047.23]。数组的读取应该尽可能快。

然而,我还需要一种在数组中存储(就地)标量值的方法。假设我想将时间戳2006/03/16.18:43:56TOMATO 的第一个元素分配为500.867。在这种情况下,我需要有一个快速的机制来做到这一点——比如:

["TOMATO.20060316.184356"][0] = 500.867(这将在磁盘上更新)

MangoDB 这样的东西可以工作吗?我将只使用一台机器(无需复制等),运行 Linux。

澄清:只有一台机器将用于存储数据库。然而,我需要一个解决方案,允许多台机器连接到同一个数据库并更新/插入/读取/写入数据。

【问题讨论】:

  • 抱歉您的问题描述不佳...10 TB 的数据究竟意味着什么?大文件?很多行?与耐用性相关的要求?...慢慢来,提供您真正想要的确切事实。
  • @RestRisiko:我编辑了我的问题。谢谢你的帮助。

标签: python linux mongodb database nosql


【解决方案1】:

MongoDB 在性能、灵活性和可用性方面可能是一个不错的选择(易于使用)。然而,大型数据库需要仔细规划——尤其是在备份和高可用性方面。如果没有对项目需求的进一步了解,就很难说一台机器是否足够(如果您需要选项扩展,请查看副本集和分片)。

更新:根据您的新信息 - 应该可以使用 MongoDB(测试和评估它)。简单地说:MongoDB 可以成为 NoSQL 数据库中的“MySQL”……如果您了解 SQL 数据库,那么您应该能够轻松地使用 MongoDB,因为它借鉴了 SQL 世界的许多想法和概念。查看您的数据模型...这很简单,可以轻松检索和存储数据(不详细介绍)..我建议下载 MongoDB 并浏览教程。

【讨论】:

  • 我需要澄清的是,只有 一台机器 将用于存储数据库。然而,我需要一个允许多台机器连接到同一个数据库并更新/插入/读取/写入数据的解决方案。因此,如果机器 X 存储数据库,我需要能够让机器 YZ 访问该数据库,更改其中的值等; MangoDB 支持这个吗?
  • 为什么不可能呢? MongoDB是典型的客户端-服务器架构...
  • 完美,谢谢。我喜欢MangiDB 的灵活性。有没有可以提问等的论坛?
  • 我假设你可以阅读并在 mongodb.org 你自己上找到资源。不要指望一切都准备好了。
【解决方案2】:

一个 MongoDB 实例可以允许多台机器访问它。但是,您必须为服务器提供特殊的命令行参数才能允许它这样做。您应该搜索 MongoDB 文档,它非常全面。 mongodb 的认证模型的文档是here。它描述了如何在安全模式下运行 Mongo 以及如何限制可以绑定到它的 ip 范围。

【讨论】:

    【解决方案3】:

    MongoDB 可以工作。但是,鉴于您的要求,我强烈推荐 Redis。

    Redis 是一种数据结构存储。您可以将数组存储为值并使用键访问它们的位置。它易于设置/使用,而且速度快得离谱。它可以作为一台机器服务器和其他方式工作。

    Redis 有很多优秀的 Python 客户端,例如 Rediscoredis-natives-py 和 redis-wrap 或最简单的 redis-py。

    【讨论】:

    • @Shekhar:谢谢。几个问题:(1)当大部分数据需要在磁盘上存储/更新时Redis如何工作(我读到它主要用于内存操作,尽管这可能已经改变)。 (2) 如果我需要更新数组的元素(按索引),我会受到性能损失吗?所以说我需要更新数组中的元素v3(使用它的位置索引)。这会是 O(1) 吗?
    • 1.是的,它会保留您的数据。正确地说,它会定期写入磁盘(并且此间隔是可配置的)。 2. O(1) 见LINSERT
    • @Shekhar:谢谢。看来除非你在开头直接插入,否则还是O(N)操作,没关系。我只是好奇,在选择Redis 之前,您是否对Redis 性能与MangoDB 进行了基准测试?
    • 鉴于特定要求,我认为 Redis 会更快。如果您搜索,会有不同的基准浮动。
    • @Shekhar:谢谢。 Redis 会以同样的方式工作,一台机器存储数据库,多个clients 可以连接到数据,修改它等等?
    【解决方案4】:

    另一个需要考虑的选项是Berkeley DBBerkeley DB Java Edition。 BDB 是一个 C 库,而 BDB JE 是一个 Java 库。两者都提供多种 API 用于存储数据,包括键值对 API (NoSQL)、Java Collections API 和 Java Direct Persistence Layer (POJO-like) API。

    任何一个库都可以在单个系统上管理 10TB 的存储库。两者都提供 HA 功能,允许您将数据库(和任何更改)复制到多个系统。读取可以发送到主服务器或任何副本(提供负载平衡)。必须将更新发送给主服务器。今天,我们有客户在这种设置中使用 Berkeley DB。 Berkeley DB 已经存在很多年了,这正是我们擅长的应用程序。

    免责声明:我是 Berkeley DB 的产品经理,所以我有点偏见。 :-)

    【讨论】:

    • 谢谢。 Berkeley DB 是否可以免费用于商业用途? (我不是在谈论将它嵌入到自定义软件中——我说的是简单地安装它并在公司服务器上使用它来进行数据存储/研究)
    • 您可以在此处找到 Berkeley DB 许可证信息:bit.ly/g7h1mf。基本上,BDB 是双重许可证,也就是 GPLv2。在开源许可下,开源项目可以免费使用它。商业许可证适用于分发给第三方的非开源应用程序,以及需要 Oracle 支持的客户。
    猜你喜欢
    • 2014-08-10
    • 2012-10-14
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多