带着问题学习分布式系统

  很长一段时间,对分布式系统都比较感兴趣,也听说过、了解过其中一些相关的知识点,但都比较零碎。一直想系统的学习一下,但是一拖再拖,写下本文,也是希望能督促自己。

写在前面

  听过很多道理,却依然过不好这一生。

  看过很多关于学习的技巧、方法,却没应用到自己的学习中。

  随着年纪变大,记忆力越来越差,整块的时间也越来越少,于是,越来越希望能够更高效的学习。学习是一种习惯也是一种能力,这种能力在上学期间养成是最好的,毕竟那个时候绝大部分时间都在学习。但很遗憾,我没有养成适合自己的、好的学习习惯。工作之后,除了在日常工作中用到的知识技术,很难通过自学掌握新的知识(偏向于专业知识,即技术)。而互联网行业的分支、知识点又是如此之多,于是会出现这样的情况,遇到一个新的知识,觉得很厉害很感兴趣,看两天,但很快就忘记了。另外,对于一些比较庞杂的技术,又无从下手,也很难坚持下去。

  根本的问题在于学习不系统,没有把一个个的知识点连接起来,本来这些新的知识就很少在工作中实践,如果又是一个个的信息孤岛,很快就会被遗忘。另一个问题,没有良好的规划,今天看看这里,明天看看哪里,纠结于细枝末节,忘了从整体上把握。

  幸好,差不多半年前开始意识到了这个问题,开始看书,看别人的博客,开始思考如何充分利用好有限的时间。自己也实践了一些想法,比如写博客,坚持写博客。也有很多没做好,比如如何学习掌握一门新技术。关于这一点,其实看了许多文章,也有很多印象深刻,觉得很有道理;也有一些好书,比如《study more,learn less》。纸上得来终觉浅,绝知此事要躬行,别人的办法再好也需要亲身实践才知道是否对自己适用。

  需要学习的技术很多,要自学新知识也不是一件容易的事,选择一个自己比较感兴趣的会是一个比较好的开端,于是,打算学一学分布式系统。

  带着问题,有目的的学习,先了解整体架构,在深入感兴趣的细节,这是我的计划。

  首先得有问题,如果每日重复相同的工作,也不主动去学习,很难发现新的问题。不怕自己无知,就怕不知道自己无知,只有不断的学习,才会发现更多未知的知识领域!

带着问题出发

  分布式要解决什么问题呢?解决持久化数据太大,单个节点磁盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题。解决这些问题,有两种思路:scale up,scale out。前者就是提升单个节点的能力,更大的磁盘,更快的CPU,定制的软硬件,然而这意味着更高的价格,而且再怎么scaleup 也是有上限的。后者就是把存储、计算任务分担到普通的机器上,通过动态增加节点来应对数据量的增长,但缺点是多个节点的管理、任务的调度比较麻烦,这也是分布式系统研究和解决的问题。只有当数据量达到单机无法存储、处理的情况下才考虑分布式,不然都是自找麻烦。

  状态的维护比计算要难很多,所谓状态就是需要持久化的数据。因此主要考虑分布式存储,况且即使是分布式计算,为了节省带宽需要尽量保证data locality,也是需要分布式存储。

  现在有一堆数据,可能是结构化或者半结构化,需要将数据分片(segment、fragment、shard),形成一个个的数据子集,存储到一组物理节点上,物理节点之间通过网络通信。那么需要考虑两个问题:

  第一:数据如何划分;

  第二:数据的可靠性、可用性问题

数据分片

  数据分片是指将数据子集尽可能均衡的划分到各个物理节点上。那么会有哪些挑战呢?

  (1)如果某个物理节点宕机,如何将该物理节点负责的数据尽快的转移到其他物理节点;

  (2)如果新增了物理节点,怎么从其他节点迁移数据到新节点;

  (3)对于可修改的数据(即不是只能追加的数据),比如数据库数据,如果某节点数据量变大,怎么将部分数据迁移到其他负载较小的节点,及达到动态均衡的效果。

  (4)元数据的管理问题:当数据分布在各个节点,那么当用户使用的时候需要知道具体的数据在哪一个节点上。因此,系统需要维护数据的元数据:即每一个数据所在的位置、状态等信息。当用户需要具体的数据时,先查询元数据,然后再去具体的节点上查询。当数据在节点之间迁移的时候,也需要更新元数据。元数据的管理节点这里称之为meta server。元数据的管理也带来了新的挑战:

    (4.1)如何抽取数据的特征(特征是分片的依据,也是用户查询数据时的key),或者支持用户自定义数据特征;

    (4.2)如何保证meta server的高性能和高可用,是单点还是复制集

  (5)分片的粒度,即数据子集的大小,也是数据迁移的基本单位。粒度过粗,不利于数据均衡;粒度过细,管理、迁移成本又会比较大。

数据冗余

  前面提到,分布式系统中的节点都是普通的节点,因此有一定的概率会出现物理故障,比如断电、网络不可用,这些故障导致数据的暂时不可用;另外一些故障更严重,会导致数据的丢失,比如磁盘损坏。即使单个节点的故障是小概率,当集群中的节点数目很多是,故障就成为了一个大概率事件。因此,保证数据的高可用和可靠性是分布式系统必须解决的问题。

  为了避免单点故障,可行的办法就是数据冗余(复制集),即将同一份数据放在不同的物理节点,甚至是不同的数据中心。如果数据是一次写,多次读那很好办,随便从哪个副本读取都行。但对于很多分布式存储系统,比如数据库,数据是持续变化的,有读有写。那么复制集会带来什么样的挑战呢,需要如何权衡呢,假设有三个副本:

  (1)三个副本的地位,大家都是平等的还是有主(primary、master)有次(secondary、slave),如果是平等的,那么每个节点都可以接收写操作;如果不平等,可以一个节点负责所有的写操作,所有节点都提供读操作,

  (2)在平等的情况下,怎么保证写入操作不冲突,保证各个节点的数据是一致的,怎么保证能读取到最新的数据

  (3)不平等的情况下

    (3.1)写节点怎么将变更的数据同步到其他节点,同步还是异步;

    (3.2)非写节点能否提供读数据,如果能够允许,会不会读取到过时的数据。

    (3.3)主节点是怎么产生的,当主节点宕机的时候,怎么选择出新的主节点。是有统一的复制集管理中心(记录谁主谁次,各自的状态),还是复制集自己选举出一个主节点?

  (4)不管复制集内部的节点是平等的,还是有集中式节点的,只要有多个数据副本,就需要考虑数据的一致性可用性问题。按照CAP理论,只能同时满足一致性 可用性 分区容错性之间的二者,不同的分布式系统需要权衡。

其他

  分布式系统有自己的术语或者概念。在当前的这个时间点,我对其中的一些有了解,或者使用过;另外一些只是听说过,不甚了解;当然,还有更多的是不知道的,是需要在后续的学习中去发现、去掌握的。

  分片 副本 一致性哈希 幂等 CAP paxos raft NWR lease 两阶段提交协议 三阶段提交协议 拜占庭问题

  目前收集到的学习资料如下:

  刘杰的《分布式系统原理介绍》

  Distributed systems for fun and profit

  CMU课程:http://www.cs.cmu.edu/~dga/15-440/S14/syllabus.html

  MIT课程:http://nil.csail.mit.edu/6.824/2016/schedule.html

  前面两个是基础整体介绍,最后一个是MIT的课程,网上评价很高,也有很多人在学习。

总结:

  对于一门新技术,不要上来就开干,思考新技术解决了什么问题、已有的技术能否替代、适用场景与缺陷。对于自己(程序员),想想为什么要学、是深度还是广度知识、该技术在自己的技能树中的位置。

  对于学习,需要长期目标与短期目标相结合。长期目标很重要,但需要分解成一个个小目标,否则很容易在停顿、重拾之间打转,也很容易分心到其他杂事,也就坚持不下去了。

  本文地址:http://www.cnblogs.com/xybaby/p/6930977.html

时间: 2024-10-26 01:19:58

带着问题学习分布式系统的相关文章

带着问题学习分布式系统之数据分片

在前文中,提出了分布式系统(尤其是分布式存储系统)需要解决的两个最主要的问题,即数据分片和数据冗余,下面这个图片(来源)形象生动的解释了其概念和区别: 其中数据即A.B属于数据分片,原始数据被拆分成两个正交子集分布在两个节点上.而数据集C属于数据冗余,同一份完整的数据在两个节点都有存储.当然,在实际的分布式系统中,数据分片和数据冗余一般都是共存的. 本文主要讨论数据分片的三个问题: (1)如何做数据分片,即如何将数据映射到节点 (2)数据分片的特征值,即按照数据中的哪一个属性(字段)来分片 (3

[转]什么是分布式系统,如何学习分布式系统

什么是分布式系统 分布式系统挑战 分布式系统特性与衡量标准 组件.理论.协议 用一个请求串起来 一个简化的架构图 概念与实现 总结 references 正文 虽然本人在前面也写过好几篇分布式系统相关的文章,主要包括CAP理论.分布式存储与分布式事务,但对于分布式系统,并没有一个跟清晰的概念.分布式系统涉及到很多的技术.理论与协议,很多人也说,分布式系统是“入门容易,深入难”,我之前的学习也只算是管中窥豹,只见得其中一斑.因此,一致希望能对分布式系统有一个更全面的认识,至少能够把分布式系统中的各

什么是分布式系统,如何学习分布式系统

目录 什么是分布式系统 分布式系统挑战 分布式系统特性与衡量标准 组件.理论.协议 用一个请求串起来 一个简化的架构图 概念与实现 总结 references 正文 虽然本人在前面也写过好几篇分布式系统相关的文章,主要包括CAP理论.分布式存储与分布式事务,但对于分布式系统,并没有一个跟清晰的概念.分布式系统涉及到很多的技术.理论与协议,很多人也说,分布式系统是"入门容易,深入难",我之前的学习也只算是管中窥豹,只见得其中一斑.因此,一致希望能对分布式系统有一个更全面的认识,至少能够把

“5W1H”带你来学习JavaScript

上次的设计模式讲课,从中学习到了很多,不仅是技术上,更重要的是如何来学习.我们学习的技术,科技的更新速度超过我们的想象,对于我们这个有生命年限的个体,如何能够在有生之年能够让自己立足于科技的不败浪潮,这应该是我们思考的问题. 而通过这次设计模式,从青峰师哥身上看到了很多.为何他能够滔滔不绝的为我们讲解每一个知识点?为何在讲解每个模式的时候,他总能够把好几个模式联系到一块呢?为何他总能抓住我们忽略的地方呢?(换成是我们,我们能做到吗?) 还有我们的老师,总能够把学习与生活联系的一块,生活即学习.并

带花树算法学习笔记

带花树算法学习笔记 难得yyb写了一个这么正式的标题 Q:为啥要学带花树这种东西啊? A:因为我太菜了,要多学点东西才能不被吊打 Q:为啥要学带花树这种东西啊? A:因为我做自己的专题做不动了,只能先去"预习"ppl的专题了 Q:为啥要学带花树这种东西啊? A:因为可以用来做题啊,比如某WC题目 先推荐一个很皮很皮的带花树讲解: 戳这里嗷 QaQ 言归正传 带花树的算法用来解决一般图的最大匹配问题 说起来,是不是想起来网络流里面的最小路径覆盖? 或者二分图的最大匹配的问题? 的确,带花

TCP带外数据学习总结(概念,发送接收过程,数据到达检测,代码实现)

最近在学习<Linux高性能服务器编程> 这本书,书中零零散散的讲了TCP带外数据的一些知识,在这里把这些知识总结以下,方便自己,也方便他人. 本文主要分为以下四个方面总结,分别为 TCP带外数据的概念,如何发送和接收带外数据,怎么检测带外数据的到达,最后介绍相关函数以及代码实现. 第一部分: TCP带外数据的概念 有很多传输层此协议都具有带外数据(OUT Of Band) 的概念,其作用是迅速通告通信的另一方本段发生的重要事件.带外数据具有比普通数据更高的优先级,理论上应该被立即发送和立即接

带你一起学习C语言语法

<带你学C带你飞>第一季讲解内容:C语言语法,我们会讲变量.数组.函数.指针.结构.标准库这样一些纯粹的C语言知识. 基本上你大学第一学期学的就是咱第一季的内容,我知道很多朋友学完C语言一时感觉没什么用?然后大一学完大二就还给体育老师了--咳咳,毕竟现在是一个连程序都要刷颜值的年代--使用C语言,确实不容易写出外观炫酷的程序,但你要知道,往往一个只是好看的程序,其实更需要的是一个优秀的美工. 课程目标 C语言项目开发 适合人群 零基础 课时列表 课时1:第一个程序 课时2:打印 课时3:变量

带你系统学习GCD(三)

个人博客主站欢迎访问有系统GCD学习整合资料. dispatch_suspend / dispatch_resume 当使用Dispatch Queue 进行复杂处理的时候,有的时候希望不执行已追加的处理. 这种情况下可以挂起Dispatch Queue就可以, 当需要他执行的时候在执行恢复 // 挂起(可以理解为暂停) dispatch_suspend(queue); // 恢复 dispatch_resume(queue); dispatch_once 函数是在应用程序执行中只执行一次指定处

一线工程师带你深入学习和使用Kubernetes

http://page.factj.com/tor/xoxaHR0cDovL2RvY2tvbmUuaW8vYXJ0aWNsZS8yMzM0 Kubernetes是Google开源的容器集群管理系统,它构建于Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,利用Kubernetes能方便地管理跨机器运行容器化的应用. DockOne社区联合两位一线讲师设置了一堂针对架构师.开发工程师和运维工程师的体系课程,来帮助Kubernetes爱好者和使用者深入学习K