研学指南NO.5 | 浅析分布式系统

Posted 华中科技大学网安学院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了研学指南NO.5 | 浅析分布式系统相关的知识,希望对你有一定的参考价值。




| 研学指南 |

分布式系统



        为了开拓同学们的视野,学术部开通了研学指南这一栏目。在这个栏目中,我们将搜集各种有关计算机以及网络方面的知识分享给大家,希望大家能从中有所收获,找到自己的兴趣所在。


| 主体:分布式系统 |


引⾔:

我们常常会听说,某个互联⽹应⽤的服务器端系统多么强,⽐如QQ、微信、淘宝。那么,⼀个互联⽹应⽤的服务器端系统,到底厉害在什么地⽅?为什么海量的⽤户访问,会让⼀个服务器端系统变得更复杂?今天我们就从最基本的地⽅开始,探寻服务器端系统技术的基础概念。




| 什么是分布式系统—— 分布式系统概念|


分布式系统(distributed system)是建⽴在⽹络之上的软件系统。正是因为软件的特性,所以分布式系统具有⾼度的内聚性和透明性。因此,⽹络和分布式系统之间的区别更多的在于⾼层软件(特别是操作系统),⽽不是硬件。内聚性是指每⼀个数据库分布节点⾼度⾃治,有本地的数据库管理系统。透明性是指每⼀个数据库分布节点对⽤户的应⽤来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,⽤户感觉不到数据是分布的,即⽤户不须知道关系是否分割、有⽆副本、数据存于哪个站点以及事务在哪个站点上执⾏等




| 分布式系统为什么存在——高承载量 |


当⼀个互联⽹业务获得⼤众欢迎的时候,最显著碰到的技术问题,就是服务器⾮常繁忙。当每天有1000万个⽤户访问你的⽹站时,⽆论你使⽤什么样的服务器硬件,都不可能只⽤⼀台机器就承载的了。因此,在互联⽹程序员解决服务器端问题的时候,必须要考虑如何使⽤多台服务器,为同⼀种互联⽹应⽤提供服务,这就是所谓“分布式系统”的来源。

然⽽,⼤量⽤户访问同⼀个互联⽹业务,所造成的问题并不简单。从表⾯上看,要能满⾜很多⽤户来⾃互联⽹的请求,最基本的需求就是所谓性能需求:⽤户反应⽹⻚打开很慢,或者⽹游中的动作很卡等等。⽽这些对于“服务速度”的要求,实际上包含的部分却是以下⼏个:⾼吞吐、⾼并发、低延迟和负载均衡。

⾼吞吐,意味着你的系统,可以同时承载⼤量的⽤户使⽤。这⾥关注的整个系统能同时服务的⽤户数。这个吞吐量肯定是不可能⽤单台服务器解决的,因此需要多台服务器协作,才能达到所需要的吞吐量。⽽在多台服务器的协作中,如何才能有效的利⽤这些服务器,不致于其中某⼀部分服务器成为瓶颈,从⽽影响整个系统的处理能⼒,这就是⼀个分布式系统,在架构上需要仔细权衡的问题。

⾼并发是⾼吞吐的⼀个延伸需求。当我们在承载海量⽤户的时候,我们当然希望每个服务器都能尽其所能的⼯作,⽽不要出现⽆谓的消耗和等待的情况。然⽽,软件系统并不是简单的设计,就能对同时处理多个任务,做到“尽量多”的处理。很多时候,我们的程序会因为要选择处理哪个任务,⽽导致额外的消耗。这也是分布式系统解决的问题。

低延迟对于⼈数稀少的服务来说不算什么问题。然⽽,如果我们需要在⼤量⽤户访问的时候,也能很快的返回计算结果,这就要困难的多。因为除了⼤量⽤户访问可能造成请求在排队外,还有可能因为排队的⻓度太⻓,导致内存耗尽、带宽占满等空间性的问题。如果因为排队失败⽽采取重试的策略,则整个延迟会变的更⾼。所以分布式系统会采⽤很多请求分拣和分发的做法,尽快的让更多的服务器来出来⽤户的请求。但是,由于⼀个数量庞⼤的分布式系统,必然需要把⽤户的请求经过多次的分发,整个延迟可能会因为这些分发和转交的操作,变得更⾼,所以分布式系统除了分发请求外,还要尽量想办法减少分发的层次数,以便让请求能尽快的得到处理。

由于互联⽹业务的⽤户来⾃全世界,因此在物理空间上可能来⾃各种不同延迟的⽹络和线路,在时间上也可能来⾃不同的时区,所以要有效的应对这种⽤户来源的复杂性,就需要把多个服务器部署在不同的空间来提供服务。同时,我们也需要让同时发⽣的请求,有效的让多个不同服务器承载。所谓的负载均衡,就是分布式系统与⽣俱来需要完成的功课。

由于分布式系统,⼏乎是解决互联⽹业务承载量问题,的最基本⽅法,所以作为⼀个服务器端程序员,掌握分布式系统技术就变得异常重要了。然⽽,分布式系统的问题,并⾮是学会⽤⼏个框架和使⽤⼏个库,就能轻易解决的,因为当⼀个程序在⼀个电脑上运⾏,变成了⼜⽆数个电脑上同时协同运⾏,在开发、运维上都会带来很⼤的差别。



| 分布式系统提高承载量的基本手段|

缓冲技术——提高承载量的手段之一

在互联⽹服务中,⼤部分的⽤户交互,都是需要⽴刻返回结果的,所以对于延迟有⼀定的要求。⽽类似⽹络游戏之类服务,延迟更是要求缩短到⼏⼗毫秒以内。所以为了降低延迟,缓冲是互联⽹服务中最常⻅的技术之⼀。

早期的WEB系统中,如果每个HTTP请求的处理,都去数据库(mysql)读写⼀次,那么数据库很快就会因为连接数占满⽽停⽌响应。因为⼀般的数据库,⽀持的连接数都只有⼏百,⽽WEB的应⽤的并发请求,轻松能到⼏千。这也是很多设计不良的⽹站⼈⼀多就卡死的最直接原因。为了尽量减少对数据库的连接和访问,⼈们设计了很多缓冲系统——把从数据库中查询的结果存放到更快的设施上,如果没有相关联的修改,就直接从这⾥读。 最典型的WEB应⽤缓冲系统是Memcache。由于php本身的线程结构,是不带状态的。

早期PHP本身甚⾄连操作“堆”内存的⽅法都没有,所以那些持久状态,就⼀定要存放到另外⼀个进程⾥。⽽Memcache就是⼀个简单可靠的存放临时状态的开源软件。很多PHP应⽤现在的处理逻辑,都是先从数据库读取数据,然后写⼊Memcache;当下次请求来的时候,先尝试从Memcache⾥⾯读取数据,这样就有可能⼤⼤减少对数据库的访问。


研学指南NO.5 | 浅析分布式系统

然⽽Memcache本身是⼀个独⽴的服务器进程,这个进程⾃身并不带特别的集群功能。也就是说这些Memcache进程,并不能直接组建成⼀个统⼀的集群。如果⼀个Memcache不够⽤,我们就要⼿⼯⽤代码去分配,哪些数据应该去哪个Memcache进程。——这对于真正的⼤型分布式⽹站来说,管理⼀个这样的缓冲系统,是⼀个很繁琐的⼯作。因此⼈们开始考虑设计⼀些更⾼效的缓冲系统:从性能上来说,Memcache的每笔请求,都要经过⽹络传输,才能去拉取内存中的数据。这⽆疑是有⼀点浪费的,因为请求者本身的内存,也是可以存放数据的。——这就是促成了很多利⽤请求⽅内存的缓冲算法和技术,其中最简单的就是使⽤LRU算法,把数据放在⼀个哈希表结构的堆内存中。⽽Memcache的不具备集群功能,也是⼀个⽤户的痛点。

于是很多⼈开始设计,如何让数据缓存分不到不同的机器上。最简单的思路是所谓读写分离,也就是缓存每次写,都写到多个缓冲进程上记录,⽽读则可以随机读任何⼀个进程。在业务数据有明显的读写不平衡差距上,效果是⾮常好的。

然⽽,并不是所有的业务都能简单的⽤读写分离来解决问题,⽐如⼀些在线互动的互联⽹业务,⽐如社区、游戏。这些业务的数据读写频率并没很⼤的差异,⽽且也要求很⾼的延迟。因此⼈们⼜再想办法,把本地内存和远端进程的内存缓存结合起来使⽤,让数据具备两级缓存。同时,⼀个数据不在同时的复制存在所有的缓存进程上,⽽是按⼀定规律分布在多个进程上。——这种分布规律使⽤的算法,最流⾏的就是所谓“⼀致性哈希”。这种算法的好处是,当某⼀个进程失效挂掉,不需要把整个集群中所有的缓存数据,都重新修改⼀次位置。你可以想象⼀下,如果我们的数据缓存分布,是⽤简单的以数据的ID对进程数取模,那么⼀旦进程数变化,每个数据存放的进程位置都可能变化,这对于服务器的故障容忍是不利的。

Orcale公司旗下有⼀款叫Coherence的产品,是在缓存系统上设计⽐较好的。这个产品是⼀个商业产品,⽀持利⽤本地内存缓存和远程进程缓存协作。集群进程是完全⾃管理的,还⽀持在数据缓存所在进程,进⾏⽤户定义的计算(处理器功能),这就不仅仅是缓存了,还是⼀个分布式的计算系统。


除了缓冲技术,提高承载量的方式还有分层模型(路由、代理)、并发模型(多线程、异步)、存储技术(NoSQL)等,有兴趣的话可以进一步了解。




| 分布式系统 设计难点|


虽然分布式系统具有很多优点,然⽽由于分布式系统⾃身的特点及应⽤环境的复杂性,分布式系统设计有很多难题需要解决:

   1.部分失效问题

由于分布式系统通常由若⼲部分组成,各个部分由于各种原因可能发⽣故障,如硬件故障、软件错误及错误操作等。如果⼀个分布式系统不对这些故障进⾏有效的处理,系统某⼀组成部分的故障可能导致整个系统的瘫痪。

   2.性能和可靠性过分依赖于网络

由于分布式系统是建⽴在⽹络之上的,⽽⽹络本身是不可靠的,可能经常发⽣故障,⽹络故障可能导致系统服务的终⽌。另外,⽹络超负荷会导致性能的降低,增加系统的响应时间。

   3.缺乏统一控制

⼀个分布式系统的控制通常是⼀个典型的分散控制,没有统⼀的中⼼控制。因此,分布式系统通常需要相应的同步机制宋协调系统中各个部分的⼯作。设计与实现⼀个对⽤户来说是透明的且具有容错能⼒的分布式系统是⼀项具有挑战性的⼯作,⽽且所需的机制和策略尚未成熟。因此什么样的程序设计模型、什么样的控制机制最适合分布式系统仍是需要继续研究的课题。

  4.难以合理设计资源分配策略

在集中式系统中,所有的资源都由操作系统管理和分配,但在分布式系统中,资源属于各节点,所以调度的灵活性不如集中式系统,资源的物理分布可能与⽤户请求的分布不匹配,某些资源可能空闲,⽽另⼀些资源可能超载。

  5.安全保密性问题

开放性使得分布式系统中的许多软件接⼝都提供给⽤户,这样的开放式结构对于开发⼈员⾮常有价值,但同时也为破坏者打开了⽅便之⻔。

针对分布式系统存在的上述难点,要保证⼀个分布式系统的正常运⾏,就必须对系统资源进⾏有效的管理,对计算机之间的通信、故障、安全等问题提供有效的处理⼿段和⽀持机制。

⽤户对分布式系统的要求是透明性、安全性、灵活性、简单性、可靠性,也要求⽅便在局部失效时重构系统,以及集成不均匀⼦系统的能⼒。

资源的分布性、缺乏全局状态信息及传输延迟,意味着集中式操作系统的某些⽅法和技术不能应⽤于分布式系统中。即使集中式系统中的某些技术满⾜上⾯的要求,其实现通常也是要付出很⼤代价的。


改自:https://wetest.qq.com/lab/view/203.html



网络空间安全学院学生会学术部

文案排版/徐良松 史圣久

审核/邹林宏 袁也

以上是关于研学指南NO.5 | 浅析分布式系统的主要内容,如果未能解决你的问题,请参考以下文章

浅析分布式系统

浅析分布式系统

浅析分布式系统

分布式系统浅析及学习路线

浅析海量用户的分布式系统设计

浅析海量用户的分布式系统设计