因为工作的原因,最近打算看一些分布式学习的资料。其中这个http://book.mixu.net/distsys/就是一篇非常适合分布式入门的介绍。

这个短小的材料有下面5个小的章节,图文并茂,也没有太难的概念,非常推荐。

  1. 基础知识。主要是一些基本概念,例如可扩展性(scalability),可用性(availability)(马上就要写成bilibili了),性能(performance),容错(fault tolerance)。
  2. 上下层的抽象。CAP,敲黑板,这个是个很入门和重要的理论。
  3. 时间和顺序。强调了这两者在分布式系统里,对一致的重要性。
  4. Replication 副本(不是游戏里面的):防止divergence。这个divergence是一致性的死对头。divergence是什么,大概是set(k, v)以后,get(k) = v1, v2, ... vn 了吧。
  5. Replication 副本:容忍divergence。如果系统旨在实现weak consistence,那么可以接受一定程度的divergence。
  6. 最后作者专业地列出了所有引用的论文。真是好人。

现在我从第一章做个笔记。(年龄大了,这年头不做笔记不行啊。。。)

我比较喜欢作者的风格,每次开篇或者强调的地方都用鲜艳的颜色和醒目字号标记出来。比如第一章的导言:

Distributed programming is the art of solving the same problem that you can solve on a single computer using multiple computers.

为什么要能用一台电脑完成的事情,我们有时候需要用多台电脑来做呢?

因为一台电脑的资源往往有限。随着问题规模增加,我们升级单台电脑的硬件都可能无法完成任务。那么为什么需要分布式系统呢?

我们的目标:可扩展性

数一数房间里面有多少人很简单,但是要计算全国的人口就非常困难了。作者给可扩展性下了下面的定义。

可扩展性就是某系统,网络或者进程利索能力地处理不断增长的工作量的能力,或者自身扩大以处理这种增长的能力。

性能(performace)/延时(latency) 不解释了大家都懂。不过作者这里给了个比喻蛮有趣:

延时就是存在但未发生。比如你被某空气传染的丧尸病毒感染了。延时就是你被感染的时间和你变成丧尸的时间差。又比如,延时可以是一个写操作发生到被读者看到的时间。

可用性(availability)/容错(fault tolerance)

这是分布式系统的第二个特点。可用性表示,有多少时间某系统是能正常工作的。分布式系统能够通过把很多不可靠的组件合在一起,在之上构建一个可靠的系统。

可用性也可以表示成:

Availability = uptime / (uptime + downtime)

那啥是容错呢?系统在发生错误的情况下正常工作的能力。容错主要的问题就是,定义你能想到的错误,然后进行系统or算法设计来容忍它们。高可用性和容错是分布式系统的对使用者的承诺。

在分布式系统中,是什么导致我们没法达成上面的目标?

  • 单个节点的数量
  • 节点之间的距离

抽象和模型

抽象让我们忽略一些真实世界的繁杂,从而把注意力集中在本质问题上。模型则是抽象的产物,描述分布式系统的关键属性。这个入门教程将要介绍下吗几个分布式模型的类型:

  • 系统模型(异步/同步)
  • 容错模型(crash-fail, paritions, 拜占庭)
  • 一致性模型(强/弱一致性)

其实这些抽象和模型的建立,就是一个目标,让分布式系统表现得像“一个单节点的系统”。内部分布和表现集中,这是一个此消彼长的矛盾,给我们实现一个分布式系统造成了很多困难。如果一个系统并不做强烈地“表现得像单个系统”(高可用性和容错)

这样的承诺,那么性能会变得很好。

设计技巧:划分(Partition)和副本(Replicate)

我们的数据怎么分布在不同节点上,这是个问题。要让计算进行,我们需要定位数据并对他们进行操作。数据的操作有两种方式:

  • Partition
  • Replicate

Partition就是把我们的数据集打撒成不同几份,分开存储。而replicate则是把数据复制多份,分开存储。如下图(再次喜欢这个画风)

这个在存储里面的应用就是RAID0/1了,我们叫Stripe和Mirror。

Replication 允许我们实现可扩展性,性能和容错。不过这也是许多问题的源泉,因为我们面临的是多个独立的数据拷贝,他们需要在多台机器上保持同步。这就是说要实现某种一致性模型。

一致性模型的实现蛮重要。好的一致性模型对程序员(这里应该指的是Client,分布式系统的调用者)来说语义清楚,容易理解,同时也满足业务和设计的目标,例如高可用性或者强一致性。

仅有强一致模型允许你像使用单节点系统一样。其他一致性模型或多或少暴露了一些内部的实现。不过弱一致系统可以提高低延时和更高的可用性,并不一定难以理解,各有秋色罢了。

Summary

这章除了讲解一些概念,反复强调的一个问题就是如果解决在多台机器上实现一台机器的事务的矛盾。如果你暴露更多细节,表现得很”分布“,那么你性能就更好,但是理解起来可能会比较难。

[分布式系统学习]阅读笔记 Distributed systems for fun and profit 之一 基本概念的更多相关文章

  1. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 之四 Replication 拷贝

    阅读http://book.mixu.net/distsys/replication.html的笔记,是本系列的第四章 拷贝其实是一组通信问题,为一些子问题,例如选举,失灵检测,一致性和原子广播提供了 ...

  2. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 之三 时间和顺序

    这是阅读 http://book.mixu.net/distsys/time.html 的笔记,是该系列的第三章. 为什么时间和顺序很重要呢?为什么我们关系事件A发生在事件B之前? 因为分布式系统要解 ...

  3. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 抽象 之二

    本文是阅读 http://book.mixu.net/distsys/abstractions.html 的笔记. 第二章的题目是"Up and down the level of abst ...

  4. Mongodb Manual阅读笔记:CH4 管理

    4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  5. Distributed systems theory for the distributed systems engineer

    Gwen Shapira, SA superstar and now full-time engineer at Cloudera, asked a question on Twitter that ...

  6. [置顶] 人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)

    这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...

  7. 可扩展的Web系统和分布式系统(Scalable Web Architecture and Distributed Systems)

    Open source software has become a fundamental building block for some of the biggest websites. And a ...

  8. 论文阅读笔记 Improved Word Representation Learning with Sememes

    论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...

  9. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

随机推荐

  1. linux环境中nagios(nagios core)安装?nagios安装?

    需求描述: 最近准备给线上生产环境部署监控平台,对各个系统的资源使用情况,服务进行监控,采用nagios core版本进行部署, nagios core是开源版本的软件,是免费的nagios XI是上 ...

  2. c# 匿名反序列化

    1.先new一个匿名对象,然后再反序列化好处是能点点点,坏处是得先new匿名对象 2.借用Newtonsoft.Json.Linq.JObject.Parse,好处是不需要new匿名对象,坏处是不能点 ...

  3. C语言对文件的基本操作

    在C语言中,对于文件的操作是利用FILE结构体进行的. 几个常用的操作文件函数简介 1:打开文件 FILE *fopen( const char *filename, const char *mode ...

  4. git push 问题汇总

    Q:git push时卡死 这个问题找的快要放弃的时候... A: git config --global http.postBuffer [via] Q:git push 报错 Counting o ...

  5. 子窗口访问父页面iframe中的iframe,top打开的子窗口访问父页面中的iframe中的iframe

    子窗口访问父页面iframe中的iframe 子窗口访问最顶层页面中的iframe中的iframe top打开的子窗口访问父页面中的iframe中的iframe top打开的子窗口访问最顶层页面中的i ...

  6. PostgreSQL存储过程(1)-基于SQL的存储过程

    什么是SQL函数? SQL函数包体是一些可执行的SQL语言.同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果. 除非SQL函数声明为返回void,否则最后一条语句必须是S ...

  7. Nginx(九)-- Nginx实际使用配置

    1.由于在nginx中需要配置很多东西,就会使得nginx.conf配置文件过于臃肿,所以我们会将配置文件合理的切分.大体的配置依然在nginx.conf中,其他的配置会放在etc下面的目录中. 2. ...

  8. Memcached 命令行操作

    telnet 用于连接 Memcached: [root@localhost ~]# telnet Trying 127.0.0.1... Connected to 127.0.0.1. Escape ...

  9. Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...

  10. 《C++ Primer Plus》16.4 泛型编程 学习笔记

    STL是一种泛型编程(generic programming).面向对象编程关注的是编成的数据方面,而泛型编程关注的是算法.它们之间的共同点是抽象和创建可重用代码,单他们的理念决然不同.泛型编程旨在编 ...