分布式系统:CAP 定理

欢迎来到分布式系统系列。在本文中,我们将学习并理解什么是 CAP 定理。CAP 代表一致性、可用性和分区容错性。当我们谈论CAP定理时,我们主要谈论的是分布式系统。首先,让我们了解一下什么是分布式系统。分布式系统是由运行在单台或多台机器上的多个进程组成的系统。在本次讲座中,我们将从分布式系统的角度使用简单的数据库类比来了解 CAP 定理。

什么是 CAP 定理?

CAP定理指出,在分布式系统中,当网络分区发生时,我们只能选择一致性或可用性。这是埃里克·布鲁尔(Eric Brewer)为了理解分布式系统而创造的。CAP 代表一致性、可用性和分区容错性。 

  • 一致性:所有客户都会看到最新的数据。
  • 可用性:即使包含最新数据的节点发生故障,系统也可用并返回数据。
  • 分区容错性:尽管网络出现故障,系统仍应正常工作。

现在,我们已经了解了CAP定理的定义。接下来,我们将了解它在设计或选择数据库、缓存、存储等分布式系统时如何发挥作用。

我们先通过一个简单的类比来理解。我们将向 MySQL 数据库插入一条记录。MySQL 服务器在单台机器上以单个进程运行,以处理读取和写入请求,如下图所示。 

客户端想要读取记录并将其写入关系型 MySQL 数据库。由于数据库实例运行在单机上,系统将保持一致,这意味着客户端将看到最近的写入。如果节点发生故障或者客户端与数据库服务器之间出现网络故障,系统将不可用。 

应用服务器

随着用户数量的增长,我们的数据库应该扩展更多的读取和写入。有多种方法可用于扩展数据库,但我们将讨论在复制或分区数据库时如何应用 CAP 定理。这就是分布式系统的实际应用。为了扩展更多的读取,对于主数据库中发生的每个更改,我们都会将数据从 mysql 主数据库复制到副本。这种方法有助于将写入和读取请求拆分到在不同计算机上运行的单独 MySQL 实例。 

如下图所示,MySQL 实例运行在 master 上,master 接受写入请求。然后,所有写入都会复制到副本计算机中以处理读取请求。与之前的单实例设置相比,我们将写入和读取分离到不同的机器中。

现在,我们已经分发了 MySQL 数据库,它服务于主服务器的写入和读取并复制 MySQL 实例。让我们看看如何使用 CAP 定理来定义此 MySQL 设置。由于我们的数据库设置是分布式的,默认情况下它是分区容忍的,这意味着当某些节点发生故障时,系统应该处理一些客户端请求。

在上面的例子中,我们没有对数据库进行分区。相反,我们仅添加了复制来扩展读取请求。如果主节点发生故障,副本实例可用于服务读取请求。这与之前的单实例设置有点不同。CAP定理指出,在分布式系统中,我们只能选择一致性或可用性。

选择一致性或可用性

假设我们的数据库系统要求高度一致。当客户端发出请求时,它应该随时返回最新的数据。让我们考虑一个将记录写入主数据库的简单场景。

 如果副本机器不可用,那么主数据库有两种选择,

  • 它可能会向客户端返回错误。(同步)
  • 可以将数据写入本机并成功返回。(异步) 

如果我们选择第一个选择,我们会将错误返回给客户端。如果主实例和副本实例之间发生网络分区,我们的系统将保持高度一致。由于主实例和副本实例具有相同的数据,因此我们的客户端将读取最近的写入。我们的系统现在更多的是CP。

如果我们选择第二个选择,我们的系统将具有高可用性。它将向我们的客户端返回成功的响应并将写入存储到我们的本地计算机。我们的写入将在稍后的时间点异步复制。同时,如果写入主实例的客户端从副本实例中读取数据,它可能会也可能不会看到最新的数据。这是由于网络分区或网络故障导致异步复制延迟。

我们的系统现在更像是一个 AP,因为由于主服务器和副本服务器之间的网络分区,我们的客户端可能看不到只读副本中的最新数据。

在分布式系统中,不可能实现 CAP 的所有三个属性。我们只能选择其中的任意两个CAP,例如CA、CP、AP。CA没有任何意义。在大多数情况下,分布式系统是分区容忍的。所以,我们要么选择CP,要么选择AP。

当我们选择上例中的第一个选项来选择CP时,并不是说我们的系统将不可用。当主实例无法连接到副本实例时,我们的数据库将无法响应写入。在这种情况下,我们更看重一致性而不是可用性。

我们可以将分布式系统称为 CP 或 AP,因为这些属性在某些场景(例如网络故障)中受到青睐。在这里,我们不能牺牲 P(分区容错性),因为分布式系统默认是分区容错的。 

因此,如果没有 P,我们就无法构建任何分布式系统。我们必须支持 C (CP) 或 A(AP) 来定义我们的系统。

结论

在本文中,我们了解了 CAP 定理以及如何使用它来定义分布式系统的属性。当我们构建分布式数据库、缓存、存储等时,我们可以选择决定我们的系统应该如何表现。无论是在某些场景下必须支持一致性还是可用性,在本文中,我们已经了解了分布式 MySQL 只读副本的属性以及在网络故障期间我们可以从中得到什么。


更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/233540.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter之压力测试总结!

一、基本概念 1.线程组N:代表一定数量的并发用户,所谓并发就是指同一时刻访问发送请求的用户。线程组就是模拟并发用户访问。 2.Ramp-Up Period(in seconds):建立所有线程的周期,就是告诉jmeter要在多久没启动所有线程&#xff…

Intellij idea 快速定位到文件的开头或者结尾的几种方式

方式一:Scroll To Top / Scroll To Bottom 首先打开Keymap设置,并搜索Scroll To 依次点击File->Settings->Keymap可打开该界面 对于Scroll To Top 快速滑动定位到文件顶部, Scroll To Bottom快速定位到文件底部 默认是没有设置快捷键的…

民安智库(第三方公众满意度调查):专业助力咖啡店客户满意度调查

近期,一家知名的咖啡店品牌面临着市场竞争加剧和服务质量提升的挑战。为了更好地了解客户需求和提升客户满意度,该咖啡店决定委托民安智库(第三方满意度测评)开展一次全面的客户满意度调查。 本次调查旨在了解客户对咖啡店服务的…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

软件测试文档类型有哪些?

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

论文学习-Bert 和GPT 有什么区别?

Foundation Models, Transformers, BERT and GPT 总结一下: Bert 是学习向量表征,让句子中某个词的Embedding关联到句子中其他重要词。最终学习下来,就是词向量的表征。这也是为什么Bert很容易用到下游任务,在做下游任务的时候&a…

基于SSM线上旅行信息管理系统设计与实现

摘 要 随着旅游业的迅速发展,传统的旅行信息查询管理方式,已经无法满足用户需求,因此,结合计算机技术的优势和普及,特开发了本线上旅行信息管理系统。 本论文首先对线上旅行信息管理系统进行需求分析,从系…

13.单调栈(接雨水、柱状图最大矩形)【灵神基础精讲】

单调栈【灵神基础精讲】 https://www.bilibili.com/video/BV1VN411J7S7/ 单调栈和单调队列的关系:单调队列单调栈滑窗 单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。 适用问题:单调栈分为单调递增栈和单调递减栈&#xff0c…

21.Oracle的程序包(Package)

Oracle的程序包Package 一、Package的概述1、什么是Oracle11g的Package2、Package的作用是什么3、常见的系统内置Package 二、创建Package的相关语法1、Package的创建语法2、Package的删除3、具体案例4、Package的使用5、与Package相关的其他语法 三、常见内置程序包的使用1、…

熟悉SVN基本操作-(SVN相关介绍使用以及冲突解决)

一、SVN相关介绍 1、SVN是什么? 代码版本管理工具它能记住你每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2、SVN跟Git比,有什么优势 使用简单,上手快目录级权限控制,企业安全必备子目录checkout,减少…

修复 Apache Kafka 中的远程代码执行漏洞CVE-2023-25194

文章目录 前言一、Log4Shell connection二、DisclosureUpdates, mitigations 前言 Possible RCE and denial-of-service issue discovered in Kafka Connect 在 Kafka Connect 中发现可能的 RCE 和拒绝服务问题。 更新 阿帕奇软件基金会 (ASF) 已解决了一个漏洞,…

富必达API:一站式无代码开发集成电商平台、CRM和营销系统

一站式无代码开发的连接解决方案 电子商务、客户服务系统以及其它商业应用,是现代企业运营的重要部分。然而,将这些系统进行有效的整合往往需要复杂的API开发,这对很多企业来说是一个巨大的挑战。富必达API以其一站式的无代码开发解决方案&a…