码迷,mamicode.com
首页 > 其他好文 > 详细

大话分布式

时间:2018-02-28 01:16:32      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:复杂   电脑   服务器   延伸   完成   机器   内存耗尽   规模   内存   

  从刚接触编程开始,就听周围大佬戏说分布式架构、各种高并发场景。唬得本萌新一愣一愣的。总盼望自己有一天可以像他们一样秀操作(话外音:陈独秀同志请坐下,李大钊同志有话说。手动滑稽)。慢慢的随着自己编程能力提高,项目经验丰富,也能一窥其中门道。原来分布式系统早已存在,并在上世纪七八十年代就已经有各种分布式系统出现。只是在互联网时代,分布式系统才大放异彩,被更多的人了解、运用。本文从三个方面阐述分布式系统。

一、"拆"出来的分布式

  对于系统:“大系统小做”,其精髓在于一个拆。对一个大的复杂系统,首先拆成多个子系统。每个子系统自己的存储/Service/接口层,各个子系统独立开发、测试、部署、运维。从团队管理角度讲,也可以不同团队用自己熟悉的语言体系,团队之间基于多种协议进行接口调用,职责清晰,各司其职。

  小系统也可以在业务需要时进行适当拆分,在一个系统里面,某个模块复杂到一定程度,会把它抽出来,单独做成一个系统;而在初期,很大简单模块,可能不回拆分,集中在一个系统里面。 

  对于存储:非关系型数据库,比如MongoDB,其天生就是分布式的,很容易实现数据的分片。关系型数据库,比如Mysql,或者其它关系型数据库,就会设计到读写分离或分区分库分表。而分库分表,就会涉及到几个关键性的问题:切分维度,join的处理,分布式事务。

  对于计算:数据分拆:一个大的数据集,拆分成多个小的数据集,并行计算。比如大规模数据归并排序,任务分拆:把一个长的任务,拆分成几个环节,各个环节并行计算。Java中多线程的Fork/Join框架,Hadoop中的Map/Reduce,都是计算分拆的典型框架。其思路都是相似的,先分拆计算,再合并结果。再比如分布式的搜索引擎中,数据分拆,分别建索引,查询结果再合并。

 

  将系统各种拆分后,只能算一个分布式雏形。并不能应用于实际生产环境。其中还会涉及到对并发和对数据的缓存处理。

二、为什么要用分布式

  当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙。当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了。因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓“分布式系统”的来源。然而,大量用户访问同一个互联网业务,所造成的问题并不简单。从表面上看,要能满足很多用户来自互联网的请求,最基本的需求就是所谓性能需求:用户反应网页打开很慢,或者网游中的动作很卡等等。而这些对于“服务速度”的要求,实际上包含的部分却是以下几个:高吞吐、高并发、低延迟和负载均衡。高吞吐,意味着你的系统,可以同时承载大量的用户使用。这里关注的整个系统能同时服务的用户数。这个吞吐量肯定是不可能用单台服务器解决的,因此需要多台服务器协作,才能达到所需要的吞吐量。而在多台服务器的协作中,如何才能有效的利用这些服务器,不致于其中某一部分服务器成为瓶颈,从而影响整个系统的处理能力,这就是一个分布式系统,在架构上需要仔细权衡的问题。高并发是高吞吐的一个延伸需求。当我们在承载海量用户的时候,我们当然希望每个服务器都能尽其所能的工作,而不要出现无谓的消耗和等待的情况。然而,软件系统并不是简单的设计,就能对同时处理多个任务,做到“尽量多”的处理。很多时候,我们的程序会因为要选择处理哪个任务,而导致额外的消耗。这也是分布式系统解决的问题。低延迟对于人数稀少的服务来说不算什么问题。然而,如果我们需要在大量用户访问的时候,也能很快的返回计算结果,这就要困难的多。因为除了大量用户访问可能造成请求在排队外,还有可能因为排队的长度太长,导致内存耗尽、带宽占满等空间性的问题。如果因为排队失败而采取重试的策略,则整个延迟会变的更高。所以分布式系统会采用很多请求分拣和分发的做法,尽快的让更多的服务器来出来用户的请求。但是,由于一个数量庞大的分布式系统,必然需要把用户的请求经过多次的分发,整个延迟可能会因为这些分发和转交的操作,变得更高,所以分布式系统除了分发请求外,还要尽量想办法减少分发的层次数,以便让请求能尽快的得到处理由于互联网业务的用户来自全世界,因此在物理空间上可能来自各种不同延迟的网络和线路,在时间上也可能来自不同的时区,所以要有效的应对这种用户来源的复杂性,就需要把多个服务器部署在不同的空间来提供服务。同时,我们也需要让同时发生的请求,有效的让多个不同服务器承载。所谓的负载均衡,就是分布式系统与生俱来需要完成的功课。由于分布式系统,几乎是解决互联网业务承载量问题,的最基本方法,所以作为一个服务器端程序员,掌握分布式系统技术就变得异常重要了。然而,分布式系统的问题,并非是学会用几个框架和使用几个库,就能轻易解决的,因为当一个程序在一个电脑上运行,变成了又无数个电脑上同时协同运行,在开发、运维上都会带来很大的差别。

三、分布式的特点

  随着业务的发展,应用规模不断扩大,系统内部应用越来越多。常规的垂直架构已经无法应对复杂业务带来的各种挑战。通过将业务公共能力抽象成原子服务,对复杂应用进行水平拆分和服务化,实现服务消费者和提供者的解耦。

  分布式系统最大的特点是可扩展性,它能够适应需求变化而扩展。企业级应用需求经常随时间而不断变化,这也对企业级应用平台提出了很高的要求。企业级应用平台必须要能适应需求的变化,即具有可扩展性。比如移动互联网2C应用,随着互联网企业的业务规模不断增大,业务变得越来越复杂,并发用户请求越来越多,要处理的数据也越来越多,这个时候企业级应用平台必须能够适应这些变化,支持高并发访问和海量数据处理。

  分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。分布式系统由独立的服务器通过网络松散耦合组成的。每个服务器都是一台独立的PC机,服务器之间通过内部网络连接,内部网络速度一般比较快。因为分布式集群里的服务器是通过内部网络松散耦合,各节点之间的通讯有一定的网络开销,因此分布式系统在设计上尽可能减少节点间通讯。

  分布式系统最大的特点是廉价高效:由成本低廉的PC服务器组成的集群,在性能方面能够达到或超越大型机的处理性能,在成本上远低于大型机。这也是分布式系统最吸引人之处。成本低廉的PC服务器在硬件可靠性方面比大型机相去甚远,于是分布式系统由软件来对硬件进行容错,通过软件来保证整体系统的高可靠性。

 

大话分布式

标签:复杂   电脑   服务器   延伸   完成   机器   内存耗尽   规模   内存   

原文地址:https://www.cnblogs.com/huanglog/p/8481506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!