首页 > 代码库 > 浅谈群集与分布式基础知识

浅谈群集与分布式基础知识

  长期以来对于做IT的人员来说可能会经常听见一个名词,群集,什么负载均衡群集,高可用群集,双活群集,这对于非相关人员来说根本不明白是什么意思,好像群集很神秘,很高大上,其实群集的概念并没有想象中那么复杂,本文老王会试着用比较简单的语言,来为大家分享我所学习了解的群集知识,尽量让只有简单服务器 网络基础的朋友也可以听懂,如果有说的不对的地方欢迎指正


  什么是群集呢,简单来说,群集就是把一堆计算机组合起来做一件事情,把一堆计算机组合起来一起干活,它们就可以叫做群集,通常群集给人的感觉就好像是一个“整体计算机”在提供服务。

   

  具体细化来讲,群集又分为可以分为高可用群集,负载均衡群集,以及高性能计算群集,其中比较常见的是高可用性群集和负载均衡群集


  什么是高可用群集呢,所谓高可用群集,即是说该群集具备故障转移切换机制,当其中一台服务器宕机,其它服务器可以快速的接管宕机服务器提供的服务,确保业务的持续可用性,例如,某公司有一个网站平台,提供网页端查询服务,有一个前端和两个后端,当用户在网页查询时,实际上前端会去把请求丢给后端去做查询,如果我们做了高可用群集,这时候一旦一台后端坏了,那么前端还可以继续使用另外一台后端进行查询,保证用户可以正常查询访问。


  这里的关键点在于,高可用群集,通常是用于后端,例如数据库群集,虚拟化群集,应用程序群集等有状态运行的服务,当发生故障时,需要将宕机服务器上面运作的内容转移至其它活着的服务器上继续运行。既然要做这种转移,那么数据库本身的实体,应该存在哪里呢,通常情况下,高可用性群集里面数据库一般会存在于共享的存储中,即所有群集内服务器都可以访问到的存储,这样当切换时,就不需要实际上把数据库拷贝转移过去,真正转移的,只是承担数据库查询服务器的这个角色,从而大大减少了转移所需要花费的时间,还有一种场景是所有群集内服务器数据库内容都存放在节点本机,然后节点间相互做存储的复制也是可以的。


  还有个关键内容,刚才我们说过群集给人的感觉就好像是一个整体的计算机在提供服务,那么用户或者是前端程序是怎么感应到后端的群集的呢,通常情况下,不论是高可用群集,负载均衡群集,还是高性能群集,都会提供一个群集化的管理名称,例如,当我们从前端去查询到后端服务器的时候,实际上我们是查的群集管理名称,而不是去查单一的数据库服务器名称,群集会帮我们和其中的节点建立联系,这样连接到群集化的管理名称后,当群集内的服务器出现故障,群集会自己去根据情况做出处理相应,重新挑选合适的节点提供服务,对于使用方来说是不会过多的感知的,前端或者用户始终是访问同一个群集名称。


这里我们说了高可用群集的几个特征,希望大家记住


1.高可用群集通常用于后端程序,例如数据库,虚拟化主机

2.高可用群集通常情况下所有群集内服务器都访问了共享存储,便于发生故障快速转移

3.高可用群集提供统一对外的群集化管理名称

4.高可用群集主要用于提供有状态服务的持续运行,确保单台后端节点宕机不会影响业务,可以提供故障转移机制


除了以上四点,通常情况下高可用群集还应该具备以下几个特点


1.高可用群集应该具备心跳检测机制,即群集,群集节点间,应该可以通过某种机制,得知对方是否存活,通常情况下群集系统会将次实现为ping检测,实际旳握手检测,或基于给定的API检测


2.高可用群集中各个节点通常可以感应到群集内各个节点当前承担的群集角色,以便发生故障时可以进行转移


3.高可用性群集中各个节点通常可以感应到群集内节点的新增,添加,删除,上线,下线等状态。


4.高可用群集通常群集自身,以及各节点应该具备自身健康监测,通常实现为一种类似于投票的机制,每个节点确保自己是健康的情况下可以发出一个声明(投票),让群集知道我当前是可以提供群集功能的节点,当整个群集内如果不健康,即未能投票的节点(也可能是节点+见证) 达到一定数量时,即会判定整个群集当前不健康,不能正常提供群集工作,会出现停止提供服务,或暂停等状态


以上为关于高可用性群集的简单介绍,及特征描述,在文章后面部分我会为大家进行多次举例,帮助大家理解高可用群集的概念



高可用群集常见的名词解释:


节点:通常指群集内参与协作工作的单个服务器


群集应用:通常是指运行在一个已经实现了高可用性机制的群集上的应用,群集会通过相应的的检测机制确保应用的健康状态,通常群集应用会被托管运行在群集中的单个节点上,当该节点出现故障时,群集会将群集应用转移至其它活着的节点上继续运行,保证群集应用一直是可用的。


群集磁盘:通常是指高可用性群集内已经实现为可以被群集内服务器共同访问的共享磁盘,通常情况下在某一时刻单块群集磁盘会被挂载上线在群集中的单个节点上


故障转移群集:通常描述为一种高可用性群集类型,通常故障转移群集指同一时刻群集内只有一台节点提供群集应用的访问服务,当这台服务器出现故障时,群集系统可以快速做出反应,将故障节点上面承载的群集应用转移至其它活着的节点提供服务。


计划内停机时间:已经可以被预见,被预料的正常停机时间,例如群集服务器进行计划性的补丁修复,网络切换,服务器升级等,通常计划内停机时间对于业务来说是在可以被接受的范围,可以在已知情况下利用实时迁移,在线转移等技术完成转移,最小化停机时间,顺利完成计划内的维护工作


计划外停机时间:不可被预见的,忽然发生的灾难性停机,例如在不知情的情况下服务器电源坏掉,硬盘不可访问,造成业务层面不可访问,是较为严重的,通常情况下企业会实现例如高可用性群集,或者灾难备份来应对计划外停机事件发生,通常情况下SLA的计算,真正会被承认宕机时间的也就是说的这段计划外的停机事件


群集管理名称:群集对外的一个集中的,逻辑的名称,该名称在域范围,解析范围内应该是唯一的,不可重复的,前端程序或者用户访问群集始终是访问的群集管理名称,也可以叫做群集对外名称,通常情况下,如果在高可用性群集里面实现基于群集的高可用的应用,也会有单独的虚拟应用名称,这个名称应该是基于群集管理名称创建出来的,或依附于群集管理名称,群集管理名称会提供的是一个逻辑的访问域名,或一个群集的IP地址,群集管理名称或群集IP地址通常会绑定在活着的一个群集节点上,对于用户和前端实现了逻辑屏蔽机制,前端只知道我去连接到这样一个域名,但并不会知道群集内有几台服务器在提供服务。


在高可用群集中通常又分为多种形态,以从运行模式和群集存储模式为例


高可用群集的运作模式通常又分为主从模式,互备模式,双主模式


主从模式:也叫做AP模式(active-passive)同一时刻一个群集应用只能在一个节点上运行提供服务,当前端或用户通过群集管理名称访问时只会有一台服务器提供服务,这台服务器扮演主服务器角色,其它服务器扮演备服务器角色,当主服务器不可用时,群集会感知到主服务器坏了,然后切换至其它备服务器继续提供服务。


互备模式:这种模式,有人也叫它是AA模式,对此嘛老王也是持有保留意见的,说它是双活的,似乎也无可非议,但平常会需要浪费掉一半的群集计算资源这个。。。举个例子,如果是一套数据库群集,是可以做到多个实例,两个节点的话,比如节点一是实例一的主节点,实例二的备节点,节点2是实例1的备节点,实例2的主节点,这样以多花费一半的资源的代价下实现了两个服务器都可以同时对外提供服务,但是,一旦节点1这时候出现故障,节点2就需要承载两个实例,要实现这种模式的高可用性群集,需要做好服务器的规划,确保每台服务器都是可以承载两个实例的配置才行。


双主模式:也叫做AA(active-active)模式,在老王看来,真正的双主,或者说双活AA模式群集,应该是这样的,例如在群集系统基础上实现负载均衡器机制,或者在群集系统前面再摆一个负载均衡器,真正的双活模式,应该是用户访问时会通过负载均衡机制把用户请求丢给群集里面一个节点,下一个用户访问又是另外一个节点,这样真正的节点同时对外提供服务,老王认为才是真正的AA模式,目前看起来MySQL上的Amoeba是这样,微软的SOFS也是这样。


从群集存储模式区分


通常情况下分为


共享磁盘模式


   即所有群集节点都访问共享的群集磁盘,群集应用数据也写入到共享磁盘中,通常情况下此架构下实现为AP模式较多,缺点就是会对群集资源进行浪费,同一时间只有一台节点提供服务,存储是单一故障点,需要考虑存储的高可用,少数群集应用可以实现共享磁盘模式下的双活,例如oracle rac,可以在使用共享磁盘的情况下,负载均衡各个节点负载,让多个节点同时对外提供服务。


无共享磁盘模式


   即所有每个群集节点都在节点本身写入数据磁盘,不使用共享磁盘,但各节点之间可以进行数据磁盘数据的同步,通常实现为主服务器和辅助服务器,主服务器提供读写服务,辅助服务器从主服务器复制数据库,当故障发生时,通常可以执行手动故障转移,或配合见证机制实现自动故障切换,一些群集应用也会提供辅助服务器的可读功能,通常数据库应用中使用。


   有朋友看到这里可能会问,有必要吗,企业有必要做这种高可用性群集吗,这东西涉及到这么多概念,其实真的很有必要,设想一下,一个云盘网站,或者一个购物网站,肯定是希望24小时能够正常提供服务的,一旦没有实现高可用群集,那网站后台只有一台服务器,这台服务器坏了,所有客户都将无法访问购物网站或者云盘网站,这对于运营商来说是灾难性的,会导致业务损失,丧失用户对你网站的信心,因此,老王认为凡是成熟的商业网站,都应该实施高可用群集,来保证可以持续提供服务,即使没有条件实施高可用群集,也应该实施备份恢复等机制。



接下来负载均衡群集


   这类群集很好理解,我们上面讲了高可用群集,或者说是故障转移群集,主要强调的是,群集应用同一时间只在一个节点上运行,同时会读取写入内容到共享磁盘,检测到一台节点宕机,群集会把角色服务等有状态的内容转移至另外一个节点上继续运行。负载均衡群集主要倡导的概念和故障转移群集有所不同,在负载均衡群集中,通常各节点间都是无状态的,也并没有共享磁盘,发生故障时候也不用把自身承载的内容转移给其它节点,因为在负载均衡群集中,每个节点的内容都是一致的,冗余的,负载均衡群集只是提供一个均衡机制,可以确保用户的访问请求,会在不同的,具备相同冗余内容的节点上进行负载均衡,当其中一个节点不可用,负载均衡群集直接自动路由到其它可用的节点上继续为用户提供服务。


   负载均衡群集,通常也叫做前端群集,它与故障转移群集的相同点是他们都提供一个对外的群集访问名称,当用户访问一个负载均衡群集时,感觉上就好像是在访问一台服务器一样,但其实负载均衡会根据算法去负载均衡,让不同用户访问到不同的服务器上。不同点在于,故障转移群集需要进行故障转移,当检测到一个节点宕机,其它节点会检查群集数据库,查询宕机节点承载服务,然后进行上线。负载均衡群集则不会发生这种故障转移过程,因为负载均衡群集提倡的是无状态的,每个节点上的资源都是一样的,一个节点宕机,直接负载均衡至其它节点上,并不会产生离线上线角色转移等事情。


   因此负载均衡群集特别适合于像是Web前端这样的应用,通过负载均衡让每个节点都提供服务,最大化利用群集资源,在某些程度上也可以提供Web前端的处理能力


  负载均衡群集系统通常具备以下特点


1.负载均衡群集系统通常可以设定基于IP、端口等进行负载调度分发

2.负载均衡群集系统通常可以设定群集各节点负载均衡的比例,例如可以指定节点1承载60%的请求,节点20承载40%的请求

3.负载均衡群集系统通常可以设定优先级,可以根据优先等级进行调度,排队,丢弃,分配。

4.负载均衡群集系统通常可以基于上下文感知,例如根据不同的请求内容,分配到不同的节点服务器。

5.负载均衡群集系统通常也需要心跳检测机制,确保每次挑选出来提供负载均衡服务的机器都是健康可用的,负载均衡系统需要知道群集内节点的存活状态,当其中一个节点不可用时,下次群集将不会将负载均衡请求丢至该节点,通常实现为ping检测,或实际的路径网页访问检测。


  通常情况常见负载均衡群集有微软的NLB,ARR,linux下面的LVS、HAProxy、Nginx等解决方案


  还有一种最简单的负载均衡群集实现方式,DNS轮询,其实严格来讲老王认为这只是种简单的轮询技术,并不能称得上是负载均衡或者群集


   DNS轮询做的,只是将同一个域名的访问解析到不同的服务器上,但是解析负载并不是均衡的,也并不是可控的

当其中一个节点宕机,但DNS轮询还会继续轮询到该地址,并不具备检测机制,而且DNS通常还具备缓存机制,例如当前域名解析到的服务器出现故障,你重新分配至其它服务器,但客户端也并不会立刻可用,除非等到DNS缓存超时


   因此DNS轮询系统通常用于最简单,对于负载均衡,故障转移没有过多要求的Web前端服务器,通常情况下使用DNS轮询系统并不会单独使用它,而是会配合nginx,arr,LVS等负载均衡群集技术一起实现。


   当我们实现了负载均衡之后,假设现在是三个节点的一个负载均衡群集,提供一个群集访问名称进行访问,每次用户发起访问,负载均衡群集会根据综合调度策略,优先级,上下文等算法选出一台合适的节点来提供服务,这时候如果当这台节点坏掉,或者用户被负载均衡到了其它节点上,那么用户session如何处理是个问题,例如当前负载均衡群集是个购物网站,用户正在购买东西添加至购物车,这时候忽然节点1出现故障,负载均衡会自动切换到节点2提供服务,但是,之前用户已经与节点1建立了session状态链接,即用户的登陆信息,会话信息,虽然说负载均衡群集可以切换到其它节点继续提供服务,但是之前在节点1建立的session则会丢失,即是说,这时候一旦节点1坏了,切换到节点2,需要用户重新登录才可以,频繁需要重新登录这对于用户来说是不可接受的,特别是对于一些严重依赖于session的网站


   因此实现了负载均衡群集之后,session存在哪里是个问题,是使用session保持技术,还是将session存在数据库,或单独实现session server是值得思考的问题。


   简单总结下,高可用群集通常指的是后端群集,当发生故障时,会发生实际的故障转移,将被宕机节点上已有的群集应用,群集资源等有状态性的资源服务,转移至其它活着的节点上继续运行。

   负载均衡群集通常是值得前端群集,部署多个内容一致的无状态服务器,负载均衡群集根据综合算法,将每次用户的请求转发至不同的合适的节点上进行工作,并不会发生有状态的故障转移,单台节点下线,负载均衡只是自动转发请求到其它节点上。


   在讲高性能计算群集之前,老王想先和大家谈谈分布式,以及分布式和群集的区别


   在老王看来,分布式主要强调的更多的是一种对于应用处理实现的一种思维,算法的实现方式,分布式更多的时候指的是把一项工作,分摊成多个小任务,交给不同的节点去处理,然后把多个节点处理的结果最终汇集出成果,分布式中的节点不同于群集,一个分布式节点可以是群集,也可以是单机,分布式的核心思维是利用多个节点分摊来完成工作,每个节点完成的任务都是不一样的,以众人合力来达成同一个目标,老王认为这就是分布式的思想。


   而群集的概念相对来说,主要是指将一组服务器结合在一起共同协作,群集主要强调的是,我们来共同维护这一件工作,保证这项工作始终是可以正常对外提供服务的,强调的是集中维护一件事,确保单一工作的持续可用或均衡负载。

   

   例如一家蛋糕店,要卖蛋糕,群集是为了确保卖蛋糕这件事始终是可以正常运行的,例如如果是群集的思维,可能是正常情况下一个服务员卖蛋糕,这个服务员生病了,其它服务员立刻接受她的工作继续卖蛋糕,这里我们把服务员形成了一个群集,卖蛋糕就是个群集对外访问名称,他们共同完成卖蛋糕这一件事,群集还可能是开了多个窗口,有两个服务员一起买蛋糕,这就是群集中所说的双活模式。


   不论是负载均衡群集和高可用群集,它们强调的概念都是利用多台计算机做好同样的一件事,这里关键的点在于,群集的概念中比较看重一致性,例如负载均衡群集,集中对外提供访问,但每台机器必须内容是一致的,故障转移集群,必须确保每台机器都能知道对方正在运行的负载,发生故障时必须一致的把原节点承载的应用进行上线。

   

   分布式这个词通常用于,分布式算法,分布式计算等词语,通常它们指的都是通过一种,将一项工作,分解成多个小任务同时执行,然后利用多个节点的能力,汇集起来完成整体的目标,例如卖蛋糕这个例子,分布式的思维,强调的就是把卖蛋糕分解成多个步骤,例如1个服务员负责给客户装袋子,一个服务员负责给客户取蛋糕,两个服务员共同完成了卖蛋糕这件事。


   所谓的分布式群集,在老王看来,也是一种分布式技术和群集技术的整合,能够实现这种技术,前提要求群集必须要能够支持识别这种分布式技术,然后分布式技术利用多个服务器组合起来形成的群集技术来完成分布式的计算。

  

   通过上述解释相信大家可以看懂,群集主要强调的是把一组计算机组合起来协作工作,共同对外提供服务的能力,大家共同确保一件事的正常运行,或多个节点每个节点都运行同一件事的能力。 


   分布式主要强调的是将一件事分摊成多个不同的小事,利用多个节点处理的能力来有效率的共同完成大目标,实务应用中,通常情况下,分布式多用于像是科研探索,工业计算,大数据等领域,将真正复杂的事情,单台服务器上执行效率低的事情,分摊到多台服务器,利用多台服务器的计算能力来共同完成这一件事。


   分布式计算技术也经常被一些国际科研组织使用,通过我们每个人共享自己电脑闲时的运算能力,进行分布式运算,完成后再把计算结果通过网络发送回服务器,这样的计算方式可以帮助一些进行大型计算研究的机构加速进步的速度。


   说到分布式计算,不得不提并行计算和串行计算,通常情况下在并行计算和串行计算都是指应用程序运行执行的一种形态,例如,并行则是说单个应用可以同时在单机多个CPU下面执行,或者是指同一时间,多个节点同时处理运算负载的能力。相对来说,串行计算则是指运算过程必须按照顺序执行,只有运行完整个job才可执行下一个。并行计算则是多个节点同时运行多个job,不需要等待前一个完成再进行计算


   如果一个计算是串行工作的,即使它是在群集上跑的,也不是并行计算


   相对来说,老王认为分布式计算与并行计算差不太多,首先它们都对计算节点没有过多的要求,节点服务器不必一定要使用专用的高级服务器,正常的商用服务器或者工作站都可以完成分布式计算,大体强调的都是将一项复杂的工作,分成多个子任务,然后节点执行完成后汇集起来形成结果。


   通常情况下,分布式计算更加适用于在计算寻找模式的东西,分析计算,相加计算等。分布式的计算被分解后的小任务互相之间有独立性,节点之间的结果几乎不互相影响,实时性要求不高,比较松散化。


   并行计算则比较倾向于一些海量数据进行分析处理的场合,每个节点的每一个任务块都是必要的,计算的结果相互影响,要求每个节点的计算结果要绝对正确,并且在时间上做到同步



   解释完了分布式之后,我们回过头来看下高性能计算集群,也可以说是高性能计算

   

   我们先来看看群集的关注点


   高可用群集更关注的是我这个群集对外提供的正常可用时间有没有达到几个九


   负载均衡群集群集更关注的是我这个负载均衡群集可以同时支持的访问数量,以及节点的负载情况是否符合预期


   高性能群集,则更加关注群集整体的计算性能,群集到底每秒能处理多少数据,群集处理数据的速度可以达到多块,老王认为高性能群集是个大的概念,它的目的是要群集获取最快最高的计算能力,因此,一个高性能计算,可以能会包括分布式的job调度,并行运行的能力,也可能会结合负载均衡,故障转移等机制,确保计算能力的持续可用


   和我们前面说的不同,高性能群集通常会采用专用的操作系统,专用的高端服务器,和我们平时用的普通商用服务器不同,高性能服务器通常会具备很多颗CPU,巨大的内存,高性能服务器之间通常会使用最新最快最可靠的网络技术,例如InfiniBand的网络互连,单个高性能服务器硬件的处理性能在高性能计算中很重要,除了硬件外,通常高性能计算会通过专用的系统进行管理控制,在管理过程中,可以把整个高性能群集的计算能力集中进行分配处理,最终提供整个高性能群集计算能力。


  通常情况下高性能计算群集更多的会被应用于数学,工业,科研领域等,需要在短时间内处理多维度的计算,这时候可以利用高性能计算群集的能力,来完成复杂的科学计算。


  像是这些年除了高性能计算群集,也听到有人提过超算,我们国家的神威,天河1号,天河2号等等,实际上老王老王认为高性能计算和超算差不多,都是为了提供最高的性能和最快的处理能力,最早期的超算,通常指的是单一的大型机器,高速度,大容量,具备特殊的CPU内存,当时最早有美国ILLIAC-IV,欧洲尤金,中国银河等等,最早的超级计算机只能用于政府,能源军方,航天等,只有很少数的人可以用到,后来随着信息化的逐渐发展,一些企业也有了需要用到超算能力的需求,怎么办,于是后来开始提出做群集把,我们通过把一些高性能服务器通过高速网络链接起来形成群集,然后群集利用每个节点的能力综合起来提供整体运算能力吧,于是后来开始有很多厂商推出这种高性能群集,将原来超级计算机一个庞然大物的运算能力,由多个节点结合起来实现。


  甚至老王认为我国的天河2号等超算,背后也是基于这种高性能群集技术实现的,将多台配置性能极高的节点尽可能的靠近,综合利用他们的运算能力一起完成并行的运算,如果说差异的话,老王认为能够称得上是超算的,通常规模会比普通的高性能计算大一些,定制化的硬件会更多,更加特定化,例如天河2号可能会使用特定的CPU,特定的内存,以及特定的服务器架构,提供也运算能力也更加强大。


案例总结


一个虚拟化群集,由多台物理机组成,在群集中创建了虚拟机,存放在共享磁盘中,当检测到一台物理机宕机,虚拟机会转移到其它节点继续运行。这是高可用群集



一个数据库群集,由多台服务器组成,基于群集创建了数据库的实例,数据库内容存放在共享磁盘中,当检测到一台数据库服务器宕机,数据库服务器角色会转移到其他节点继续运行。这是高可用群集


由多台相同网站内容的无状态Web服务器组成,通过统一的域名访问,所有节点轮询对外提供访问服务,一台Web服务器下线,用户自动访问其他节点,这是负载均衡群集。


国际某组织,要探索外星文明,发起活动组织每个人可以将电脑空闲的运算能力集中起来,把探索任务细分到每个愿意提供运算能力的电脑上面,将运算结果执行后返回给中央服务器,这是种分布式计算


某组织需要进行每秒100万的运算,需要并行处理多个维度的公式,将运算程序丢给群集,群集快速完成返回运算结果。这是种高性能计算。



以上为老王群集系列的开篇,虽然没有像想象中那样写的尽善尽美,不过已经用心了就好,希望会有朋友看到老王的这篇文章之后,能够对于以前不理解的内容多一点认识,那怕多理解了一点点,老王也会很高兴,嘛,就这样,后续文章会都是偏技术,实践性的,下篇开始讲为大家讲解微软高可用群集的仲裁模式,以及在2008R2 2012R2 2016不同版本中的运作形态实践。


本文出自 “一个倔强的孤岛” 博客,请务必保留此出处http://wzde2012.blog.51cto.com/6474289/1949622

浅谈群集与分布式基础知识