【发布时间】:2012-01-28 02:29:50
【问题描述】:
我正在为我的一个项目开发一个全文索引系统。作为索引页面过程的一部分,它将数据拆分为非常非常多的非常小的片段。
我已经得到片段的大小低至 20-30 字节的常量,并且可能更小,它基本上是 2 个 8 字节整数和一个浮点数,构成了实际数据。
由于我正在寻找的规模和由此产生的件数,我正在寻找 mysql 的替代品,它在价值设置远低于我的目标时显示出重大问题。
我目前的想法是键值存储是最好的选择,我已经相应地调整了我的代码。
我尝试了一个数字,但由于某种原因,它们的扩展性似乎都比 mysql 还要小。
我希望存储数亿或数十亿或更多键值对,因此我需要一些不会随着大小而导致性能大幅下降的东西。
我已经尝试过 memcachedb、membase 和 mongo,虽然它们都很容易设置,但没有一个适合我。
由于所需的密钥数量和可用内存有限,membase 的问题最多。写入速度在这里非常重要,因为这是一个非常接近均衡的工作量,我写了一次,然后读回几次并存储它以供最终更新。
我不需要太多的删除性能,我更喜欢可以很好地集群的东西,因为我希望最终能够跨机器扩展,但它现在需要在单台机器上工作。
我也希望使这个项目易于部署,因此简单的设置会更好。该项目是用php编写的,因此需要从php轻松访问。
我不需要行或其他更高级别的抽象,在这种情况下它们大多没用,我已经从我的一些其他测试中制作了代码以获取键值存储,这似乎可能是最快的,因为我只有 2 个可以从第三个键控的行中检索到的东西,因此几乎没有额外的工作来使用键值存储。有谁知道任何可以像这样扩展的易于使用的项目?
我正在使用这个存储来存储三个数字的单独集合,(大小取决于它们在 mysql 中的存储方式,在其他存储位置可能不正确) 2 个八字节整数,一个用于 ID document 和一个用于单词的 ID 以及该单词在文档中所占比例的浮点表示(作品出现的次数除以文档中的单词数)。此数据的索引是单词 id 和文档 id 所属的范围,每次我需要检索此数据时,它将是给定单词 id 的所有结果。我目前将单词 id、范围和该单词/范围组合的计数器分别转换为数字的二进制表示,并将它们连接起来形成密钥以及 2 位数字,以说明我存储的该密钥的值,文档 ID 或浮点值。
性能测量有点主观,查看将数据放入或从存储中取出数据的过程的输出,查看它处理文档的速度以及快速刷新我的统计计数器,以跟踪更准确的统计数据当我使用每种存储方法时,系统正在工作并查看差异。
【问题讨论】:
-
你在亚马逊上试过 SimpleDB 吗? aws.amazon.com/simpledb
-
请在您的问题中添加一些示例性数据。关键是什么?价值是多少?
-
memcachedb 怎么会比 MySQL 慢?你是如何衡量绩效的?您是否需要并发?你是如何进行测试的?你是在单机上测试的吗?您的 PHP 程序如何访问这些值?您需要提供更多信息,例如每秒至少需要多少次写入。
-
我没有尝试过简单的数据库,但 10GB 的限制很容易导致这么大的数据集出现问题,更不用说这是在托管服务器上完成的,我宁愿保持成本为此,不会增加太多成本。我之前已经看到这个数据集很容易增长到超过 10GB。
-
我没有具体的最小值,但我可以给出一个很好的估计,我需要在单台机器上每秒至少 2-3k 读取和 2-3k 写入,并且可能至少在集群上每秒5-10k。我确实需要并发,但我不需要即时一致性,但需要相当快速的一致性,比如在 1-5 分钟内。
标签: php nosql key-value key-value-store