原文:http://book.mixu.net/distsys/...
译:祝坤荣
1.高层面看分布式系统
分布式编程是通过使用多计算机来完成与单机算机相同问题的艺术
任何计算机系统都需要处理以下两个基本任务:
- 存储
- 计算
分布式编程是通过使用多计算机来完成与单机算机相同问题的艺术 - 通常这是因为这个问题已经不适合在单个计算机处理了。
对于分布式系统没什么是真正需要的。给你无限的金钱和无限的研发时间,我们不需要分布式系统。所有计算和存储都可以在一个神奇盒子中完成 - 你可以花钱请人为你设一个单点,极速与极可靠的系统。
尽管如此,只有极少数人有无限的资源。因此,需要找到真实世界成本与收益的平衡点。在很小规模时,升级硬件是个直接的策略。但是,当问题域规模变大时,你会达到一个点,此时硬件升级已经不能帮你解决一个单个节点能解决的问题,或者解决这个问题成本极为高昂。在那个点上,欢迎你来到分布式系统的世界。
现在的现实是只有中档配置的商用硬件最有价值 - 维护的成本可以通过采用可容错软件来降低。
高端硬件最主要的计算收益来自于它们可以用内部内存访问来代替缓慢的网络访问。高端硬件的性能优势在需要在节点间进行大量通讯的任务时十分受限。
http://book.mixu.net/distsys/...
上图引自Barroso, Clidaras & Hölzle 的 https://www.morganclaypool.co... ,当假设所有节点都使用统一的内存访问模式时,高端硬件与普通商用硬件的性能差距会变小。
一般感觉上,填加新机器会线性增长系统的性能和容量。但实际这是不可能的,因为实际上这取决于这些独立的计算机。数据需要被复制,计算任务需要被协调等等。这也是学习分布式算法是值得的 - 它们为特定的问题提供了有效的解决方案,其指导了什么是可行的,一个正确的实现可以花费最小的成本是多大,什么是不可能的。
本文关注的是分布式编程,而系统则是世俗的但是商业上常见的:数据中心。比如,我不会讨论一个特定网络配置上的特定问题,或者一个共享内存领域的问题。另外,关注点会关注在系统设计领域而不是优化某个特定设计 - 后者是个更特定领域的问题。
我们想要达到:可伸缩能力和其他好东西
我能看到,所有事情都是从处理规模大小开始的。
在规模很小时大部分事情都很简单 - 而当达到一个特定的规模后同样的问题则变得困难起来,从流量或其他物理上的限制。举起一片巧克力很简单,举起一座山就很难了。数一个屋子里有多少人很简单,数一个国家里有多少人就很难。
所以事情都是从规模开始的 - 可扩展能力。按正式的说法,一个可伸缩的系统中,当我们从小变大,事情不应该在增长中变得更糟。这是另一个定义:
可伸缩(https://en.wikipedia.org/wiki... 是系统,网络或处理器的一种能力, 以一种可靠的方式处理不断增长的工作量或能自己变大来适应这种增长。
那么什么是增长?实际上你可以通过任何方式来计算增长(人数,使用的电量等)。但有主要有以下三种需要关注:
- 数量伸缩:加入更多的节点可以让系统线性增长;数据集的增长不应该导致延迟的增长
- 地理上的伸缩: 理论上可以通过多个数据中心来降低用户查询时的响应时间,多个数据中心之间的延迟可以以一种合理的方式处理。
- 管理员伸缩: 填加更多的节点不应该增加管理员管理系统的成本(例如:管理员对机器量的比例)
当然,在真实世界的增长同时发生在很多不同的维度;每种指标只捕捉了增长中的其中一些部分。
一个可伸缩的系统可以在用户规模增长时持续满足需求。这里面有两个特定的相关领域 - 性能与可用性 - 其也可以被通过多种方式来衡量。
本文来自祝坤荣(时序)的微信公众号「麦芽面包」,公众号id「darkjune_think」
开发者/科幻爱好者/硬核主机玩家/业余翻译
转载请注明。
微博:祝坤荣
B站: https://space.bilibili.com/23...
交流Email: zhukunrong@yeah.net
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。