研究生生活真是灰常的快啊!最近导师催定方向,想想开学两个月了,真是浑浑噩噩,不知道看了啥,借着写博客,也总结一下自己看的东西吧。
离开Unity3D,转战分布式系统。更确切地说根本就没进入U3D,只是毕设的时候用了一下。现在想想,毕设的时候没人教从头学,起码做出一个东西了,现在同样没人教,整天看论文,两个月了基本没码代码。学术和实践,总有人兼得,总有人两样都不行。
实验室没人做分布式系统,于是就从网上搜看什么文章,看见知乎上有人的回答,就跟着去看,放链接:
https://www.zhihu.com/question/23645117(知乎链接,学习分布式系统需要怎样的知识)
其中有一个回答提到了这篇文章:
http://the-paper-trail.org/blog/distributed-systems-theory-for-the-distributed-systems-engineer/
文章一开始要求读的四篇文章读了三篇,这一篇就做个总结。
首先,Distributed Systems for Fun and Profit,说是文章,相当于一本小书了。这本书给他起了一个别名——《从零开始看分布式系统》,看的时候什么都不知道,没接触,也没看百度百科分布式系统的定义,直接就看了。下面介绍一下这本书大致内容,也算是看完心得吧。
首先,第一章简介,这部分看的还是相当愉快的。主要就是说为什么要分布式系统啊(一台电脑解决能力有限,咱多台电脑一起解决,所谓人多力量大,这个时候问题就来了,人多了之后需要协调啊,安排任务啊啥的,以后再说)。既然用很多台电脑,那是用高配版还是低配版(高配版贵,低配版性能不好,同时作者提出,高配版和低配版的性能差距随着节点数增加而减少,很显然,低配)?那用多少电脑合适呢(理论上,电脑越多,性能越好,容量越大。但现实往往和理想差距太大,现实中,增加电脑,会导致额外的一些开销,比如备份(为什么要备份,防止电脑坏了,信息就没了,系统就不行了),协调计算(想想是管3个人容易还是30人容易))这个时候,就有研究分布式算法的必要了,为了解决以上问题。接着,怎么判断一个分布式系统好不好呢?可扩展性(任务增多,做不过来的时候,需要增加电脑,扩展一下);性能(响应时间,延迟,吞吐量,所需资源都属于性能,这里主要说了一下延迟,分布式系统理论上存在一个最小延迟,就是信息从一个地方到另一个地方的时间,因为信息最快是光速,这里的最小时间就是信息以光速传递并且没有耽搁);可利用性(一个分布式系统,建完总不能放着供着不用吧,系统越经常使用,可利用性也越高,你可能会说,我一直用着他,性能不就满分吗?但是,你一直用着总会有故障发生,比如网络断了啥的,这个时候,如果你的系统足够健壮,在网络故障的时候也可以用,就比较牛了(容错性好),可利用性也就比较高了);可理解性(就是能不能理解这个系统,如果系统隐藏他的实现细节,留给我们必要的接口,我们只需要指定某些接口值,系统就可以帮我们做好,这样是不是很开心,很容易理解?)。我们期待的分布式系统是高可扩展性,低延迟,高可用性,容易理解。这是理想,理想和现实总存在差距(分布式系统受限)。结点(也就是构成分布式系统的电脑,可能不太精确)数量越多,故障的可能性就越大,结点之间的通信也多;结点之间距离越大,那信息传输的延迟也越大,高可扩展性,低延迟,高可用性,容易理解同时满足,难!同时,我们也期待分布式系统能像单个系统那样流畅地工作(分布式系统的矛盾),但多人合作毕竟和单人工作不同,多个人之间要协调,要交流,要相互忍让,或者哪天谁谁谁生病了等一系列问题,但单个人就不同啦,想做啥做啥,想怎么做就怎么做,生病就请假。这里特别提出生病这个情况,生病也就是发生故障,在分布式系统中,由于结点很多,故障经常会发生,不是你就是我就是他,况且前面说了,我们用的电脑都是低配版啊,更容易出故障了,这需要分布是系统具有很强的容错性!容错性!容错性!(属于可利用性里面)重要的事情用红色说三遍!啥叫容错性?就是你有错误(一个人生病了),其余人也得继续工作,不能浪费,坚决压榨劳动力!可是他都不能工作了,那他的工作谁来做?谁来经手?又一个很重要的概念来了!!!复制!也就是原本在分布式系统中能做这个工作,在做这个工作的就不只他一个人,他不能做了,还有其他人呢(容错性提高)。同时,我们在北京和上海都安排了能做这个工作的人,当北京的人有需求时,就让北京的人工作,当上海人有需求时,就让上海的人工作,这样北京的人就不用去上海才能满足需求啦~(低延迟)。但是残酷的现实又来了!当北京工作者掌握了新技能时,为了保持一致,上海工作者是不是也得学会?(一致性问题,这里需要说一下,一致性问题也是重要的一个点,分为强一致性(必须一定保持一致!),弱一致性(有时候不一致也没事),研究的点来了!MARK)同时,个人感觉,由于复制的问题,在扩展一个节点时,我们加入分布式系统中的可就不止一个节点了,那是两个,三个,四个节点啊!可扩展性方面又有新挑战。和复制类似的一个技术,可以增加可用性和性能的一个技术,就是分区了。啥叫分区,分区就是数据集太大了(现在不是流行大数据),把它分成几个地方放,一个地方放一部分数据。注意分区和复制的不同,复制是复制完全一样的,而分区分的是不一样的数据!和复制不同,分区提高性能是通过一次访问的数据量减小,性能变好;分区提高可利用性是一部分数据不能访问了,如果你恰好要访问的是另一部分数据,那就可以去没有故障的数据块访问;同时分区也有并行处理的影子啊,如果我两刚好访问同一个数据集的不同分区,就可以同时访问啦。(Mapreduce的实现就有分区和复制)。
至此,第一章结束!后面几章具体描述分布式系统中的问题,这里不再描述。分布式系统中,除了复制的一致性问题,还有时序问题(分布式系统的结点在各个地方,每个地方都有自己的时间,那不同的人在不同的机器上对同一对象请求修改,如何判断谁先请求,先做谁的修改呢?也就是事件发生的顺序。在分布式系统中,没有全局的顺序,只有部分顺序),由时序问题引出的故障检测问题(发出一个请求给一个对象,未收到回复,如何判断对象故障,还是延迟太高?),共识问题(其实这个问题我也不太理解,大致是让几个节点达成共识,都同意某个值,貌似和一致性问题有关,解决由于网络分区(网络发生故障而结点没有故障)的容错性)都在这本小书里有提及。
读的第二篇是The fallacies of distributed computing。这一篇看起来相当愉快有没有!没有复杂的算法,没有难懂的专业词汇,只是简单的描述,读的过程中不要太开心啊!这篇文章主要讲了分布式系统设计过程中的8大误区:网络是可靠的,没有延迟,带宽是无限的,网络是安全的,网络拓扑是不变的,只有一个管理者,传输消耗为0,网络是同质的。注意,这些都是错误的!!!这篇文章不仅指出了这些错误,还指出了设计师在设计分布式系统时应该注意的问题:网络不可靠,对于重要信息要确认,考虑软硬件重复等;存在延迟,尽可能少调用信息,一次调用多个信息(大批量),可用仿真系统理解系统行为;带宽有限,需要限制数据包的大小,也可用仿真系统仿真系统环境;网络不安全,需要我们构建系统时考虑网络安全,执行网络威胁模型来评估安全风险;网络拓扑经常改变,需要我们提供位置透明度;有不同的管理者,需协调;传输存在消耗,考虑性价比高的方案;网络不同质,应支持互用性,不依赖专有协议。
第三篇就是A Note on Distributed Systems啦。当时不想看这个的,但是看见说这一篇经典,也就看下来了。这一篇主要介绍本地计算和分布式计算的不同。这篇文章提出了分布式系统中部分故障(不能确定哪里,哪种故障发生,需要确保故障后,整个系统的状态是一致的,以一致性的方法做出反应),缺少中央资源管理器管理(这样容易造成一致性问题,故障不知道在哪里,同步等问题),并发问题(时序问题是解决并发问题的一个方法),内存访问问题(需要知道要访问的内容在哪,Mapreduce提供主服务器,块服务器机制),以及延迟问题(副本在一定程度上减小延迟)。
可能会发现,第一篇第一章的介绍内容就远远多于第二篇,第三篇的内容,其实,看完第一篇之后感觉看论文的进展不是很大。。。。。。。在这里强烈推荐第一篇的小书!简直分布式系统的入门必读好嘛!