惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog RSS Feed
W
WeLiveSecurity
I
InfoQ
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
腾讯CDC
S
Schneier on Security
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
Attack and Defense Labs
Attack and Defense Labs
I
Intezer
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
S
Securelist
T
Tailwind CSS Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
Project Zero
Project Zero
C
Cybersecurity and Infrastructure Security Agency CISA
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
T
The Blog of Author Tim Ferriss
N
News and Events Feed by Topic
小众软件
小众软件
G
Google Developers Blog
F
Full Disclosure
O
OpenAI News
The Last Watchdog
The Last Watchdog
G
GRAHAM CLULEY
TaoSecurity Blog
TaoSecurity Blog
U
Unit 42
Jina AI
Jina AI
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
Y
Y Combinator Blog
N
News and Events Feed by Topic
K
Kaspersky official blog

Posts on Changkun's Blog

Why High-Output Systems Are Often the First to Stop Growing Dark Forest Theory: A Formal Derivation Agents (or Humans) in Goal-Directed and Goalless Environments: On Pipelines, Priors, and the Rhythm Between Exploration and Exploitation At the Boundary of Self-Reference: From Stable Structures in Artificial Intelligence to the Self as a Recursive Model in an Open Dissipative System 2023 Reading List 2022 Reading List 2021 Reading List Are PSS/USS and RSS Actually the Same Thing? Performance Differences from Page Faults vs. Prefetching 2020 Year-End Review Migration with Zero Downtime 2020 Reading List The All in Go Stack Pointers Might Not Be Ideal for Parameters Eliminating A Source of Measurement Errors in Benchmarks Setup Wordpress in 10 Minutes 我为什么不再写博客了? 2019 年终总结 2018-2019 读书清单 Ten years of blogging Rethinking the Reflections on Communications and Trusts 2018 年终总结 Go source code study is open source Go source study: unsafe Pattern Go source study: sync.Pool Go runtime programming A Million WebSocket and Go Designing Asynchronous RESTful APIs Issues of Human-Bot Interaction 压缩法与深度网络的泛化性 Go in 1 Hour UMSLT04: The Past and Present of SGD UMSLT03: A Gentle Start of Learning Theory UMSLT02: A Breif History of Neural Networks UMSLT01: A Breif History of Regularization 不笑不足以为道 论文笔记:Generalization in Deep Learning 2017 年终总结 2017 读书清单 深度学习的泛化理论简介 删除 GitHub 上已经提交的敏感信息 硕士生涯的第一年就这样告一段落了 人肉计算(10): 系统参与激励 人肉计算(9): 陷阱的解法 别聊,一聊你就暴露 人肉计算(8): 人肉计算与数据科学中的陷阱 人肉计算(7): 社会行为分析 Hexo + GitHub + Travis CI + VPS 自动部署 人肉计算(6): 预测市场 人肉计算(5): 信用风险评级模型 读书与回报 瞎扯: 对现代企业理论与当下IT企业的商业模式和信息产业链的规律性的思考 人肉计算(4): 输入数据聚合与PageRank 又一次打整了一下博客 人肉计算(3): 输入数据聚合与链路预测 人肉计算(2): 意图博弈 GWAPs 人肉计算(1): 众包与群众智慧 对后辈同学在计算机专业上的答疑与解惑 在德国的医疗及住院体验 这可能不是一个技术博客了 实验楼楼赛第3期-Python-题解 迅速更换了 DISQUS Electron 深度实践总结 良好的编码体验的三个方面 2016 年终总结 2016 读书清单 最近在着手写的文章 微信小程序文档极致总结 谈谈过去三个月在实验楼的实习经历 Built a Desktop Client for My Blog Guacamole 源码分析与 VNC 中 RFB 协议的坑 《高速上手 C++11/14》正式发布 Docker 极速入门教程02 - 镜像与容器管理 Docker 极速入门教程01 - 基本概念和操作 阶段性沉默 ELK+Redis 最佳实践 终于全面启用了 HTTPS 苹果开源了LZFSE无损压缩 Hash 碰撞的一种思路 记一次完整的 Kaldi-TIMIT 示例运行 Kaldi 上的 TIMIT 例子 Kaldi 安装与部署 从科研写作谈起 Swift API 设计指南 有趣的人类 所以其实论文并没有什么鬼用 Githug 通关记录及指南 小结一下这学期的收获 2015 读书清单 2015 年终总结 负能量爆表 转眼就快两个月了 博客迁移记录 大三总结 这个世界,终究不会是我们的。 Linux 内核分析 之六:Linux 内核创建进程的过程 小说「泽缘」 Linux 内核分析 之五:system_call中断处理过程的简要分析 大创项目的标题真是每年都在考验同学们的想象力啊 Linux 内核分析 之四:使用库函数API和嵌入汇编两种方式使用同一个系统调用
分布式杂谈01:CAP 理论的误解
Changkun Ou · 2018-06-25 · via Posts on Changkun's Blog

Published at发布于:   |   PV/UV: /   |   Reading阅读: 1 min

最近在实践分布式和微服务系统,总算是能够把课本上学到的知识学以致用了。于是打算开一个系列来随机聊一聊分布式系统的一些知识。

CAP 理论

CAP 理论中给出了 CAP 布鲁尔定理(Brewer’s theorem),它指对于一个分布式计算系统来说,不可能同时满足以下三点:

  1. 一致性(Consistency) (所有节点访问同一份最新的数据副本)
  2. 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  3. 分区容错性(Partition tolerance)(如果不能在时限内达成数据一致性,则发生分区,必须就当前操作在 C 和 A 之间做出选择。)

证明:反证法。不妨设三个性质均满足(即满足原子性、可用性以及分区容错)。那么任何包含至少两个节点的网络可以分隔为两个非空集合 $G_1, G_2$,我们将网络定义成此种形式。对于一个原子对象 $o$ 的初值 $v_0$。定义 $\alpha_1$ 为一个执行步骤的一部分,并包含了一个对原子对象的写操作,使得原子对象的值变为 $v_1$ 且在 $G_1$ 中 $v_1 \neq v_0$。 假设 $\alpha_1$ 为当前时间段内唯一的客户端请求。那么假设 $G_1$ 和 $G_2$ 之间没有通信。由于满足可用性要求,于是对象 $o$ 在 $G_1$ 中具有值 $v_1$。

同法,不妨设 $\alpha_2$ 是另一个执行步骤的一部分,作用在 $G_2$ 上,于是 $o$ 在 $G_2$ 中具有值 $v_2$。

这时,如果执行一个包含 $\alpha_1$ 和 $\alpha_2$ 的步骤,那么 $G_e$ 仅能观察到 $\alpha_2$ (没有获得关于 $\alpha_1$ 的消息)。从而在 $\alpha_2$ 上的读操作会返回 $v_0$。考虑到读请求仅发生在写操作结束后,这与原子性相违背,证明完毕。

CAP 理论的普遍误解

CAP 理论的完整表述为:Any networked shared-data system can have at most two of the three desired properties。换句话说,CAP 定律的前提是 P,当 P 决定后才有 CA 的抉择。通常人们所理解的三选二其实是一种比较大的误解。分区如果很少发生,那么在系统不存在分区的情况下没什么理由牺牲 C 或 A。其次,C 与 A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。最后,这三种性质都可以在程度上衡量,并不是非黑即白的有或无。对于可用性而言,这一指标则是在 0% 到 100% 之间连续变化的,而一致性也分很多级别,甚至连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。

ACID 理论与 AC 系统

早期的软件复杂度很低,我们的系统通常满足 ACID 理论。即 CAP 理论中 A+C 可用并一致,ACID 指:

  1. 原子性(Atomicity):要么事务执行成功、要么事务不执行(失败回滚),不存在中间状态;
  2. 一致性(Consistency):数据库要么是执行成功的最终结果状态,要么是不执行的状态。数据库不存在事务的中间执行状态;
  3. 隔离性(Isolation):多个事务之间执行过程中隔离不可见
  4. 持久性(Durability):事务一旦提交,数据就会落地,即使发生宕机,重启后看到的也是事务提交后的状态

AC 系统在业务相对简单时几乎所向披靡,但一旦业务面临增长,强一致性的原子锁会造成大量的性能消耗。

BASE 理论与 AP 系统

ACID 理论早期服务于 SQL 型数据库,但当引入了分区后事情就变得复杂了起来,根据 CAP 理论,当存在 P 后,需要在 A 与 C 中进行抉择,不能同时满足。AP 系统即为满足 BASE 理论的系统。BASE 则指下面三个方面:

  1. 基本可用(Basically Available):允许损失部分可用性,即保证核心可用
  2. 软状态(Soft State):允许系统存在中间状态,不会影响系统整体可用性
  3. 最终一致性(Eventual Consistency):数据副本经过一定时间后,最终能够达到一致的状态

这里的最终一致性是一个很有意思的话题,围绕一致性的内容有很多可以展开讨论的点。这里的最终一致性其实是弱一致性的一种特殊状况,对于一致性的具体讨论,我们留到以后讨论分布式一致性算法的时候再细说。简单来说,BASE 理论放弃了数据的强一致性,通过最终一致性来保证系统再分区异常时的基本可用性。

评述

总的来说,ACID 和 BASE 代表了两种截然相反的设计哲学,分处一致性-可用性分布图谱的两极。ACID 注重数据的一致性,是数据库的传统设计思路。而 BASE 的目的是抓住当时正逐渐成型的一些针对高可用性的设计思路,并且把不同性质之间的取舍和消长关系摆上台面。对于大规模跨区域分布的系统,包括云在内,则同时运用了这两种思路。

在实际的分布式系统实践中,CAP 理论演变为发生操作的那个短暂的间歇中,系统究竟是选择取消操作从而降低可用性,还是继续操作来冒险损失系统一致性为代价。有时系统依靠多次尝试通信的方法来达到一致性,在 Paxos 算法或者两阶段事务提交,这样的做法仅仅是推迟了决策的时间,但分布式系统终究要做一个决定;而无限期地尝试下去,本身就是选择一致性牺牲可用性的表现。这也是为什么我们说分区其实相当于对通信时限制定了一些要求。如果系统不能在规定的时间内达成数据一致,就认为发生了分区,必须在 C 和 A 之间进行决定。

Big Picture