2

我正在研究存储可能是大量数据的策略,我想找到最好的存储技术。我愿意接受任何关于 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 比基于磁盘的解决方案更昂贵。

4

2 回答 2

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 亿个数字的空间,而只需存储用户条目的数量。

于 2013-01-13T20:54:37.517 回答
0

也许我们的例子可以提供帮助。我们couchdb用于存储欧洲一个大国的全套移植电话号码。第一次对此进行索引需要相当多的时间,但随后map-reduce会变得非常快。

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

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

希望这对您的选择有所帮助。

于 2013-01-14T11:29:14.653 回答