当前位置: 首页 > 知识库问答 >
问题:

为什么MongoDB一致不可用和Cassandra可用不一致?

秦宏硕
2023-03-14

蒙戈

从这一资源中,我理解了为什么mongo不是基于以下陈述的A(高度可用)

MongoDB支持“单主”模型。这意味着您有一个主节点和多个从节点。如果主人倒台,其中一个奴隶被选为主人。这个过程会自动进行,但需要时间,通常为10-40秒。在新领导人选举期间,您的副本集已关闭,无法进行写入

是否出于同样的原因,Mongo被称为一致性(因为写入没有发生,所以返回系统中的最新数据),但不是可用(不适用于写入)?

在重新选择和写入操作处于挂起状态之前,从属返回是否可以执行读取操作?此外,用户是否在选择master后再次启动写入操作?

但我无法从另一个角度理解为什么Mongo是高度一致的,正如我们所说的mongodb在CAP定理中的地位是什么?,

默认情况下,当所有读取都转到主目录时,Mongo是一致的。

但这不是真的。如果在主/从模型下,所有读取都将转到主节点,那么从节点有什么用呢?它进一步说如果您可以选择从辅助节点启用读取,那么MongoDB最终会变得一致,可以读取过时的结果。这意味着mongo可能与主/从节点不一致(前提是我在返回之前没有配置写入所有节点)。如果所有读取和写入都转到主节点,那么说mongo是一致的对我来说是没有意义的。在这种情况下,每个其他数据库也(如cassandra)将是一致的。不是吗?

Cassandra从这个资源中,我了解了为什么Cassandra是A(Highly可用性)基于下面的语句

Cassandra支持“多主”模型。单个节点的丢失不会影响集群进行写入的能力-因此您可以实现100%的写入正常运行时间

但是我不明白为什么cassandra不是Conistent?是因为节点不可写(因为协调节点无法连接)可读,可以返回陈旧的数据吗?

共有3个答案

颛孙和悌
2023-03-14

您只需了解“时间点”:因为您只写入mongoDB master,即使从站没有更新,它也是一致的,因为它拥有在同步时刻生成的所有数据。

对卡桑德拉来说,情况并非如此。由于cassandra使用无主模型,因此无法保证其他节点拥有所有数据。在某个特定时间,节点可以具有某些最近的数据,而不具有来自尚未同步的节点的较旧数据。只有停止对所有节点的写入并将其联机,Cassandra才会保持一致。同步完成后,您就有了一致的数据。

花高爽
2023-03-14

CAP范例中的一致性还包括MongoDB支持的“最终一致性”。与ACID系统相比,读入式CAP系统不能保证安全返回。

简而言之,这意味着您的Master可以有一个更新的值,但如果您确实从Slave读取,它不一定返回更新的值,并且可以设计为没有这个更新的值。

最终一致性的概念在这里得到了很好的解释。

在建筑方面,卡桑德拉应该是一致的;它提供了一种称为“可调一致性”的最终一致性的特殊实现,这意味着客户端应用程序可以选择处理这种一致性的方法——它甚至在低级别上提供多数据中心一致性支持!Cassandra中的行不一致性带来的大多数问题都来自这样一个事实:Cassandra使用客户端时间戳来确定哪个值是最近的,而不是服务器端的,这一点一开始可能有点让人困惑。

我希望这有帮助!

周龙光
2023-03-14

在CAP中浏览:MongoDB、Cassandra和RDBMS,以便更好地理解该主题。

一致性可用性的简要定义。

一致性只是指,当您在系统/分布式系统中写入一段数据时,您从系统的任何节点读取数据时应该得到的数据。

可用性意味着,系统应该始终可用于读/写操作。

注意:大多数系统都不是,只有可用的或一致的,它们总是同时提供一些

通过上面的定义,让我们看看MongoDB和Cassandra在CAP中的位置。

MongoDB

正如您所说,当读写操作转到同一个节点时(默认情况下),MongoDB是高度一致的。此外,您可以在MongoDB中选择从其他辅助节点读取,而不是仅从leader/primary节点读取。

现在,当您尝试从辅助设备读取数据时,您的一致性将完全取决于您想要读取数据的方式:

  • 您可以询问最长的数据,例如5秒过期或,
  • 您可以说,从select语句的多数节点返回数据

同样,当您从客户机向Mongo leader写入数据时,您可以说,如果数据被复制到大多数服务器或存储在这些服务器上,则写入是成功的。

显然,从上面我们可以说MongoDb可以是高度一致的,或者根据您读/写数据的方式最终是一致的。

那么,可用性呢?MongoDB基本上总是可用的,但是,只有在领导者下台时,MongoDB才能接受写操作,直到它找到新的领导者。因此,不是高度可用的

因此,MongoDB被归类为CP。

卡桑德拉呢?

在Cassandra中,没有引线,任何节点都可以接受写操作,因此Cassandra集群始终可以进行写操作和读操作,即使某些节点出现故障。

卡桑德拉的一致性呢?与MongoDB相同,Cassandra最终可以根据您读取/写入数据的方式保持一致或高度一致。

您可以在读/写操作中提供一致性级别,例如:

  • 从一个节点读取/写入数据

假设您在读/写操作中给出了一个一致性级别。因此,一旦数据写入一个复制副本,您的写入就成功了。现在,如果您的读取请求碰巧转到另一个副本,而该副本的数据尚未更新(可能是由于网络延迟太高或任何其他原因),那么您将最终读取旧数据。

因此,Cassandra是高度可用的,但具有可配置的一致性级别,因此并不总是一致的。

总之,在他们的违约行为中,MongoDB在AP中属于CP和Cassandra。

 类似资料:
  • MongoDB遵循主从架构。数据写入主节点,然后复制到从节点。据说Mongo提供了可用性的一致性,考虑到这一点,差异可以解释为: 当master关闭时,从节点必须决定选择哪个作为master,这需要时间,因此系统在该时间窗口不可用。 另一个原因可能是:在复制期间,节点被锁定,以便将数据复制到所有从机以获得高一致性,如果我们使用从机进行读取,那么锁定意味着不可用。 但是这可能会根据Mongo允许配置

  • 问题内容: 当您添加 在命令行中,JVM给您提供了一个接近此值的堆,但最多可以出14%。JVM可以使您更接近所需的数字,但只能通过反复试验才能实现。 版画 我正在运行HotSpot Java 8 Update 5。 显然,堆可以在上面,但是为什么要这样而不是说呢? BTW == 表示应该为1024 ^ 3,比1000 ^ 3高7%,但您得到的东西比1000 ^ 3低7%。 太多的变化表明我缺少关于

  • 添加时 对于命令行,JVM会给出一个接近于该值的堆,但最多可以超出14%。JVM可以给出一个更接近您所想要的数字,但只能通过反复试验。 显然,堆可以是上面的东西,但为什么这个而不是呢? BTW==表示应为1024^3,比1000^3高7%,但您得到的值比1000^3低7%。 偏离了这么多,表明我缺少了关于堆工作方式的一些基本知识。如果我请求-xmx1000m,而它是我不会在意,我会假设它需要遵守某

  • 本文向大家介绍为什么说cookie不可以滥用?相关面试题,主要包含被问及为什么说cookie不可以滥用?时的应答技巧和注意事项,需要的朋友参考一下 1.安全问题 2.每次请求都会携带cookie,占内存,影响带宽 3.不能跨域 4.可储存的内容少

  • 本文向大家介绍请解释一下String为什么不可变?相关面试题,主要包含被问及请解释一下String为什么不可变?时的应答技巧和注意事项,需要的朋友参考一下 考察点:面向对象 不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可改变的意思就是说:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。 String 不可变

  • MongoDB文档显示了一对多关系的示例... (缩写...) 用文档引用建模一对多关系