分布式系统:核心便是通过网络使一群计算机相互通信来完成一些连贯的任务
本次,关注于 some examples,如大型网站的存储或大数据计算(比如 MapReduce),以及诸如点到点文件间共享这类的奇特的事
通常而言,我们不会在一开始便去考虑使用分布式,源于分布式需要考虑的问题过多
可以说,多数情况下,人们都是被迫使用大量计算机进行协作的,源于以此来获得高性能,即大量的 cpu,大量的内存,大量的硬盘,大量的并行等
其实,还有一层更为重要的原因:容错,即对应多台计算机去干着相同的事,存在计算机本身发生故障时,检测出来,动态切换,保证链路调用仍然正常即可
以上,其实归结于的便是性能与容错,这也是分布式系统优先会去考虑的问题,即也是为什么我们会去使用其的缘由
分布式系统难在哪里,主要在于分布式系统是由多个部分共同构成的,这些部分是并行运行着的,且存在通信,so,我们会遇到并发编程和交互上存在的各种问题,而我们也需要对之有关的东西进行时间上的控制 (超时机制、熔断机制)
另一个较难的原因,便是局部故障难以预测、难以判断,这并不像我们使用单台机器,其状态无非就是好或者不好,对应的便是服务可不可用;而分布式就不同了,其由多个机器组成,局部机器的不可用,是否会造成整个系统的不可用,这是尚不可知的;使用大型的分布式系统去解决大型问题会导致极低的容错率或者非常罕见的故障问题,这些故障问题会变得极为罕见 (上千台电脑一起运行,总会有一些电脑发生迷之崩溃或者运行错误,或者运行缓慢,或者做了错误的事情,甚至有可能是网络方面出现了问题 (谁又能确保众多的网线和交换机能正常运行,说白了,就是网络不可靠));大规模系统的设计,会让我们小概率事件变得常见,这意味着我们在开发时必须要很少发生故障,或者只需要在设计时内置无故障进行能力,即演示故障的能力
还有一个最为重要的原因的便是:我们知道,我们使用分布式系统的目的说白了就是去获取高性能,其部署上千台机器实现性能的高速提升,但实际上要做到这一点并不容易,还需要进行一些精心设计,以来达到预期的效果
即,最终构建出一个巨大的超高性能容错性分布式系统
so,为了能够构建基础架构,我们要尽可能多地将故障隐藏在应用程序中或者将之掩盖起来 (其实说白了就是分布式系统能够去处理类似的故障,返回对应的处理结果),这样应用开发人员就无须为各种各样可能发生的故障提供一套完整而复杂的应对方案
但实际上,不难发现,若是能够通过增加机器数量以来达到解决问题的目的,这通常是第一选择方案,因为机器是廉价的,而思维上的扩展提升往往才是最难的!
随笔分类
Course Preview
Core
对分布式基础架构进行抽象,主要从几个主题进行分析:如,我们所见的构建这些系统诸如远程调用 (rpc)之类的工具,其目的便是去隐藏我们底层通过不可靠网络进行通信这个事实;另一个主题我们能够看到大量的线程,我们会通过并发编程来驾驭多核计算机,线程可用于结构化操作,以此可来简化我们对并发的思考
另一个大的主题便是性能 (Performance),从高级层面上来看,分布式系统便是通过扩展来实现性能的提升;怎么来理解扩展,假如我一台计算机能够去解决的问题,我又引入了一个新的机器;此时对应的便是,解决问题的时间缩短了一半,或者说是相同时间内解决了更多的问题,这便是扩展
我们也会关注于系统的可用性,通常我们可以发现,某些系统的设计,本身就是为了去解决通用故障或者某一特定的故障而存在的,当遇到这些故障时,系统会继续运行,并且提供给你完好的服务 (这不就是我们常说的可用系统的概念吗?)
除了可用性,其实还有可恢复性:当系统遇到某些难以解决的故障时,其自身会请求停止响应,它会等待某人来对出现的问题进行修复,待修复完毕后,系统就能够继续运行,即不会再有错误发生
但,通常而言,相比可用性,我们对可恢复性的需求会更低一些,因为直到故障被修复之前,我们都不会去做任何事情
即,我们更多需求的便是,可用性系统!而我们对可用性系统的期望便是,在发生指定数目的故障之前,系统是可用的;当发生过多的故障时,系统不可用,即对请求响应;而一个优秀的可用性系统便是具有恢复性,即将可用性与可恢复性结合起来,这,便是我们所想要得到的东西
相应的还有:存储 (Storage),对应的便是易失性存储与非易失性存储,构建高性能的容错系统需要大量的技巧,避免过多写入到非易失性存储中去 (非易失性存储中进行的操作通常耗时无比)
我们关注于 "强一致性"的话题,这是出于性能与容错的考虑:假设我们开发的分布式系统,只支持两个操作,对应的便是 get()、put(),我们需要确保 get、put代表的各自含义对应的操作是什么,get就是 get,put便是 put,就好比你总不能在不知道 get、put对应的操作是什么下就去构建我们的分布式系统,对吧!
举个简单例子,对于单个系统而言,其实就是去单服务器中去进行单数据库的操作,但是在分布式系统中,由于复制或者缓存 (出于容错考虑)之类的东西,就会造成有多个 数据副本的存在,so,我们进行 get操作时,该键值可能会对应由很多不同版本,也就意味着我们 get的数据存在不一致性,这实际上是一个需要解决的痛点;实际上,对于容错性系统而言,有条规则,即要始终去访问最上层的服务器 (如果拿主服务器和它的备机来说,最上层的服务器便是主服务器),实际上规则便是这样的,你首先要与主服务器进行通信,除非它失败,再去访问它的备用服务器
so,对于 get、put我们需要去定义一些规则,规避风险的发生,以来保证一致性;即,强一致性,能够去保证看到的数据是最新的 (我们所能拿到的数据,其实就是最新的)