初识分布式:MIT 6.284系列(一)

前言

本系列是源于「码农翻身」所属知识星球发起的读书活动,由大佬 @个人UDP不丢包 推荐而来,此次的读书活动有一些另类,咱们抛弃了传统的书籍,开始攻略最高学府的研究生顶级课程 <6.824>,该课程是不少年前的蠕虫病毒发明者Robert Morris大佬授课,归属于麻省理工大学,授课方式主要是:视频 + Lab 实验(Go 语言) + 论文,全程英语,难度较大。html

分布式系统的判断依据

  • multiple cooperating computers (多台计算机协做)
  • storage for big web sites, MapReduce, peer-to-peer sharing (大规模数据集运算,如:MapReduce,或点对点共享)
  • lots of critical infrastructure is distributed (系统的绝大部分基础设施是分布式的)
MapReduce:大规模数据集计算系统,好比计算从 1 加到 1000 亿,能够单台计算机计算,也能够利用该技术分散到多台计算机计算而后合并结果,极大的提升效率

为何须要分布式系统

  • to increase capacity via parallelism (经过并行增长系统性能)
  • to tolerate faults via replication (经过复制备份增长系统容错)
  • to place computing physically close to external entities (能够将计算放在离外部实体更近的地方)
  • to achieve security via isolation (能够经过隔离增长系统的安全)
容错:针对于容错,主要是两点,一是可用性,二是可恢复性

对于分布式系统来讲,通常不会所有服务器同时瘫痪,所以不管是服务可用仍是数据安全,都比单体服务更有保障。程序员

分布式的难点

  • 须要额外注意并发编程,对开发人员的能力要求直线上升
  • 系统内的相互做用很是复杂
  • 意想不到的错误:局部错误
  • 预期性能和实际性能每每不符
局部错误:假设一台机器天天出故障的几率是千分之一,在单体应用中,可能很长时间能够工做,可是在分布式系统中,设备数量急剧上升,天天均可能有设备出现故障,这就是所谓的局部错误,很难排查,也几乎没法避免

此处展现一张单体应用和分布式应用的对比图,图片出自:《极客时间 · 左耳听风》golang

分布式系统的解决方案

宏观目标

咱们须要设计一系列可以屏蔽分布式系统复杂性的抽象web

为何要设立此目标?

由于分布式系统自己已足够复杂,所以必须简化使用方式数据库

简化使用方式和抽象有什么关系?编程

我目前承认的最完美抽象是:文件安全

“UNIX 文件本质上就是一大袋字节。” —— 《UNIX 编程艺术》服务器

在 Unix 中,任何可读/写也就是有 I/O 的设备,不管是文件,socket,驱动,在打开设备以后都有一个对应的文件描述符。Unix 将对这些设备的读写简化在 read/write 中,换言之,你只须要把打开的文件描述符传给这两个函数,操做系统内核知道如何根据这个文件描述符获得具体设备信息,内部隐藏了对各类设备进行读写的细节,全部这些对用户都是透明的,你只须要打开它,获得 fd,再进行相应的操做就够了。网络

研究角度

  • 实现方式。并发

    • RPC 远程调用,线程和并发控制
  • 性能:

    • 一般咱们想要提供一个性能能够扩展的系统。
    • 能够经过简单增长系统的电脑数量来加强并行能力,从而部分扩展系统的性能:

      • 当没有复杂交互的时候这么作颇有效
      • 能够不用请昂贵的程序员来从新设计系统。
    • 简单增长系统内电脑数量并不能一直增长系统性能:

      • 当电脑数量变得不少的时候,负载不均,系统内每台电脑性能不均,没法并行执行的代码,初始化的交互都会下降系统的性能。
      • 来自共享资源的访问也会形成性能瓶颈,好比网络通信或者数据库等
    • 同时性能也并不能老是靠增长系统内电脑数量达成:

      • 好比来自单一用户请求的快速响应时间
      • 好比全部用户都想要更新同一个数据。
      • 一般这些状况须要更好的程序设计而不是更多的电脑。
  • 容错:

    • 大量的服务器 + 大型的系统一般表明着总有错误会发生
    • 咱们须要向应用程序隐藏这些错误
    • 咱们一般想要让系统拥有可用性和可恢复性

      • 可用性:即便错误发生了,系统仍是能够继续运行
      • 可恢复性:当错误被修复以后,系统能够恢复运行
    • 一般能够用备用的服务器来增长容错
  • 一致性:

    • 一般想要达成正确工做的系统十分困难:

      • 服务器和它的备份服务器之间很难保持一致,代价过高
      • 客户端可能会在中途出错。
      • 服务器可能会在处理以后回复以前崩溃
      • 不佳的网络可能会使得正常的服务器没法提供服务
    • 一致性和性能一般是矛盾的:

      • 高一致性须要各类基础设置之间大量的通讯
      • 许多设计为了提高性能被迫只提供弱一致性
一致性:一致性问题貌似是最难以解决的问题,由于它本质包含了性能,容错,数据一致性等等诸多要素

咱们前文说过,为了考虑容错容灾机制,须要数据进行备份,那么在分布式系统中,A 服务修改了 A 数据库的值,B 数据库的值要不要跟着改,是当即跟着改,仍是延迟跟着改,在同步修改中出问题了怎么办,在异步修改中出问题了怎么办

最终业界也很难解决相应的问题,所以如今主流的方式是:最终一致性

即容许短期内数据不一致,经过最终一致性保证性能和数据安全的兼顾

持续脑图

文件分享地址:https://www.processon.com/vie...

下一章内容

接下来的一章,咱们将进行 <6.824> 中的 Lab 1,即实现一个简单的MapReduce系统,该系统将采用 Go 语言构建

Go 语言是近些年很是热门的语言之一,其价值我的感受大于被炒的火热的 Python

本章要求

  • 了解分布式系统的由来及面临的挑战
  • 了解<6.824>课程中涉及的分布式系统解决方案
  • 搭建 Go 语言环境,写出 HelloWorld 便可(语法层面及 MR 实现将在下章学习)

最后

相关资源:

Go 官方镜像站

Go 语言 IDE

Go 语言环境搭建教程

Go 语言初识 + HelloWorld

MIT 课程表主页

B 站中文翻译视频地址

若是以为对你有用的话,不要忘记点个赞啊~ 也能够扫描二维码关注我,一块儿朝着技术人的顶峰前进!
四、二维码(白底).jpg

相关文章
相关标签/搜索