Mongodb和Cassandra数据存储机制

时间:2012-05-30 13:50:31

标签: mongodb cassandra

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

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

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

我在stackoverflow中搜索MongoDB与cassandra,并阅读了大约10个帖子,但我的问题无法通过这些帖子中的答案清除。请清除我的疑虑,如果我错了,也要纠正我。

3 个答案:

答案 0 :(得分:1)

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

只要所有内容都处于同步状态,任何辅助节点都可以成为主节点,因为这意味着辅助节点具有所有数据。每个节点的磁盘大小不必相同,这取决于复制何时完成,但是,它们具有相同的数据(只要它们同步)。

我对Cassandra不太了解,抱歉!

答案 1 :(得分:1)

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

Cassandra是Amazon Dynamo的混合体,它继承了复制和分片,以及Googles 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的这篇文章也可能会派上用场 至于分片大小,我认为这些可能会因您的机器以及密钥环的给定区域有多热而有所不同。

答案 2 :(得分:0)

Cassandra通常不会在所有节点上保留所有数据。正如您所说,这将破坏其分布式数据模型提供的一些优势(特别是快速写入会受到阻碍)。客户端在写入时可以自定义所需的复制量(多少节点应保留数据副本)。因此,您可以将其设置为跨所有节点进行复制,或者只将数据保存在单个节点而不进行复制。它取决于你。写入数据的特定节点由密钥的散列值确定。每个节点都会分配一个它将存储的哈希值范围,因此当您查找某个值时,该密钥将再次进行哈希处理,并指示在哪个节点上查找数据。