Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 56|回复: 0

[使用疑问] 在横向扩展数据库中数据一致性有两种形式之一

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-11-1 12:15:47 | 显示全部楼层 |阅读模式
高度一致:数据库确保数据项的每个副本和引用都相同,无论在何处访问。因此,为了避免不一致,数据有时可能不可用。 高可用性:所有数据始终可用。例如,即使另一用户正在更新文档的一个实例,您仍然可以在其写入完成之前访问旧版本。权衡是不同的用户可能会看到相同数据的不同版本。在数据模型、扩展和数据一致性方面都采用了不同的方法。这会影响它们如何提供 ACID 事务、全文搜索和全局一致的二级索引等功能。让我们详细了解一下 之间的一些不同关键功能。 交互式 ACID 写入数据库通常由一系列操作组成。假设您正在更新现有文档。该过程可能看起来有点像这样: 获取现有文档。 查找并获取引用该文档的任何索引。 编写文档的新版本。 将该新版本共享给任何副本。 更新索引中的现有引用,添加任何新引用,并删除不再适用的引用。 假设在写完新文档后,有人用反铲挖掘机穿过数据中心的电源线,而备用发电机未能按时启动。或者,更可能的是,硬盘驱动器意外发生故障并导致服务器停机。一旦服务器重新上线,一些 NoSQL 数据库就会继续运行,尽管有两个主要问题: 同一文档将有两个不同版本可供使用。 索引将不准确。 ACID 事务可以防止这些类型的不一致。在 ACID 事务中,要么每一步发生更改,要么什么都不发生。

在上面的场景中,在重新获得电源后,服务器将要么反转已发生的步骤,要么完成那些未发生的步骤。 全球二级 二级索引使在文档正文中查找数据变得更加容易和快捷。假设我们有一个人员数据库。我们可以确定每个人的电子邮件地址都是唯一的,因此我 奥地利手机号码清单 们将其用作文档的密钥。 然而,如果我们还想找到来自某个城市的人,那么数据库就必须遍历每个文档才能找到匹配的人。最终的读取可能需要花费大量时间。更有效的方法是维护每个城市的人员索引。这样,例如,如果我们想要找到来自柏林的所有人员,数据库可以在城市索引中执行一次查找以返回所有相关文档。 这些索引的准确性取决于它们的更新时间。有些数据库在后台更新索引,与编写文档本身分开。这样,就永远无法真正清楚索引是否准确或过时。另一方面,强一致的全局二级索引会在文档更新时更新。这样,它们始终是最新的。 数据库 想象一下在没有分支的情况下处理代码库。您所做的任何更改都会立即出现在主线中。它会扼杀大多数工程团队,并使 CI/CD 等创新几乎不可能。 但这就是大多数数据库的工作方式。




经过一些努力,您可以创建副本,但它既不是自动化的,也不是设计为标准路径的。数据库分支使得创建新的数据库副本就像创建 git 分支一样简单。这样,您可以作为自动化开发工作流程的一部分创建和销毁数据库分支,而不会影响主分支。 集成全文 当您预先知道需要如何检索数据时,二级索引是理想的选择。但它们在某些情况下用处不大: 查询非常罕见,不值得花费维护二级索引的开销。例如,在我们的用户配置文件中,系统可能只是偶尔需要检索具有特定饮食要求的人。 您无法预测所需的数据。假设每个用户个人资料还包括一个自由文本简历字段。如果没有简历模式,它可以保存任何数据,因此搜索也可能同样不可预测。 潜在的结果分布在多个领域。例如,检索与伦敦有联系的每个人的个人资料可能需要深入多个自由文本字段。 全文搜索比对每个文档进行强力查询更有效,因为它维护自己的索引,这些索引指向特定单词和短语的位置。 自动数据库 当数据库超出单个服务器的容量时,就会出现如何将数据分布到每个节点的问题。有几种常见的方法可以对数据库进行分片或分区,但作为应用程序开发人员,您几乎肯定不想了解这种情况是如何发生的细节。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-10 10:09 , Processed in 0.072436 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表