2012-04-23 66 views
6

关于选择哪个NoSQL的另一个问题。 但是,我还没有找到有人要求这种类型的目的,消息存储...哪些为消息存储目的集群了NoSQL DB?

我有一个二郎聊天服务器,我已经使用MySQL存储朋友列表,并且“加入需要”信息。

我想存储消息(该用户没有收到,因为他处于脱机状态......)并检索它们。

我已经做了NoSQL的预选,由于它是面向RAM的范例,我不能使用像MongoDB这样的东西,并且无法像其他的那样集群。 我了我的列表,3个选择我想:

  • HBase的
  • 了Riak
  • 卡桑德拉

我知道他们的模型退出不同,使用的键/值之一,其他使用SuperColumns和co。

到目前为止,由于它是Erlang稳定的客户端库,我对Riak有偏好。

我知道,我可以使用卡桑德拉与节俭,但似乎没有使用Erlang很稳定(我还没有得到很好的回报吧)

我真的不知道事情的HBase现在,只是知道它是存在的,并且基于Dynamo像Cassandra和Riak。

所以,这就是我需要做的:

  • 店从1到每个注册用户X的消息。
  • 获取每个用户存储的消息数量。
  • 立即检索来自用户的所有消息。
  • 一次删除来自用户的所有消息。
  • 删除是比X个月

现在,我真的很新的NoSQL的数据库,我一直是一个MySQL的爱好者,这是所有的消息,为什么我问你这个问题,作为一个新手,会有比我更有经验的人可以帮我选择哪一个更好,并且会让我尽我所能去做,而不会有太多的麻烦......

谢谢!

+0

@BrianRoach:他们不似乎这么认为在这个问题上http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra这是同一种问题。 – TheSquad 2012-04-23 19:41:27

+1

事实上,一个问题没有被降低和关闭,因为它应该已经不会影响......根据常见问题和元数据不适合的事实。此外,这是2年前 - 随着其他网站的增加,事情已经发展。 – 2012-04-23 20:19:52

回答

7

我不能说Cassandra或Hbase,但让我解决Riak部分。

是的,Riak会适合您的情况(我已经看到几家公司和社交网络将它用于类似的目的)。

要实现这一点,您需要简单的Riak键/值操作,以及某种索引引擎。您的选项是(按优先顺序粗糙):

  1. CRDT设置。如果您的1-N收集大小的大小合理(比方说,每个用户少于50条消息或其他),则可以将子集合的密钥存储在CRDT Set Data Type中。

  2. Riak搜索。如果您的收藏大小很大,特别是如果您需要在任意字段中搜索对象,则可以使用Riak Search。它在后台加速Apache Solr,并根据您定义的模式为您的对象编制索引。它有非常棒的搜索,汇总和统计,地理空间功能等。

  3. 二级索引。您可以在eLevelDB storage back end之上运行Riak,并启用Secondary Index(2i)功能。

运行一些性能测试,选择最快的方法。就模式而言,我建议使用两个存储桶(用于您描述的设置):用户存储桶和消息存储桶。

索引消息桶。 (通过关联一个搜索索引,或通过2i存储一个user_key)。这让你做所有需要的操作(和消息日志不必装入内存):从1

  • 商店每个注册用户 X消息 - 一旦你创建一个User对象,并得到一个用户密钥,为每个用户存储任意数量的消息很容易,他们会直接写入消息桶,每条消息都存储相应的user_key作为辅助索引。
  • 获取每个用户存储的消息数 - 没问题。获取属于用户的消息密钥列表(通过搜索查询,通过检索保留密钥的Set对象,或通过user_key上的2i查询)。这可以让你在客户端得到点数。
  • 立即检索来自用户的所有消息 - 请参阅上一项。获取属于用户的所有消息的密钥列表(通过搜索,集合或2i),然后通过多次获取每个密钥的值来获取这些密钥的实际消息(所有官方Riak客户端都具有multiFetch的能力,客户端)。
  • 一次删除用户的所有消息 - 非常相似。获取用户的消息密钥列表,在客户端发出删除消息。
  • 删除所有超过X个月的邮件 - 您可以在日期上添加索引。然后,检索所有超过X个月的消息密钥(通过搜索或2i),并为它们发出客户端删除。
+0

生活中有趣的事情......我发布这个问题3年后,我开始另一个项目,并且需要回答一些问题。赔率是你回答他们!所以在这里3年后,一个有效的问题和+1未来seing ;-) – TheSquad 2015-11-02 14:16:50

+0

很高兴帮助! :) – 2015-11-03 15:22:36

+0

我编辑了这个答案,解释了从那以后诞生的几个新的Riak功能 - 具体来说就是搜索和数据类型。 – 2015-11-03 15:38:37

0

我根本不会跟Riak说话,但我会质疑你选择放弃Mongo。只要您关闭日志功能并且不要完全禁用RAM即可。

我对HBase有相当多的了解,听起来它能够轻松满足您的需求。取决于你有多少用户可能会过度杀伤。它平凡支持诸如为每个用户存储许多消息之类的东西,并且具有写入自动到期的功能。根据架构架构的方式,它可能是或不是原子的,但这对你的用例无关紧要。

缺点是有很多开销来正确设置它。在站立HBase之前,您需要了解Hadoop,运行HDFS,确保您的namenode可靠等。

+1

我想MongoDB也是一个不错的选择,但我真的想要有一个基于Dynamo的模型(没有单点故障),AFAIK MongoDB不是基于此,但我可能是错的,是吗?卡桑德拉的缺点是什么? – TheSquad 2012-04-23 19:05:45

+0

我的想法并没有因为抛弃MongoDB而停止,但是现在,我还没有真正确信它是群集数据库的最佳解决方案......看起来我现在选择的3个最适合这个主体点,你不觉得? – TheSquad 2012-04-23 19:12:15

+0

当分片并且每个chard被复制时,Mongo都没有SPOF。 HBase确实是HDFS NameNode。我对Cassandra的描述不够了解,除了它没有SPOF并且与HBase的能力非常相似。 – 2012-04-23 19:31:55

0

我建议使用像Riak或Couchbase这样的分布式键/值存储,并将每个用户的整个消息日志作为一个值序列化(二进制erlang条款或JSON/BSON)。

所以你usecases它看起来像:

  • 店从1到X消息的每个注册用户 - 当用户上线时产生一个状态gen_server,从存储获得和反序列化整条消息登录启动,接收新消息,将它们附加到它的日志副本,在它终止的会话结束时,序列化已更改的日志并将其发送到存储。
  • 获取每个用户存储的消息数 - 获取注销,反序列化,计数;或者也可以将商店计算在单独的k/v对中。
  • 立即检索来自用户的所有消息 - 只需将其从存储中取出即可。
  • 一次删除用户的所有消息 - 只需从存储中删除值。
  • 删除所有超过X个月的邮件 - 获取,过滤,放回。

显而易见的限制 - 消息日志必须适合内存。

如果您决定单独存储每条消息,它将需要从分布式数据库中检索后对它们进行排序,如果您希望它们按照时间顺序进行排序,所以它不会帮助处理大于内存的数据集。如果它是必需的 - 你会无论如何最终会有一些更棘手的计划。

+0

不幸的是,消息日志有很大的机会不适合内存...这就是为什么我可能会与卡桑德拉它列的数据库看起来很有前途,如果它适用于Twitter的鸣叫,它会为我工作.. (可以做得更多,可以做得更少;-) – TheSquad 2012-04-26 10:36:24

+0

你也可以将消息记录分成多页,其​​中一页作为一个值存储。我没有这方面的个人经验,但它在Voxer的这次谈话中描述:http://vimeo.com/52827773 – 2014-04-02 20:55:39