初识分布式:MIT 6.284系列(一)
前言
本系列是源于「码农翻身」所属知识星球发起的读书活动,由大佬 @我的UDP不丢包 推荐而来,这次的读书活动有一些另类,我们抛弃了传统的书籍,开始攻略最高学府的研究生顶级课程 <6.824>,该课程是很多年前的蠕虫病毒发明者Robert Morris大佬授课,归属于麻省理工大学,授课方式主要是:视频 + Lab 实验(Go 语言) + 论文,全程英语,难度较大。
分布式系统的判断依据
- 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 (可以通过隔离增加系统的安全)
容错:针对于容错,主要是两点,一是可用性,二是可恢复性对于分布式系统来说,一般不会全部服务器同时瘫痪,因此无论是服务可用还是数据安全,都比单体服务更有保障。
分布式的难点
- 需要额外注意并发编程,对开发人员的能力要求直线上升
- 系统内的相互作用非常复杂
- 意想不到的错误:局部错误
- 预期性能和实际性能往往不符
局部错误:假设一台机器每天出故障的概率是千分之一,在单体应用中,可能很长时间可以工作,但是在分布式系统中,设备数量急剧上升,每天都可能有设备出现故障,这就是所谓的局部错误,很难排查,也几乎无法避免
此处展示一张单体应用和分布式应用的对比图,图片出自:《极客时间 · 左耳听风》
分布式系统的解决方案
宏观目标
我们需要设计一系列能够屏蔽分布式系统复杂性的抽象
为什么要设立此目标?因为分布式系统本身已足够复杂,因此必须简化使用方式
简化使用方式和抽象有什么关系?我目前认可的最完美抽象是:文件
“UNIX 文件本质上就是一大袋字节。” —— 《UNIX 编程艺术》
在 Unix 中,任何可读/写也就是有 I/O 的设备,无论是文件,socket,驱动,在打开设备之后都有一个对应的文件描述符。Unix 将对这些设备的读写简化在 read/write 中,换言之,你只需要把打开的文件描述符传给这两个函数,操作系统内核知道如何根据这个文件描述符得到具体设备信息,内部隐藏了对各种设备进行读写的细节,所有这些对用户都是透明的,你只需要打开它,得到 fd,再进行相应的操作就够了。
研究角度
- 实现方式。
- RPC 远程调用,线程和并发控制
- 性能:
- 通常我们想要提供一个性能可以扩展的系统。
- 可以通过简单增加系统的电脑数量来增强并行能力,从而部分扩展系统的性能:
- 当没有复杂交互的时候这么做很有效
- 可以不用请昂贵的程序员来重新设计系统。
- 简单增加系统内电脑数量并不能一直增加系统性能:
- 当电脑数量变得很多的时候,负载不均,系统内每台电脑性能不均,无法并行执行的代码,初始化的交互都会降低系统的性能。
- 来自共享资源的访问也会造成性能瓶颈,比如网络通讯或者数据库等
- 同时性能也并不能总是靠增加系统内电脑数量达成:
- 比如来自单一用户请求的快速响应时间
- 比如所有用户都想要更新同一个数据。
- 通常这些情况需要更好的程序设计而不是更多的电脑。
- 容错:
- 大量的服务器 + 大型的系统通常代表着总有错误会发生
- 我们需要向应用程序隐藏这些错误
- 我们通常想要让系统拥有可用性和可恢复性
- 可用性:即使错误发生了,系统还是可以继续运行
- 可恢复性:当错误被修复之后,系统可以恢复运行
- 通常可以用备用的服务器来增加容错
- 一致性:
- 通常想要达成正确工作的系统十分困难:
- 服务器和它的备份服务器之间很难保持一致,代价太高
- 客户端可能会在中途出错。
- 服务器可能会在处理之后回复之前崩溃
- 不佳的网络可能会使得正常的服务器无法提供服务
- 一致性和性能通常是矛盾的:
- 高一致性需要各种基础设置之间大量的通信
- 许多设计为了提升性能被迫只提供弱一致性
- 通常想要达成正确工作的系统十分困难:
一致性:一致性问题貌似是最难以解决的问题,因为它本质包含了性能,容错,数据一致性等等诸多要素我们前文说过,为了考虑容错容灾机制,需要数据进行备份,那么在分布式系统中,A 服务修改了 A 数据库的值,B 数据库的值要不要跟着改,是立即跟着改,还是延迟跟着改,在同步修改中出问题了怎么办,在异步修改中出问题了怎么办
最终业界也很难解决相应的问题,因此现在主流的方式是:
最终一致性即允许短时间内数据不一致,通过最终一致性保证性能和数据安全的兼顾
持续脑图
文件分享地址:https://www.processon.com/view/link/5f1db0230791291b99680fa0
下一章内容
接下来的一章,我们将进行 <6.824> 中的 Lab 1,即实现一个简单的MapReduce系统,该系统将采用 Go 语言构建
Go 语言是近些年非常热门的语言之一,其价值个人感觉大于被炒的火热的 Python
本章要求
- 了解分布式系统的由来及面临的挑战
- 了解<6.824>课程中涉及的分布式系统解决方案
- 搭建 Go 语言环境,写出 HelloWorld 即可(语法层面及 MR 实现将在下章学习)
最后
相关资源:
如果觉得对你有用的话,不要忘记点个赞啊~ 也可以扫描二维码关注我,一起朝着技术人的顶峰前进!

初识分布式:MIT 6.284系列(一)的更多相关文章
- 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 分布式缓存技术redis系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 初识分布式图数据库 Nebula Graph 2.0 Query Engine
摘要:本文主要介绍 Query 层的整体结构,并通过一条 nGQL 语句来介绍其通过 Query 层的四个主要模块的流程. 一.概述 分布式图数据库 Nebula Graph 2.0 版本相比 1.0 ...
- 分布式缓存技术redis系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- 分布式缓存技术redis系列(一)——redis简介以及linux上的安装
redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...
- Spring Cloud 微服务入门(一)--初识分布式及其发展历程
分布式开发出现背景 当有计算机出现一段时间之后就开始有人去想如何将不同的电脑进行网络连接,而网络连接之后对于web的项目开发就探索所谓的分布式设计,同时人们也意识到重要的数据必须多份存在.所以分布式就 ...
- 分布式消息队列kafka系列介绍 — 核心API介绍及实例
原文地址:http://www.inter12.org/archives/834 一 PRODUCER的API 1.Producer的创建,依赖于ProducerConfig public Produ ...
- 分布式缓存技术redis系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
https://www.cnblogs.com/hjwublog/p/5639990.html
- 构建分布式Tensorflow模型系列:CVR预估之ESMM
https://zhuanlan.zhihu.com/p/42214716 本文是“基于Tensorflow高阶API构建大规模分布式深度学习模型系列”的第五篇,旨在通过一个完整的案例巩固一下前面几篇 ...
随机推荐
- TB6560电机驱动器参数设置
TB6560电机驱动器参数设置 最近接触了一些步进电机的开发,整理了一些参数设置的经验,希望能帮助到有需要的人儿~ 步进电机主要按一定的给电规律,给对应的绕组响应的电信号,电机将按一定的方向运行,而且 ...
- java 面向对象(二十一):属性的赋值顺序
* ①默认初始化 * ②显式初始化/⑤在代码块中赋值 * ③构造器中初始化 * ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值 * * ...
- redis(二十四):Redis分布式锁以及实现(python)
阅读目录 什么事分布式锁 基于redis实现分布式锁 一.什么是分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无 ...
- 数据可视化之powerBI技巧(二十)采悟:创建度量值,轻松进行分组统计
上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解.不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢? 答案当然是肯定的. 采 ...
- Linux驱动之I2C总线设备以及驱动
[ 导读] 本文通过阅读内核代码,来梳理一下I2C子系统的整体视图.在开发I2C设备驱动程序时,往往缺乏对于系统整体的认识,导致没有一个清晰的思路.所以从高层级来分析一下I2C系统的设计思路,将有助于 ...
- OSCP Learning Notes - Enumeration(2)
HTTP Enumeration Target Host IP: 10.0.0.20 Brute Forcing using DirBuster 1. Start the dirbuster and ...
- T1 找试场 题解
拖延症又犯了QwQ. 今天上午考试了,按照惯例,我仍然要把我会的所有题的题解写一遍. 1.找试场(way.cpp/in/out) 问题描述 小王同学在坐标系的(0,0)处,但是他找不到考试的试场,于是 ...
- 深入浅出ReentrantReadWriteLock源码解析
读写锁实现逻辑相对比较复杂,但是却是一个经常使用到的功能,希望将我对ReentrantReadWriteLock的源码的理解记录下来,可以对大家有帮助 前提条件 在理解ReentrantReadWri ...
- C++语法小记---开篇
几句闲话 由于C++的语法非常的复杂,但是实际使用的过程中,经常使用的语法也就那么一些,还有比较多的语法很少被使用,时间一长就容易忘记,因此“C++语法小记”主要是将C++中不经常使用和容易忘记的语法 ...
- 云上自动化 vs 云上编排
1 摘要 本文介绍了为什么在一个好的公有云或私有云中必须要有一个编排系统来支持云上自动化,以及实现这个编排系统的困难和各家的努力.同时提供了一套实现编排系统的原型,它包括了理论分析及主体插件框架,还给 ...