Database 分布式(NoSQL)数据库中的一致性效应

Database 分布式(NoSQL)数据库中的一致性效应,database,consistency,acid,eventual-consistency,nosql,Database,Consistency,Acid,Eventual Consistency,Nosql,每当我读到有关NoSQL分布式数据库的内容时,他们都会提到CAP定理,这意味着在分区系统中,您可以拥有完全一致性、完全可用性,或者两者兼有一点,但决不能两者兼而有之 我不太清楚的是,他们在谈论什么样的一致性: 数据新鲜度是否一致,有些客户机可能会比其他客户机获得更旧的数据 或者是一致性,即事务可能只部分完成,这可能会使数据处于不一致的状态 对我来说,第二种解释听起来很危险,也不是真正可以接受的。第一种解释听起来可以接受,但如何防止请求一组数据的客户机无法获得部分过时数据和部分新数据 仅提供部分一

每当我读到有关NoSQL分布式数据库的内容时,他们都会提到CAP定理,这意味着在分区系统中,您可以拥有完全一致性、完全可用性,或者两者兼有一点,但决不能两者兼而有之

我不太清楚的是,他们在谈论什么样的一致性:

  • 数据新鲜度是否一致,有些客户机可能会比其他客户机获得更旧的数据
  • 或者是一致性,即事务可能只部分完成,这可能会使数据处于不一致的状态
  • 对我来说,第二种解释听起来很危险,也不是真正可以接受的。第一种解释听起来可以接受,但如何防止请求一组数据的客户机无法获得部分过时数据和部分新数据


    仅提供部分一致性有多危险?可能产生的负面影响是什么?

    分布式数据库中的一致性是一个巨大的问题,它意味着两种选择:某些地方的过时数据和部分完成的事务。我不打算写一篇关于它的文章,因为它是一个巨大的问题,解决方案并不容易。然而,这里有一些关键的短语

    最终一致性是解决这一问题的方法,但实施它听起来像是一项艰巨的工作。实现的关键是幂等消息。假设一个完整的事务涉及更新机器a、B和C上的数据。您实际上是如何做到这一点的?您开始在各地发送消息,并一直发送,直到收到接收确认和成功处理。您可以将消息发送给B两次,要么因为B从未收到消息,要么因为B的ack从未收到。如果你发送了两次,因为你从来没有收到过ack,那么B最好在它再次收到它时做正确的事情(这可能是忽略它),并向你发送ack,这样你就不再打扰它了

    ,它看起来像,从NoSQL的角度来看。在任何搜索引擎中都有大量关于幂等式消息的链接,所以我将让您四处搜索


    最后一点:Pat Helland在分布式数据库上工作了多年(在微软和谷歌等地),最终得出结论,分布式数据库的一致性是不可能的,最好通过幂等消息实现最终的一致性。

    谢谢,回答清楚。但是从实用的角度来看:假设您选择了一个现有的nosql dbms,比如cassandra,它提供了可调的一致性。是否有任何措施表明某些参数存在一致性问题的可能性?另外,是否有任何方法可以使数据模型的结构不太可能出现一致性问题?我无法回答,因为我没有使用Cassandra(并且很少使用NoSQL)。然而,当你得到分布式数据库时——任何种类的,即使只是文本文件——你迟早会遇到一致性问题,因为机器不能保证100%的运行时间,网络短时间中断,路由器或DNS配置错误,等等。除非Cassandra有自己的幂等消息系统,它有一天会通过分布式的方式失去一致性,我的意思是没有一个节点拥有所有的数据;我不包括数据库复制。