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

推荐订阅源

F
Full Disclosure
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
Y
Y Combinator Blog
Cloudbric
Cloudbric
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cybersecurity and Infrastructure Security Agency CISA
TaoSecurity Blog
TaoSecurity Blog
Security Latest
Security Latest
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
DataBreaches.Net
Security Archives - TechRepublic
Security Archives - TechRepublic
H
Hacker News: Front Page
C
Cisco Blogs
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V
Vulnerabilities – Threatpost
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
About on SuperTechFans
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
C
CXSECURITY Database RSS Feed - CXSecurity.com
Schneier on Security
Schneier on Security
T
Tenable Blog
N
News and Events Feed by Topic
W
WeLiveSecurity
有赞技术团队
有赞技术团队
AI
AI
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Latest news
Latest news
T
The Blog of Author Tim Ferriss
S
Security Affairs
Know Your Adversary
Know Your Adversary
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
Google DeepMind News
Google DeepMind News
The Cloudflare 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