3

我一直在阅读有关 MongoDB 和 Cassandra 的信息。MongoDB 是主/从,而 Cassandra 是无主的(所有节点都是平等的)。我的疑问是数据如何存储在这两者中。

假设一个用户正在向 MongoDB(一个具有主控和不同从属的集群,每个集群都在一个单独的机器上)写一个请求。这意味着主设备将决定(或通过某些应用程序实现)将此更新写入哪个从设备。也就是说,MongoDB 中的所有节点都不会提供相同的数据。每个节点的大小可能会有所不同。我对吗 ?此外,当被查询时,master 是否知道该请求应该发送到哪个节点?

在 cassandra 的情况下,相同的数据将被写入所有节点,即)如果一个节点大小为 10GB,则其他节点大小也是 10GB。因为如果只有这样的话,那么当一个节点发生故障时,用户在另一个节点查询不会丢失任何数据。我在这里吗?如果我是对的,所有节点都可以使用相同的数据,那么在 Cassandra 中使用 map/reduce 函数有什么好处?如果我错了,那么在 Cassandra 中如何维护可用性,因为相同的数据在另一个节点中不可用?

我在 stackoverflow 中搜索有关 MongoDB 与 cassandra 的内容,并阅读了大约 10 篇帖子,但我的问题无法通过这些帖子中的答案得到解决。请消除我的疑虑,如果我假设错误,也请纠正我。

4

3 回答 3

1

关于 MongoDB,是的,你是对的,只有一个主节点。

只要一切都同步,任何辅助节点都可以成为主节点,因为这意味着辅助节点拥有所有数据。每个节点不必具有相同的磁盘大小,这可能会根据复制完成的时间而有所不同,但是,它们确实具有相同的数据(只要它们是同步的)。

我对 Cassandra 了解不多,抱歉!

于 2012-05-30T14:37:43.457 回答
1

我写了一篇关于 NoSQL 存储的论文,因此我希望我能正确记住 Cassandra 的大部分内容:

Cassandra 是 Amazon Dynamo 的混合体,它从中继承了复制和分片,而 Google 的 BigTable 从中获得了数据模型。因此,Cassandra 基本上将您的数据分片,同时将其副本保存在其他节点上。让我们有一个五个节点的集群,节点称为 A 到 E。您的密钥通过一致的哈希散列到密钥环,其中密钥环的连续区域存储在给定节点上。因此,如果我们有一个从 1 到 100 的值范围,默认情况下每个节点将获得环的 1/5。A 的范围为 [1,20),B 的范围为 [20,40),依此类推。
Dynamo 的一个重要概念是三元组 (R,W,N),它告诉有多少节点必须读取、写入和保持给定值。
默认情况下,您有 3 (N) 个数据副本,这些副本存储在主节点和两个后续节点上,它们保存备份。当我从 Dynamo 论文中记得它时,您的写入默认为您的 N 个副本的前 W 个节点,其他节点最终通过 Gossip 协议进行更新。
只要一切顺利,您将获得一致的结果,如果您的主节点停机一段时间,另一个节点会通过提示切换获取您的数据。一旦主数据库返回,您的数据将被合并或尝试被合并(这部分我真的不记得了,但检查那些用于告诉更新历史的向量时钟)。因此,如果您的集群没有太大的部分出现故障,您将对数据有一致的看法。如果您的节点的较大部分已关闭,或者您仅从副本的一小部分请求,您可能会看到不一致,这(可能)最终是一致的。
希望对您有所帮助,我强烈建议您阅读有关Amazon DynamoGoogle BigTable的原始论文,但我认为您最感兴趣的是 Amazon Dynamo。此外,Werner Vogels的这篇文章也可能派上用场。
至于分片大小,我认为这些可能会因您的机器以及密钥环的给定区域的热度而异。

于 2012-05-30T15:01:30.473 回答
0

Cassandra 通常不会将所有数据保存在所有节点上。正如您所建议的那样,这将破坏其分布式数据模型提供的一些优势(特别是会阻碍快速写入)。所需的复制量(应保留多少个节点的数据副本)可由客户端在写入时自定义。因此,您可以将其设置为跨所有节点进行复制,或者仅将数据保存在单个节点上而不进行复制。由你决定。数据写入的特定节点由键的哈希值决定。每个节点都被分配了一系列哈希值,它将存储,所以当你去查找一个值时,键再次被哈希,这表明在哪个节点上找到数据。

于 2012-05-30T15:16:36.440 回答