负载均衡原理剖析与实践第一篇-介绍篇
负载均衡原理剖析与实践第一篇-介绍篇
系列文章索引:
负载均衡详解第三篇:服务器负载均衡的基本概念-使用负载均衡器的服务器群
负载均衡详解第四篇:服务器负载均衡的基本概念-负载均衡时数据包流程
负载均衡详解第六篇:服务器负载均衡的基本概念-网络地址转换(NAT)
负载均衡详解第七篇:服务器负载均衡的基本概念-服务器直接返回
前言:相信朋友们对负载均衡应该不陌生了!特别是对搞运维的朋友!可能很多的技术人员认为,负载均衡不是搞IT运维的人管的吗,关我们开发人员什么事情?曾经,我也是这样想的,但是后来发现我错了。开发人员,需要懂性能方面的问题,而负载均衡也是属于性能的范畴,so…!如果开发人员想继续不断的提升自己,走向设计,架构的角色,那么,你就必须对技术的有全面的把握和整体的评估,才能在项目中从软件和硬件多方面考虑,真正的实现可用性,扩展性,灵活性。
曾经经历过很多的项目,特别实在做外包的时候,基本上涉及不到什么性能的问题,极少涉及到负载均衡。当我接触了互联网之后,常常被人笑话我是搞企业开发的,不懂性能,于是我开始关注性能,也知道有负载均衡,那时候,感觉思维一下子被打开了,发现了一个不一样的天地!但是负载均衡缺少很多的资料,网络上很多的地方和文章都只是讲了点皮毛,刚要深入的时候,就没了!
技术,入门容易,学精难!不精,就没有核心竞争力,因为谁都懂,谁都可以替代你!所以要精!
在这里,我将会深入的剖析负载均衡的原理,使用!甚至你可以感觉到,之后,你可以自己写一个负载均衡的软件出来!之后,在分析问题,思考问题的时候,你会游刃有余!
….
负载均衡已经不是什么新的概念了,负载均衡也不仅仅就指的把一些服务器放在一起实现分压。负载均衡是一个统称。而我们平时谈的最多的就是服务器负载均衡,全球负载均衡,防火墙负载均衡,缓存负载均衡!(在后面,会慢慢的讲述各个方面)。
就拿服务器负载均衡而言,它主要是把请求分摊在多个服务器资源上面。负载均衡还可以实现很精确的服务器健康检查机制,请求的转发。另外,因为负载均衡部署在服务器的前端,所以,它也可以包含服务器免受恶意用户的攻击,提高安全。同时,还可以基于IP数据包中的信息进行智能的选择不同的程序,不同的服务器来处理!
负载均衡的必要性
随着互联网的普及,越来越多的人开始在线使用服务。同时,也不能容忍网络突然崩溃或者网速、服务的性能超低,特别是对于涉及到网上交易的应用而言,任何一点问题的出现,都是重大的经济损失。为了保证提供更好,更稳定的服务,我们会不断升级服务器的相关设备。
虽然说根据摩尔定律:计算机的处理速度每18个月会翻一番。但是这个速度依然赶不上互联网放在的速度和用户对服务的需要,并且购买更好的设备,不仅仅昂贵,性价比也不理想。
那么这里其实就已经涉及到了一个可伸缩性的挑战。下面,我们就来看看一些常用的可伸缩性方案。
正如之前所说的,计算机的更新速度无法赶上用户需要,这个时候集群技术就应用而生了,这个技术主要是那些大型计算机厂商提供的,集群技术的提出在一定的程度上面缓和了之前的问题。下面,我们就来看看两种比较典型的集群技术:松耦合系统,对称多处理器系统。
松耦合系统
松耦合系统是由很多的完全相同的计算机块组成,这些计算机块之间通过系统的总线连接。其中,每一个块都包含各种的处理器,内存,磁盘控制器,磁盘驱动,网络接口等。其实,每个块都可以看出是一个独立的计算机,只不过现在他们被聚在了一起。下面的草图显示这个关系:
松耦合的计算机集群系统采用处理器通信技术,讲负责分摊到多个处理器上面。这个系统只有在任务可以被分割的情况下发挥很好的伸缩性。例如,我们现在有一个任务要去返回一个表中所有的数据,并且这个表中的数据已经分割成为了多个不同的文件,放在磁盘上面。这个时候,采用松耦合的计算机集群技术,就可以讲查询任务分为多个不同的并行的子任务去查询,每个子任务去一个文件中查找,最后将结果合并后返回。
但是,不是所有的任务都是可以被分割的。例如,有个任务需要去更新之前那个表中的某个字段,那么此时,即使有这个更新任务被再次分割为小的子任务,但是因为需要更新的字段肯定是位于之间的一个文件中的,那就是说:最后只有一个子任务在真正执行,其余的子任务在打混,闲了。
另外,为了使得松耦合的计算机集群系统获取很好的伸缩性,这个系统还需要很多的技术去支持,也需要很多的人员维护,成本非常的高。
对称多处理器系统
对称多处理器系统(SMP)采用多核共享内存(其实这也会导致性能问题,现在很多的计算机,特别是多核的服务器,都是采用的非对称内存的方式,大家感兴趣可以去研究下)。在这种系统中,为了达到很好的伸缩性,我们开发的应用程序必须采用多线程的技术(并且,也是需要将一个任务分为结果子任务来运行,而不同的子任务运行在不同的线程上面)。这些线程共享内存,并且通过内在的方式进行通信。同时,操作系统也会去调度这些线程,使得他们运行在多核上面。同样,这个前面 的系统有这同样类似的问题。
OK,对之前的两种方式就简要的介绍一下。没有深究,并且不是重点。
下面,我们就看看负载均衡技术出现的一些基础。
我们知道,传统的交换机和路由器会根据数据包中的IP地址和MAC地址来决定将数据包发送到何处。但是,这个简单的转发能力无法满足现在负责的Web Farm的需求。例如,传统的路由器或交换机不能够比较智能的将数据包发送给特定的应用程序、特定的服务器等。即使有服务器down了,路由器等还是会将数据包发给这个服务器。
那么,我们到底如何来实现负载均衡呢?
首先,我们还看看比较重要的一些理论基础:OSI网络模型,如图
这个图,非常熟悉,我这里只是简述一下!OSI,就是开放的网络协议的标准了。从图中可以看到,这OSI模型,定义了七层,从物理层一直到最上面的应用层。网络协议,例如Tcp,UDP,IP,Http等分别对应模型中的不同层。其中IP协议处于第三层,TCP,UDP处理第四层。
大家就要问了?这个有啥用呢?
我们又知道:传统的路由器和交换器会位于OSI的第二或者第三层。也就说,它们决定了一个数据包必须如何被处理以及必须发往何处。尽管第二、三层的交换器做了非常了不起的事情,但是,其实在数据包的头信息中,有更多的有价值的信息没有被使用。如果我们在这个时候,将数据包获取,然后分析里面的头信息,然后将请求按照我们的需要进行转发,那么就可以在第二、层实现负载均衡等技术。这也是我们常常看到或者听到的Layer 2/3 Switching。
另外,如果在第四层到第七层中获取数据包,分析头信息,然后按需转发请求,就是所谓的“Layer 4 through 7 Switching”。在第四层中,TCP和UDP的头中包含了大量的信息,而这些信息可以使得我们更加智能的实现请求的转发。例如,当用户发送Http请求到部署到Tcp 80端口的站点的时候,我们可以分析通过分析头信息得到这个信息,从而可以将请求转发到其他的服务器上去。
今天先到这里,东西不多,废话可能一大堆 J!