DBMS 中的一致性

2024 年 8 月 28 日 | 阅读 6 分钟

引言

数据库系统中的一致性是指任何给定的数据库事务只能以允许的方式更改受影响的数据。为了使数据库保持一致,写入数据库的数据必须符合所有规定的规则,包括约束、级联、触发器或任何组合。

一致性还意味着对一个表中的单个对象所做的任何更改都必须反映在该对象出现的所有其他表中。继续以驾驶执照为例,如果新驾驶员的家庭住址发生变化,则此更改必须显示在以前存在旧地址的所有表中。当一个表包含旧地址而其他表包含更新后的地址时,就会发生数据不一致。

一致性不能以应用程序员可能期望的所有方式(这是应用程序级代码的责任)确保事务的正确性。相反,一致性确保编程错误不会违反已建立的数据库约束。

DBMS 中一致性的重要性

一致的数据是使数据库像时钟一样运行的原因。已建立的规则/值将不一致的数据排除在主数据库和副本之外,从而使其进程顺利运行。

  • 精度
  • 增加数据库空间
  • 更快更高效的数据检索

数据库一致性管理着所有进入的数据。因此,当新数据添加时,数据库会发生变化,但这种变化是一致的,并且符合最初指定的验证规则。在当今的环境中,全球每天都根据数据库的明显一致性做出数十亿美元的决策。

当实时信息成为现代数字组织的新常态时,至关重要的是要建立验证方法,以使数据集不包含错误数据,因为这会增加延迟并使实时体验不那么真实。

强一致性与弱一致性

  • 强一致性意味着主副本和所有相关节点中的所有数据都符合验证规则,并且始终相同。凭借强大的数据库一致性,无论哪个客户端访问数据,他们都将始终看到符合数据库标准的最新的更新数据。
  • 弱一致性让人想起蛮荒的西部。无法保证主副本、副本或节点中的数据始终相同。印度的某个客户端可能获得数据访问权限并查看符合验证规则但不是最新更新的数据,从而导致一致性问题。他们可能正在根据不再相关(尽管曾经相关)的信息采取行动。

ACID 和 BASE 数据库一致性之间有什么区别?

提供强一致性的关系数据库通常提供“ACID 保证”。ACID 是一个缩写,代表高度一致数据库的基本特征。

提供强一致性的关系数据库通常提供“ACID 保证”。ACID 是一个缩写,代表高度一致数据库的基本特征。

  • 原子性 (Atomicity):如果事务的任何部分失败,则整个事务都将回滚。
  • 一致性 (Consistency):每次事务都会保持数据库的结构完整性。
  • 隔离性 (Isolation):每个事务都独立于其他事务。
  • 持久性 (Durability):所有事务结果都永久保存。

ACID 合规性是一个复杂且备受讨论的话题。本质上,它表示一个简单的承诺,即 READ 将提供最近成功 WRITE 的结果。虽然这看起来是一个简单的保证,但在具有多个集群(每个集群有多个节点)的全球分布式数据库结构中实现起来非常困难。

因此,符合 ACID 的数据库通常成本过高且难以扩展。

由于 SQL 数据库都在不同程度上符合 ACID,因此它们都具有相同的缺点。应该指出的是,某些 RDBMS 系统允许削弱 ACID 保证以减轻这些缺点。创建持久的分布式 SQL 数据库部署可能极其复杂且成本高昂。

因此,ACID 兼容数据库通常用于需要准确记录的金融交易。

与提供 ACID 保证的 SQL 不同,NoSQL 数据库提供 BASE 保证。

基本可用性 (Basic Availability):即使系统部分宕机,数据在大部分时间仍然可用。

软状态 (Soft state):副本不总是准确的。

最终一致性 (Eventual Consistency):数据会在某个时间点变得一致,但具体时间未知。

  • 为了提高可用性,NoSQL 数据库牺牲了一些一致性。NoSQL 数据库不提供强一致性,而是提供最终一致性。
  • 为了提高可用性,NoSQL 数据库牺牲了一些一致性。NoSQL 数据库不提供强一致性,而是提供最终一致性。
  • 在全球分布式 NoSQL 数据库实现中,某些事务可能存在重叠的可能性。在典型示例中,NoSQL 数据库可能允许两个不同的客户(一个在香港,另一个在纽约市)在同一晚预订酒店房间。
  • 许多企业应用程序没有这个问题。NoSQL 的健壮性、可用性和更低延迟的牺牲绝对值得。不满意的客户可以获得补偿,但区域中断可能导致巨大的营业额损失。

ACID 和 BASE 数据库一致性之间有什么区别?

CAP 定理捕捉了数据库一致性的另一种解释。CAP 定理最初由 Eric Brewer 提出,它断言分布式数据存储不能同时提供以下三个要求中的两个以上

一致性 (Consistency):所有相同的查询都收到相同的响应。

可用性 (Availability):即使系统部分宕机,请求也能得到响应。

分区容错性 (Partition Tolerance):即使某些节点宕机,操作仍能继续运行。

根据 CAP 定理,任何数据存储都伴随着权衡。关系型和非关系型数据存储之间的主要区别在于可用性和一致性之间的权衡。(分区容错性有时被认为是实现妥协(允许最终一致性和提高可伸缩性)的必要条件)

ScyllaDB 提供数据库一致性解决方案吗?

ScyllaDB 与大多数非关系型数据库一样,采用“最终一致性”方法。最终一致性服务于不断增长的现代工作负载,这些工作负载主要依赖于可用性,而较少依赖于强大的D一致性保证。例如,对于隔离的数据中心来说,在由中断引起的分区期间继续接受读写通常更好。

ScyllaDB 的一致性是可调的;用户可以指定其事务应该有多一致。以下是两个这样的例子

一致性级别

一致性级别是另一组预设变量,它们指定在事务被认为是有效之前,有多少副本或节点必须响应新的允许数据。此操作可以按事务进行修改。例如,程序员可以指定在识别数据一致性之前,只需要两个节点读取新输入的数据。一旦超过该阈值,就被认为是一致数据。

  • 隔离级别
    数据库的 ACID(原子性、一致性、隔离性、持久性)特性包括隔离级别。ACID 是 SQL 数据库一致性的一个基本概念,某些数据库遵循它以最大限度地提高数据库一致性。隔离是 ACID 的特性之一,它将某些数据片段与数据库网络中的其余信息分离,防止其受其他用户事务的影响。隔离用于限制由并发事务创建的无关数据的读写。
  • 隔离级别有四种类型
    1. 读未提交 (Read Uncommitted):最低级别。如果之前的事务对该行进行了未提交的更新,则该行的更新将被暂停。
    2. 读已提交 (Read Committed):这可以防止“脏读”。如果事务已经更改但尚未提交,则会阻止任何进一步的读写。
    3. 可重复读 (Repeatable Read):此级别可防止读取的行被查看和可能修改。
    4. 可串行化 (Serializable):最严格的隔离级别,可串行化通常会锁定整个数据库而不是单个数据行。

另外,

虽然 ScyllaDB 优先考虑可用性而不是一致性,但它还提供了一个用于增强一致性的 API,该 API 利用轻量级事务 (LWT)。LWT 允许数据库管理员根据各种工作负载的需求调整数据库一致性行为。

轻量级事务由一个条件语句组成,该语句允许原子“比较和设置”操作。在执行事务之前,此类操作会检查条件是否为真。如果条件不满足,则不执行事务。(这就是为什么 LWT 经常被称为“条件语句”)

LWT 不使用锁,而是使用 Raft 共识机制来确保集群中的所有节点都同意已提交的更改。因此,ScyllaDB 可以为同时需要高可用性、可预测的低延迟和弹性的应用程序提供足够的一致性。