存储分配给用户的大约40亿(2 ^ 32)个号码的建议

时间:2013-01-13 19:53:40

标签: mysql nosql

我正在研究存储可能存在大量数据的策略,并且我想找到最好的存储技术。我对MySQL,NoSQL,平面文件,任何东西都有任何建议。

我在做什么:

  • 我将在一组用户中分发所有4字节整数。
  • 数字将为0到4,294,967,295,无符号4字节整数范围。
  • 用户可以拥有数千个这样的数字。
  • 期待成千上万的用户,但数百万的可能性很小。
  • 数字将在一段时间内分发,而不是一次性分发
  • 使用AWS,一些服务器和EBS卷

我主要担心的是存储空间。我需要以便宜的价格执行此操作,并且在AWS上花费大量资金。

我已经做过一些关于用数学方法表示数字分配的研究,但我发现了太多问题。

要求

  • 分析和实时数据显示的高效检索。不一定要闪电但合理。
  • 我需要在两个方向上进行查找用户ID - >号码和号码 - >用户ID
  • 尽可能少的存储空间。
  • 合理(小于8 GB)的内存使用量。
  • 必须是准确的,丢失的号码和错误分配的号码不是一种选择。

这是我到目前为止所发现的:

存储与2字节用户ID关联的所有4字节数字的下限是((4 + 2)* 2 ^ 32/1024/1024/1024)= 24 GB。

Cassandra是一个键/值对数据库。根据这个http://www.datastax.com/docs/0.8/cluster_architecture/cluster_planning我计算如果我使用每个4字节数字作为键和2字节用户ID作为值,我需要大约260GB的存储空间(没有复制)。

Redis在内存中。我认为这会消除它作为一种可能性,因为在AWS上会有很多内存疯狂。

我目前正在寻找关于MySQL和Mongo的类似信息。

这是我的问题。是否有任何可用于确定最佳解决方案的参考文献,或者是否存在我没​​想到的替代解决方案。

谢谢大家。

更新 - 我添加了一项额外要求,我需要根据用户ID和用户ID查找数字。此外,Redis在内存中,因此直接实现会使Redis比基于磁盘的解决方案更昂贵。

2 个答案:

答案 0 :(得分:2)

实际上,您只需要存储拥有用户的号码;如果您正在寻找未存储的号码,您将得到一个空的结果,因此您知道该号码未被分配。

对于MySQL:

CREATE TABLE mashup
(
   id       bigint primary key,
   user_id  int,

   index (user_id);
);

主键将确保'id'具有索引;另外,bigint有更多空间,所以你不会遇到像整数溢出这样令人讨厌的问题。然后,为每个用户插入如下记录:

INSERT into mashup VALUES (181870388, 90128);

想知道某个号码是否有用户?

SELECT user_id FROM mashup where id=xxxxx;

或者

SELECT COUNT(*) FROM mashup where id=xxxxx;

想知道用户有哪些号码?

SELECT id FROM mashup WHERE user_id=yyyyy;

美丽的是,你不会浪费存储所有40亿个数字的空间,只留下用户条目的数量。

答案 1 :(得分:0)

也许我们的例子可以提供帮助。我们正在使用couchdb存储欧洲一个大国的整套移植电话号码。 map-reduce使其变得非常快。

我们的磁盘使用情况如下:

Usage: 8.2 GB
Numbers of documents: 22109793
Average characters per document: 272

希望这有助于您的选择。