漫谈分布式集群的负载均衡—口水篇

1 什么是分布式集群

为了理解分布式集群这个概念,我们先说说这两个概念:“集群”和“分布式”。艺术来源于生活,计算机科学亦是如此。我们先通过例子,来了解一下现实生活中的“集群”和“分布式”。

从开餐馆说起:你开了一家餐馆,自己掌勺后厨(即做菜)。随着生意越来越好,发现自己忙不过来。于是你聘请了两个厨师,你们三位厨师就是一个“集群”。主要的职责是:洗菜、配菜、炒菜。你们关系如下:

随着生意越来越好,两种方式增加后厨的生产力:(1)继续增加厨师—相当于扩大集群;(2)引入流水线的机制,精细化分工。找人分担厨师洗菜、配菜等工作。类似下图。

其实,流水线提现了分而治之的思想。即将一个大任务分解为多个小任务,提高小任务的生产力,从而提高了整体的生产力。而“分布式”解决问题的思路:正是吸取了将大任务分步为多个小任务的思想,才得到通过跨地域的分布解决大问题。

从解决问题的角度,说一下分布式与集群的差异:

  • 分布式是以缩短单个任务的执行时间来提升效率的;
  • 集群则是通过提高单位时间内执行的任务数来提升效率。

从软件部署的角度,说一下分布式和集群的关系:

  • 分布式是指将不同的业务分布在不同的地方;
  • 集群则是将几台服务器集中在一起,实现同一业务;
  • 分布式中的每一个节点,都可以做集群;
  • 集群并不一定就是分布式的。

综上所述,一个较为理想的分布式集群应该是这样的:一个分布式系统,是通过多个节点组成的,各节点都是集群化,并且各集群还是分布式的。

2 什么是负载均衡

一台服务器的处理能力,主要受限于服务器自身的可扩展硬件能力。所以,在需要处理大量用户请求的时候,通常都会引入负载均衡器,将多台普通服务器组成一个系统,来完成高并发的请求处理任务。

提到的负载均衡,大家都想到了什么?DNS,LVS,nginx,HAProxy,反向代理,还是大名鼎鼎的F5?下面针对这些负载均衡技术做了分类和归纳。

其实上面描述的解决方案,通常都是互联网web接入方案的负载均衡。而web的服务方式是:通过简单易记的域名,屏蔽内部网络真实服务的IP,从而保证了内部服务器安全和可靠。基于这种服务方式,服务提供商可以在两处做负载均衡:

1.DNS解析(查询式),域名服务器在进行域名到服务IP反向解析的时候,根据用户网络接入特点等(电信、网通等 ),将就近的服务IP列表返回给用户。

鹅厂GSLB是这方面的翘楚,大家有兴趣可自行km。

2.转发式,经过了上面DNS就近接入,当用户请求到就近服务的IP时。通常的做法是引入转发节点(通常是lvs或者nginx),通过均衡策略,将数据发送给多台RS(Real Server)。

在介绍web负载均衡的技术后,小伙伴们有没有这样的疑问。分布式系统各节点间的集群是如何做负载均衡呢?web的负载均衡是否适用于分布式节点间呢?等等。

其实不同的技术为了解决不同场景的问题,下图就罗列的常用的负载均衡使用场景。

上图通过三种颜色(包括图标和线条)的部分,分别说明了不同场景下的负载均衡。

  • 蓝色部分:用户通过DNS查询式,获取到了就近接入的业务服务(GSLB)。
  • 绿色部分:将用户请求集中转发的方法,完成了业务接入层的负载均衡。(LVS)
  • 红色部分:说明了通常分布式系统内部节点间的负载均衡。

其中,蓝色部分和绿色部分就是上面介绍的web负载均衡部分。下面一章我们重点分析一下如何考虑分布式节点间的负载均衡。

3 分布式集群的负载均衡

分布式各节点间的集群要做负载均衡的话,完全可以参考web负载均衡的方式来做,即查询式和转发式。但是通常后台开发的皮皮虾们基本不会这么做,根本原因就是不同场景下,考虑的侧重点是不同的,导致均衡的方式也有很大的差别。

我们先说一下两个web服务的基石:简单和安全。

  • 简单:使用域名的web服务,就是让用户通过简单易记的域名替代IP地址的访问方式,所以说“简单”应该说是用户的诉求。
  • 安全:而“安全”是服务提供商的诉求。就是对外服务时最大程度上屏蔽内部服务器的IP地址、网络部署,从而保证内部服务的安全。

针对上述两点,就需要在提供web服务时部署相应的节点支撑。如DNS解析,LVS转发、ngnix反向代理等。这些节点在保证服务的简单和安全时,也对系统服务引入了关键路径,增加了系统服务复杂性。

那么思考一下:分布式的各系统间,需要引入这么多节点来解决负载均衡的问题吗?

皮皮虾们的答案一定是:不需要。引入更多的节点意味越难保证系统的稳定性、可靠性。为什么这么说呢?

首先,分布式系统相对于集中式系统,是通过节点间相互传递消息通信协调工作的。节点间通信的不可靠性、不稳定性是分布式系统常态。这就导致系统的设计和开发时,需要针对每一种通信异常都有自身重试、恢复的解决方案。所以,引入更多的节点就意味着更复杂的重试、容灾、恢复等成本。

小伙伴们,有没有一种出师未捷身先死的感觉呢?oh, my god。还没有考虑负载均衡,仅仅是分布式系统间稳定性和可靠性,就已经很让人头疼了呢?所以说分布式的皮皮虾是苦逼的,落寞的,高贵的。(请珍惜您身旁的每只皮皮虾)

皮皮虾们不要皮,大司马出题了。

大司马:如果敌方打野没有在小地图的视野中,那么分布式系统的负载均衡要怎么做呢?

在学习了大司马的“正方形打野”,“边缘ob”,“你皮任你皮后”,这个问题我是这么看的。

我:更少的节点,更简单可靠的通信模式下,才能较好的完成负载均衡。

大司马:这位同学你很有灵性嘛。(看不懂段子的,看加粗字字哈)

怎么做好负载均衡呢?总结一下上面的段子就是一句话:simple is beautiful.(皮皮虾耳朵听出茧子了吧)。

  • 更少的节点:分布式业务节点数,需根据业务自身的特点确定。原则是:少且够用。
  • 简单可靠的通信模式:这里给一个简单的通信方式,udp请求发送+ udp服务确认。这种模式下可以减少因tcp链接管理造成的服务器资源消耗。

如果自身系统的还是很复杂的话,其实也是有迹可循的。下面我整理一下,考虑负载均衡的要点。大家多多思考,根据自身业务特点取舍,最终一定会做出不错的负载均衡效果。

再强调一个关键点,小伙伴们一定要先找到系统中的均衡要点是什么?这里在说一下:请求均衡和数据均衡(上图右下角)。

请求均衡理想效果是:每个RS服务处理的请求是差不多的。

数据均衡理想效果是:每个RS服务处理/存储的数据量是差不多的。

公司内部也有很好的均衡算法组件l5/cmlb等(自行km哈),可以较好支持udp的请求均衡。使用这种组件也有一些限制,大家确认是否适合自己的系统哈。

最后,我们回顾负载均衡的本质,小伙伴们千万不要为了负载均衡而均衡:

  • 功能:单台服务器能力有限。当处理大量用户请求时,通过需要多台服务器组成系统,从而完成高并发的请求处理。
  • 描述:N个客户端访问M个服务端的问题。(通常:M>1,N>>M)
  • 难点:将N的请求/数据"均匀"分摊到多个M操作单元上执行,关键是"均匀"。

同学们,下课啦 !

本文作者:于洋

来源:51CTO

时间: 2024-08-25 01:26:33

漫谈分布式集群的负载均衡—口水篇的相关文章

【Linux】集群和负载均衡

集群和负载均衡的概念  集群(Cluster) 所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机.  负载均衡(Load Balance) 网络的负载均衡是一种动态均衡技术,通过一些工具实时地分析数据包,掌握网络中的数据流量状况,把任务合理均衡地分配出去.这种技术基于现有网络结构,提供了一种扩展服务器带宽和增加服务器吞吐量的廉价有效的方法,加强了网络数据处理能力,提高了网络的灵活性和可用性

“集群和负载均衡”在实战当中的运用技巧

在"高并发,海量数据,分布式,NoSql,云计算......"概念满天飞的年代,相信不少朋友都听说过甚至常与人提起"集群,负载均衡"等,但不是所有人都有机会真正接触到这些技术,也不是所有人都真正理解了这些"听起来很牛的"技术名词.下面简单解释一下吧. 集群(Cluster) 所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机.通俗一点来说,就

关于mysql集群与负载均衡问题

问题描述 关于mysql集群与负载均衡问题 在windows环境下能实现LVS+Keepalived么?这两个东西都是运行在Centos上面的?windows有否类似的解决方案?看过MySQL Cluster但这个东西很笨,当SQL节点挂了,不会自动切换,需要手动去做.请问有那位对这个比较了解. 解决方案 mysql本来就擅长在linux架设一些框架,windows支持不够,所以直接在centos上搞就可以了.

服务器集群和负载均衡如何实现?

问题描述 请教一个问题,javasocket服务器如何实现服务器集群和负载均衡?目前以项目遇到这个问题,请大神指点一下! 解决方案 解决方案二:socket与硬件有关,是指定到某台机器的某个端口的.所以一般我们在Socket前用负载均衡,根据业务特性,有nginx,LVS,F5硬件等).至于集群,那和具体业务相关.像普通的HTTP,各HTTP服务器有SESSION共享和同步就行了.

服务器集群与负载均衡有什么区别

1. 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机. 2. 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机.如一个提供Web服务的集群,对外界来看是一个大Web服务器.不过集群的节点也可以单独提供服务. 3. 特点:在现有网络结构atch之上,负载均衡提供了一种廉价有

集群、负载均衡、分布式

原文地址:http://www.uml.org.cn/zjjs/201108111.asp 1.集群 1.1定义:是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机. 是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机.如一个提供Web服务的集群,对外界来看是一个大Web服务器.不过集群的节点也可以单独提供服务. 1.2负载均衡系统:集群中所有的节点都处于活动

深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现

一.LVS集群常见架构图 Load Balancer层:位于整个集群系统的最前端,由一台或多台负载调度器(Director Server)组成.LVS核心模板IPVS就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有为完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server).   同时,在Director Server上还要安装对Real Server的监控模块Ldirectord,

activemq分布式集群是怎样实现负载均衡的?仅仅是针对消息的负载均衡吗?

问题描述 activemq分布式集群是怎样实现负载均衡的?仅仅是针对消息的负载均衡吗? 请问大家activemq是怎样实现负载均衡的呢?只是failover()吗?还是针对于消息平均发送给消费者呢?比如说两台机器搭建分布式集群后,100个消费者连上后怎么平均分配?还有一台重启了之后怎样实现它上面的客户端再连回去呢?activemq负载均衡是什么原理? 解决方案 参考下http://blog.csdn.net/jason5186/article/details/18702523http://www

Nginx + Shiro + Redis 实现负载均衡集群(成绩报告查询系统升级篇)

写在开始 上一篇讲到使用Ehcache实现分布式缓存,尽管其直接操作JVM内存,速度快,效率高,但是缓存同步麻烦,分布式集群配置不方便,如果应用服务器重启会丢失缓存数据. 下面来分析一下Redis做系统session缓存实现. Redis介绍 Redis是一个key-value存储系统.和Memcached类似, 它的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它支持存储的value类型相对更多,包括string(字符串