Nosql中的因果一致性是什么
已发表: 2022-12-13近年来,随着组织寻找传统关系数据库的替代方案,NoSQL 数据库变得越来越流行。 NoSQL 数据库的一个关键优势是它们可以在数据存储和访问方式方面提供高度的灵活性。 然而,这种灵活性是有代价的,其中一个权衡是因果一致性通常得不到保证。 因果一致性是分布式系统中经常使用的强一致性模型。 在一个因果一致的系统中,所有因果相关的写入必须以相同的顺序被所有客户端看到。 这意味着如果两个客户端执行因果相关的写操作,那么所有其他客户端必须以相同的顺序看到这些写操作。 这种灵活性的代价是在 NoSQL 数据库中通常不能保证因果一致性。 这意味着如果两个客户端执行因果相关的写操作,则无法保证所有其他客户端将以相同的顺序看到这些写操作。 这会导致存储在数据库中的数据不一致。 有许多因素会导致 NoSQL 数据库中的因果不一致。 一种是使用最终一致性,这是NoSQL数据库中经常使用的一致性模型。 在最终一致的系统中,写入可能不会立即对所有客户端可见,但它们最终会传播到所有副本。 这意味着存在一个时间窗口,在这个时间窗口中,不同的客户端可能会看到乱序的写入。 另一个可能导致因果不一致的因素是使用最后写入者获胜的冲突解决方案。 在最后写入者获胜的系统中,当两个客户端执行相互冲突的写操作时,最后执行该操作的客户端的写入将优先。 如果在所有客户端上执行写入的顺序不同,这可能会导致不一致。 最后写入者获胜的冲突解决方案通常用于最终一致的系统,因为它可以帮助确保最近的写入对所有客户端都是可见的。 但是,如果执行写入的顺序在所有客户端上都不相同,也会导致不一致。 一般来说,NoSQL 数据库的灵活性的权衡是它们不保证因果一致性。 这意味着存储的数据存在不一致的风险
在本文中,我将演示如何实时破坏 MongoDB 的因果一致性保证。 大多数也用于解决这个问题,第一次尝试是使用多数读写。 在此之后,我们将查看 Mongo 中的逻辑时钟间隔和混乱会话。 在这种情况下,我将使用 Mongo C# 驱动程序进行编码,但这完全取决于我。 大多数副本集成员已确认从多数读取中的查询返回的数据。 先使用多数写入再使用多数读取的想法似乎是解决我们的“写你的写”问题的一个有吸引力的解决方案。 当大多数写入被理解时,每个辅助服务器都会保留最近多数写入的内存快照。
因果一致性模型中的每个对象都被分配了一个多部分时间戳,这是通过使用它来实现的。 这些时间戳存储在一个向量中,该向量包含每个副本的对象版本号。
有一个定义。 一致性通过捕获操作之间的任何潜在因果关系,确保所有进程以相同的顺序观察交换操作。 换句话说,系统中的所有进程都对如何执行因果相关的操作有共同的理解。
以下是实现顺序一致性的步骤: a) 顺序写入的顺序一致; b) 顺序写入的一致顺序; c) 顺序写入的一致顺序。 在写因果一致性时,有必要保持因果相关的读取顺序相同。
Nosql 中的一致性是什么?
因此,NoSQL 数据库需要大量的一致性才能保持高可用性。 他们没有达到强一致性; 相反,它们会导致长期的一致性。 有时无法返回最近写入的结果,因为保证基本功能的数据存储可能无法这样做。
文档数据存储的实现比关系模型的实现更难修改。 此外,在飞行存储中重构数据的复杂性明显高于 RDBMS 的简单 ETL 转换。 如果开发人员和架构师不知道或不理解或害怕一旦犯错就会丢掉工作,就会错失这个机会。 他们会将原子事务分解为逻辑部分,而不是记住复制和延迟是过程,更糟糕的是,将第三方系统拖入过程。 它最终将被外包,其他人将继续管理该部门。
数据库中的不一致是由多种因素引起的,包括不正确或不完整的数据、缺少约束、无效触发器或错误配置的级联。 由于所有这些问题,不正确的数据可能存储在数据库中。 因此,可能会对分析和决策制定的准确性和有效性产生重大影响。 完整且一致的数据库模式是确保数据准确性和一致性的最重要步骤。 此外,定义良好的模式将确保数据正确输入数据库,并确保管理数据的规则得到正确解释。 这使分析能够通过防止不一致来准确反映数据库中的数据。
Nosql 数据库不太适合银行和 ATM 交易
数据库可靠性使用 nosql 不如使用 SQL 平滑,因为它们中的大多数使用后来的一致性模型。 因此,它们不太适合银行和 ATM 取款等交易,因为数据有时可能并不总是一致的。
什么是并发和因果相关的一致性?
并发和因果相关的一致性是当两个或多个事件同时发生并且彼此相关时存在的一种一致性。 这种类型的一致性在许多领域都很重要,例如物理学和工程学,在这些领域中需要确保事件以一致的方式发生。
分布式系统由许多共享和复制数据的计算节点组成。 一致性是一种分布式系统属性,可确保节点和副本同时具有相同的数据视图。 它是一种通过使用弱形式的一致性来保持因果相关操作顺序的实验方法。 因果一致性和顺序一致性之间的主要区别是因果一致性不需要总数量级。 一致性的直观感觉意味着只有当写入因果相关时,读取才是新鲜的。 下面提供了一个分布式系统的示例,它由四个进程组成:P1、P2、P3 和 P4。
它是一种属性,可以通过采用同意执行建立因果关系任务的操作顺序的进程数来计算。 任何满足以下要求的进程都被认为是一致的:对于任意两个进程 P 和 Q,如果 P 导致 Q 并且 Q 导致 R,则 P 在任何其他进程中导致 R。 它是对所有因果相关操作的执行顺序达成一致的进程数量的度量。 如果满足以下要求,则一个过程是一致的:P导致Q并且Q导致R,然后P导致R。一致性要求是要求之一。 当以一致的方式使用时,一致的过程更有可能产生正确的结论。 流程的一致性可以通过多种方式来衡量。 一种看待它的方法是考虑有多少进程就因果相关操作发生的顺序达成一致。 结果,就有了一致性指标。 一致性指数是衡量流程维护一致性的指标。 为了保持一致,一个流程必须满足以下要求:对于任何两个流程,P 导致 Q,Q 导致 R,因此 P 导致 R 以及 Q 和 Q。流程的一致性指标是衡量流程稳定性的指标。 如果一个进程满足这些要求,则称它符合以下条件:如果 P 导致 Q,Q 导致 R,则 P 对任意两个进程 P 和 Q 导致 R。如果一个进程不满足一致性要求,则认为它不一致。 不一致的过程更有可能导致错误的结论。 一致性指数可用于评估过程的一致性。 它是一种衡量过程一致性并识别产生更准确因果结论的过程的方法。
因果一致性与最终一致性
分布式系统中主要有两种一致性:因果一致性和最终一致性。 因果一致性保证如果两个事件相关,那么它们将被所有进程以相同的顺序看到。 最终一致性保证,如果有足够的时间,所有进程将看到相同的系统最终状态,即使它们没有看到相同的中间状态。
分布式系统中的因果一致性
一致性的一致性标准可用于确定分布式数据库中的因果关系 [1]。 如果一个操作是因果相关的,那么分布式系统的每个节点都以相同的读取和写入顺序显示相同的数据。
其他一致性模型,例如最终的和因果的,也是众所周知的。 在分布式系统中,它们比在传统数据库中更常见。 一致模型是一种奇特的说法,表示系统及其用户具有一致的协议。 当交互发生时,这些特性描述了系统的行为方式。 如果我们的系统声称是可序列化的,那么它必须显示为一个单一的全局位置,所有操作都以其全局顺序出现在所有进程中,而不管位置如何。 允许在系统认为合适的情况下交错操作。 尽管不能保证流程的真实顺序(根据定义),但在保留操作顺序时可以确保。
有些操作甚至可能看起来像几年前发生的一样。 操作(写/写)因果相关的事实意味着它们的分布顺序对于所有进程应该是统一的。 没有顺序保证,因为两个进程向 x 写入不同的值,如下图所示。 当我们停止写入新的写入时,系统最终会收敛到一个更一致的状态。 最终一致性保证声明不会对系统进行任何更新(写入),并且所有客户端都能够准确地看到它是如何工作的。 如果您将单调字符写入 100 美元的帐户,您将被收取 165 美元的费用。 当客户端更新您的读写 (RYW) 中的项目时,该项目的值将在更新完成后返回。 PRAM 是一种流水线内存,它允许进程以相同的方式查看来自单个进程的所有操作。
Mongodb 最终一致性
这意味着您正在读取的数据目前可能不一致,但最终会一致。 这是通过使用任何可以从辅助读取的 readPreferences 获得的。
在 MongoDB 中,主数据始终是异步复制的,而辅助数据是并发复制的。 MongoDB 默认为 w1:(成功写入主数据库)和 j:false 用于日志记录。 由于异步复制,当一个分区被分区到少数端或失去其主时,通常会丢失一致性。 在分区期间,我们可以调整 w 和 j 值以实现不同级别的延迟和全面的一致保证。 没有分区时,写速度下降,有写时,写不等待复制。 如果您使用的是 w 和 j 的组合,则从辅助节点读取/不读取会对一致性级别产生重大影响。 MongoDB 有四种不同级别的一致性。
最佳写入时间是没有分区且所有节点都处于活动状态; MongoDB 是一致的并且具有低延迟。 当代理主已丢失且分区已被填充时,这是最常见的写入失败类型(错误为 writeTimeout)。 我们在 MongoDB 中拥有 Best Effort 可用性,因为无论我们如何划分集群,我们总会丢失其中的一部分——至少是一个百分比。 在PACELC定理的CAP和CP/EC中,w:majority, j:true, READ from primary only可以用来将MongoDB归类为CP。
Mongodb如何保持一致性?
多个客户端可以同时读写相同的 MongoDB 数据。 MongoDB 采用锁定和并发管理来防止其客户端同时修改相同的数据。 当我们写入单个文档时,我们要么完全写入它,要么根本不写入,客户端总是看到一致的结果。
Nosql 中的最终一致性是什么?
数据建模中的最终一致性概念是为了确保对分布在多个节点上的 NoSQL 数据库所做的更改在所有节点中得到反映。 结果,随着时间的推移,相同的数据库查询将返回相同的结果。