50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

以 CockroachDB 为例,深入了解 CAP 定理

  • 2017-07-02
  • 本文字数:1782 字

    阅读完需:约 6 分钟

CAP 定理是分布式系统理论的基础,它的核心内容是说,在存在分区(如网络故障)的情况下,一个系统无法同时保证一致性(consistency)和可用性(availability),只能二选其一。

有些数据库选择了一致性,那么这类系统就被称为 CP 系统。而有些系统更看重可用性,也就是 AP 系统。一致性和可用性对于任何一个业务系统来说都是至关重要的,如何在这两者之间做出选择也就变成一个大难题。

这篇文章将说明如何在保证系统一致性的同时仍然能够保证高可用性,并以 CockroachDB 为例来解释 CAP 定理,以及为什么对于大多数数据库来说一致性更重要。

高可用性

在 CAP 定理里,可用性具有严格的二元性:一个系统要么可用,要么不可用。但在服务级别协议(SLA)里,可用性具有连续性。

例如,一个系统可以保证 99.99% 的可用性(4 个 9,也就是说每年允许宕机的时间不超过一个小时)。100% 的可用性是不现实的。工程上的高可用性要求对各种中断的严重程度进行评估,并在降低故障率所要花费的成本上做出平衡。

一个具有一致性保证的系统有时候因为网络分区出现不可用,但即使是具有可用性保证的系统,也会因为各种原因出现不可用。在一个良好的网络环境里,因网络分区造成的故障不会比其他类型的故障更常见。既然故障是不可避免的,进而导致不可用,那为什么不先保证一致性呢?

Brewer 博士说 Google 的网络很少会出现分区,Spanner 数据库理论上是“CP”,但实际上几乎是“CA”的。这听起来有点跑题了,不过却也说明了在可用性方面做出一些权衡,其影响面不会太大。

合理的权衡

在分布式系统里,权衡无处不在,我们总是要在一致性、可用性、性能和灵活性之间做出权衡。而 CAP 定理将选择的范围缩小到一致性和可用性之间,但无法涵盖所有可能造成不可用的问题根源。

有各种原因可能造成系统中断,比如硬件单点故障、应用程序的缺陷或运维人员的人为错误。而从整个系统层面来看,如果能够处理好网络分区问题,那么就有可能在不牺牲一致性的前提下提升可用性。CAP 的可用性不一定会带来实质性的可用性保证,但如果牺牲了一致性,将会给应用程序的代码带来复杂性,也意味着更高的工程成本。

假设有一个应用程序,它部署在 3 个数据中心里,客户端的流量经过负载均衡器连接到应用程序上。如果其中的一个数据中心因网络故障掉线,那么连接到这个数据中心的客户端将会遭遇中断,而不管底层的数据库是 CP 还是 CA 的。而如果负载均衡器将这些中断的客户端流量重定向到活跃的数据中心,不管底层的数据库如何处理网络分区问题,服务仍然可用。

只有当数据中心复本之间无法通信而客户端仍然能够与各个数据中心对话时,AP 系统仍然可用,而 CP 系统不可用。如果把整个系统作为整体部署来考虑,可以不用遵循 CAP 定理所要求的需要每个节点都要返回响应的原则,从而达到高可用性。

如果 AP 系统所能带来的可用性价值不高,那么为什么要为此牺牲一致性呢?理由只有一个,因为写入延迟。一致性系统在执行写入操作的时候需要协调各个节点来保证一致性(当然,有些系统对一致性读也有很高要求)。非一致性系统允许丢失数据,所以可以很快返回响应。对于速度比健壮性更重要的系统来说,或许这会是更好的选择。

CockroachDB 的 CAP

CockroachDB 是 CP 系统:每一份数据至少有 3 个复本,在写入数据时要求每个复本之间进行通信。在数据读取方面,其中的一个复本被授予一段时间的租期或一个数据子集的临时所有权,这个复本可以在不与其他复本通信的情况下处理读取请求。如果这个复本与其他复本失去联系,在租期内(默认是 9 秒钟)它仍然能够提供读取数据服务(但不能写入)。在租约到期之后,另外两个复本中的一个会得到新的租约。这样可以确保系统能够快速地从中断中恢复,提供最高的可用性,尽管它不符合 CAP 定理对可用性的定义。

CockroachDB 的强一致性基因让它有可能为分布式数据库提供与传统的非分布式数据库一样的一致性保证,同时保持高可用。对于大多数应用程序来说,CP 数据库会是更好的选择,尽管存在潜在的延迟,但它也为开发者提供了一些保证。

  • 大部分最近的写入对后续的读取是可见的。
  • 其他开发人员无法破坏应用整体的一致性。
  • 发生分区事件时,系统会阻塞,而不是返回不完整的数据。

感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-07-02 19:004432
用户头像

发布了 322 篇内容, 共 156.7 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

华为云发布多项场景化解决方案助力制造业企业加速上云

IT科技苏辞

KubeVela:云原生应用和平台工程之路

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

IoTDB Raft协议核心研发宋子阳成为Ratis Committer:分布式IoTDB深度并创新运用Raft协议保障高可用

Apache IoTDB

IoTDB Apache IoTDB

[翻译]反生产力宣言

宇宙之一粟

人生 时间管理 高效能

Excelize 发布 2.7.1 版本,Go 语言 Excel 文档基础库

xuri

开源 编程 Excel Go 语言 Excelize

制造企业如何解决数据分散和管理困难的问题,实现数字化转型?

IT科技苏辞

软件测试/测试开发丨如何开始webView 性能测试

测试人

软件测试 性能测试 自动化测试 测试开发

如何过好4000周:关于重新校准人生时间的建议

宇宙之一粟

时间管理

ChatGPT-5到底有多强?Battle!咱貌似也不输呀!

加入高科技仿生人

人工智能 AI 低代码 ChatGPT GPT-4

【亲测有效】30 岁测试工程师的 12 个破除内卷技能!

禅道项目管理

职场 互联网人 敏捷测试 测试工程师

Go 语言读取文件的几种方式

宇宙之一粟

Go 语言

借力函数计算 FC,HEROZ 打造专业级 AI 日本将棋服务

阿里巴巴云原生

阿里云 云原生 函数计算

有关TCP协议,这是我看过讲的最清楚的一篇文章了!

三十而立

2023年最强手机远程控制横测:ToDesk、向日葵、Airdroid三款APP免Root版本

陈橘又青

远程连接

联想超融合加入龙蜥社区,多产品完成与 Anolis OS 适配

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙腾计划 联想超融合

阿里巴巴内网 Java 面试 2000 题解析(2023 最新版

三十而立

不想做架构师的Gopher不是好程序员

王中阳Go

Docker 高效工作 学习方法 面试题 Go 语言

华为云开源项目OpenTiny的TinyCLI是什么时候开源的?

英勇无比的消炎药

前端 开源项目 cli UI组件库

华为云开源项目OpenTiny的TinyNG组件库的设计理念是什么?

英勇无比的消炎药

前端 开源项目 OpenTiny UI组件库

喜讯!索信达荣获CCSA TC601年度“优秀成员单位”

索信达控股

智能汽车主题 Meetup 线下报名开启!IoTDB X EMQ 为智慧车联和智能制造打造数据基础设施平台

Apache IoTDB

智能汽车 IoTDB Apache IoTDB

读懂一个项目的研发效能 之 项目人效

思码逸研发效能

研发效能 功能更新

面试造火箭?GitHub 飙升“2023(Java 岗)面试真题汇总”转载 40 万

三十而立

“PMC零距离” 赖晖:在 IoTDB 我实现了参与贡献共识协议的兴趣方向!

Apache IoTDB

IoTDB Apache IoTDB

阿里正式加入ChatGPT战局,“通义千问”上线后表现如何?

引迈信息

AI 阿里 低代码 语言模型 ChatGPT

技术实力与社区贡献的双重认可!乔嘉林成为 Apache 软件基金会 Member

Apache IoTDB

IoTDB Apache IoTDB

探索网络世界的核心:TCPIP协议四层模型解析

Java 计算机网络 网络协议 TCP/IP

Apifox:API 接口自动化测试完全指南

Apifox

测试 自动化测试 测试工具 接口工具免费 免费工具

一站式开发平台 加速企业数字化发展

力软低代码开发平台

狂刷《Java 权威面试指南(阿里版)》,冲击“金三银四”有望了

三十而立

MobTech MobPush|推送的下发逻辑是什么样的

MobTech袤博科技

以CockroachDB为例,深入了解CAP定理_语言 & 开发_薛命灯_InfoQ精选文章