原文html
Gwen Shapira曾在Cloudera作工程师,如今宣传Kafka,他在Twitter问了如下问题,使我有所思考。web
我想在分布式理论上有所提高。应该从哪开始?有推荐的书?
— Gwen (Chen) Shapira (@gwenshap) August 7, 2014
我第一反应是“能够看:FLP论文、paxos论文、Byzantine将军论文”。我推荐的主要阅读材料,若是你贸然去读,你至少要阅读6个月才会有感受。由此可知,推荐一吨的理论论文让你阅读,这是了解分布式系统的错误的方式(除非你在读博士)。 论文通常是深奥、复杂的,并且须要一系列学习和丰富的经验才能感受到其贡献、才能把其放到对应的场景(以理解和应用)。算法
工程师了解分布式理论有什么好处?api
很不幸,几乎没有好的引导文章,来总结、提炼、场景化 分布式系统理论中的重要结论和想法; 特别是 通俗易懂的引导文章 更没有。
考虑这样的空白区域,让我想问另外一个问题:安全
一个分布式系统工程师应该了解什么样的分布式系统理论?app
这种状况下,了解一点点理论并非坏事。我平常工做是一个分布式系统工程师,下面会给出 我认为适合个人基本概念 们。
你认为我缺失的请告知我!cors
下面四个读物解释了构建分布式系统会遇到的困难。这些读物都勾勒了一些列 抽象而非技术 的困难,分布式系统工程师必需要克服这些困难。这些读物的后面章节有更详细的研究。dom
Distributed Systems for Fun and Profit 是一本小书,它想覆盖分布式系统中的一些基本问题,包括 时钟所起的做用、不一样策略的复制。异步
Notes on distributed systems for young bloods - 非理论,而是一个很好的实践,以让你落到实处。分布式
A Note on Distributed Systems - 一个经典论文,关于 为何你不能伪装全部远程交互像本地对象同样。
The fallacies of distributed computing 分布式计算的8个错误的推论,以提醒系统设计者。
你应该知道 安全 和 活力:
分布式系统工程师面对的许多困难能够归结为如下两个缘由:
进程间怎么共用时钟、什么样的失败能够检测、什么样的算法和原语能够被正确实现,这三者之间有很深的联系。通常状况下,咱们假设不一样节点绝对没法共用时钟(时刻值或流过了多少时间).
你应该知道:
一个系统容忍一些错误而没有降级 必须能当成 就像这些错误没有发生过同样。这意味着系统的一部分要冗余地工做(一样的功能部署多个节点),冗余是绝对必要的,冗余通常会带来性能和资源的消耗。这就是给一个系统添加冗余的基本矛盾。
你应该知道:
(多数派中有一个是主节点,其他为从节点,以主节点接收到的写请求序列为准[即串行],主节点单方面的要求从节点们接受主节点的写请求序列[从节点不得反抗、不得有异议:从节点是诚实的非恶意的、遵照全局规则的、非拜占庭的])
在分布式系统中,不多有约定的基本构建块,更多的是处于造成中的基本构建块。你应该知道下面的问题是什么,而且从哪能找到他们的解决方案:
广播 - 同时发送消息给集群
* Gossip ([经典论文](http://bitsavers.informatik.uni-stuttgart.de/pdf/xerox/parc/techReports/CSL-89-1_Epidemic_Algorithms_for_Replicated_Database_Maintenance.pdf)) * [因果广播](https://www.cs.cornell.edu/courses/cs614/2003sp/papers/BSS91.pdf) (也能够看看 [Birman](https://www.cs.rice.edu/~alc/comp520/papers/Cheriton_Skeen.pdf)和[forth](https://www.cs.princeton.edu/courses/archive/fall07/cos518/papers/catocs-limits-response.pdf) ).
链式复制 (将节点们放进一个虚拟链表中,从而能够干净的确保写请求的一致性和顺序 ).
有些事实只须要主观理解(不须要关注证实).
(一个异步系统中,假设节点崩溃后中止而不是奔溃后又恢复;一、要确保结果老是正确的,二、每次写请求可以在有限时间内返回结果。这两点无法同时知足:这就是FLP结论)
最重要的、应该不断重复的实践是:读新的、真实的系统的描述,并评价他们设计的决定。 下面是建议的系统:
若是你驯服了这个列表中的全部概念和技术,我很乐意和你聊聊Cloudera的分布式系统工程师职位。