当前位置: 首页 > 科技观察

浅谈几种常用的负载均衡架构

时间:2023-03-20 10:06:29 科技观察

什么是负载均衡?在建站初期,我们一般采用单机向平台提供集中服务。但是,随着业务量的增加,无论在性能上还是在稳定性上都面临着更大的挑战。这个时候,我们就会想到通过扩容来提供更好的服务。我们一般会把多台机器组成一个集群对外提供服务。但是,我们的网站只提供一个访问入口,例如www.taobao.com。那么当用户在浏览器中输入www.taobao.com时,如何将用户的请求分发到集群中不同的机器上,这就是负载均衡在做的事情。目前的互联网系统大多采用服务器集群技术。集群就是在多台服务器上部署同一个服务,形成一个集群,作为一个整体对外提供服务。这些集群可以是web应用服务器集群,数据库服务器集群,或者分布式缓存服务器集群等。在实际应用中,web服务器集群之前总会有一个负载均衡服务器。负载均衡器的任务是作为Web服务器流量的入口,选择最合适的Web服务器,将客户端的请求转发给它处理。从客户端到真实服务器的透明转发。近几年非常流行的“云计算”和分布式架构,本质上是使用后端服务器作为计算资源和存储资源,由管理服务器打包成一个服务对外提供服务。客户端不需要关心实际的服务提供者。是哪台机器?从它的角度看,它面对的似乎是一台具备近乎***能力的服务器,但本质上,真正提供服务的是后端集群。软件加载解决的两个核心问题是:选择谁和转发,其中最好的就是LVS(LinuxVirtualServer)。一个典型的互联网应用的拓扑结构如下:负载均衡的分类现在我们知道负载均衡是一种计算机网络技术,用于在多台计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源之间分配资源。分配负载以达到最大化资源使用、最大化吞吐量、最小化响应时间和避免过载的目的。好吧,有很多方法可以实现这种计算机技术。大致可以分为以下几种,其中以四层和七层负载均衡最为常用:二层负载均衡负载均衡服务器对外仍然提供一个VIP(虚拟IP),并且集群中的不同机器使用相同的IP地址,但机器的MAC地址不同。负载均衡服务器收到请求后,通过重写报文的目标MAC地址,将请求转发给目标机器,实现负载均衡。第三层负载均衡类似于第二层负载均衡。负载均衡服务器仍然对外提供一个VIP(虚拟IP),只是集群中不同的机器使用不同的IP地址。负载均衡服务器收到请求后,根据不同的负载均衡算法,将请求通过IP转发给不同的真实服务器。四层负载均衡四层负载均衡工作在OSI模型的传输层。由于传输层只有TCP/UDP协议,这两种协议除了源IP和目的IP外,还包括源端口号和目的端口号。.四层负载均衡服务器收到客户端请求后,通过修改数据包的地址信息(IP+端口号)将流量转发给应用服务器。七层负载均衡七层负载均衡工作在OSI模型的应用层,应用层协议有很多,如HTTP、Radius、DNS等。可以基于这些协议加载七层负载。这些应用层协议会包含很多有意义的内容。例如,在同一个Web服务器的负载均衡中,除了基于IP加端口的负载,还可以根据七层URL、浏览器类型、语言来决定是否进行负载均衡。图:四层和七层负载均衡对于一般的应用,Nginx就足够了。Nginx可用于七层负载均衡。但对于一些大型网站,一般采用DNS+四层负载+七层负载的方式进行多级负载均衡。常用的负载均衡工具。硬件负载均衡性能优越,功能全面,但价格昂贵。一般适合有钱的公司早期或长期使用。因此,软件负载均衡在互联网领域得到了广泛的应用。常用的软件负载均衡软件有Nginx、LVS、HaProxy等,Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件。1.LVSLVS(LinuxVirtualServer),又称Linux虚拟服务器,是由张文松博士发起的一个免费软件项目。使用LVS技术的目标是通过LVS提供的负载均衡技术和Linux操作系统实现高性能、高可用的服务器集群,具有良好的可靠性、可扩展性和可操作性。结果是以低成本获得高服务性能。LVS主要用于四层负载均衡。LVS架构LVS搭建的服务器集群系统由三部分组成:前端负载均衡层(LoaderBalancer),中间的服务器组层,以ServerArray为代表,最上层的数据共享存储层,以ServerArray为代表通过共享存储快递。从用户的角度来看,所有应用都是透明的,用户只是在使用虚拟服务器提供的高性能服务。LVS各层级详细介绍:LoadBalancer层:位于整个集群系统的最前端,由一个或多个负载调度器(DirectorServers)组成,LVS模块安装在DirectorServer上,其主要功能是Director类似于一个路由器,它包含了完成LVS功能的路由表集合,通过这些路由表将用户的请求分发到ServerArray层的应用服务器(RealServer)。同时,DirectorServer上必须安装一个RealServer服务的监控模块Ldirectord。该模块用于监控各个RealServer服务的健康状态。当RealServer不可用时将其从LVS路由表中移除,恢复时重新加入。ServerArray层:由一组实际运行应用服务的机器组成。真实服务器可以是Web服务器、邮件服务器、FTP服务器、DNS服务器和视频服务器中的一种或多种。每个RealServer通过高速LAN或分布式WAN连接进行连接。在实际应用中,DirectorServer也可以同时充当RealServer的角色。SharedStoragelayer:为所有RealServer提供共享存储空间和内容一致性的存储区域。它在物理上一般由磁盘阵列设备组成。为了提供内容的一致性,一般可以通过NFS网络文件系统来共享数据,但是NFS在繁忙的业务系统中,性能不是很好。这时候可以使用集群文件系统,比如Redhat的GFS文件系统和Oracle提供的OCFS2文件系统。从整个LVS结构可以看出,DirectorServer是整个LVS的核心。目前DirectorServer使用的操作系统只能是Linux和FreeBSD。Linux2.6内核无需任何设置即可支持LVS功能,而FreeBSD作为DirectorServer的应用还不多,性能也不是很好。对于RealServer,几乎所有的系统平台都可以使用,Linux、windows、Solaris、AIX、BSD系列都可以得到很好的支持。2.NginxNginx(发音与enginex相同)是一个可以反向代理HTTP、HTTPS、SMTP、POP3、IMAP协议链接的web服务器,同时也是一个负载均衡器和一个HTTP缓存。Nginx主要用于七层负载均衡。并发性能:官方支持5万并发/秒,国内实际平均2万并发/秒,部分优化为10万并发/秒。具体性能取决于应用场景。特点:模块化设计:扩展性好,可以通过模块进行功能扩展。可靠性高:主控进程与worker同步执行。如果一个worker有问题,另一个worker将立即启动。低内存消耗:10,000个长连接(keep-alive),仅消耗2.5MB内存。支持热部署:无需停止服务器即可更新配置文件、更换日志文件、更新服务器程序版本。并发性强:官方数据支持每秒5万并发;丰富的功能:优秀的反向代理功能和灵活的负载均衡策略。Nginx的基本工作模式是一个master进程产生一个或多个worker进程。但是这里master是以root身份启动的,因为Nginx需要工作在80端口,只有administrator才有权限启动小于1023的端口。master的主要作用是启动workers,加载配置文件,负责系统的顺利升级。剩下的工作交给工人。当worker启动时,它只负责web上一些最简单的工作,其他的工作则由worker中调用的模块来实现。功能以流水线方式在模块之间实现。流水线是指一个用户的请求,通过多个模块按照各自的功能依次组合完成。例如:第一模块只负责解析请求头,第二模块只负责查找数据,第三模块只负责压缩数据,依次完成各自的任务。来完成整个工作。他们如何实现热部署?就是这样。前面我们说过master不负责具体的工作,而是调用worker。它只负责读取配置文件。因此,当一个模块被修改或者配置文件发生变化时,是由master读取决定的,所以不会影响此时worker的工作。master读取配置文件后,不会立即通知worker修改了配置文件。而是让修改后的worker继续使用旧的配置文件工作。当worker完成工作后,直接杀掉子进程,替换新的子进程,使用新的规则。3.HAProxyHAProxy也是一款用的比较多的负载均衡软件。HAProxy提供高可用、负载均衡、代理基于TCP和HTTP的应用,支持虚拟主机,是一个免费、快速、可靠的解决方案。特别适用于那些负载较重的网站。运行时模式可以轻松安全地集成到当前架构中,同时保护您的Web服务器不暴露在网络中。HAProxy是一种用C语言编写的免费开源软件,可提供基于TCP和HTTP的应用程序的高可用性、负载平衡和代理。Haproxy主要用于七层负载均衡。常见的负载均衡算法上面在介绍负载均衡技术时提到,负载均衡服务器在决定将请求转发到哪个真实服务器时,是通过负载均衡算法来实现的。负载均衡算法可以分为两大类:静态负载均衡算法和动态负载均衡算法。静态负载均衡算法包括:roundrobin、ratio、priority。动态负载均衡算法包括:最小连接数、最快响应速度、观察方法、预测方法、动态性能分配、动态服务器补充、服务质量、服务类型、规则模式。循环法:顺序循环法将请求到每个服务器的顺序循环法连接。当其中一台服务器在第2层到第7层发生故障时,BIG-IP将其从顺序循环队列中取出,直到恢复正常后才参与下一轮轮询。以循环方式依次请求和调度不同的服务器;实现的时候,服务器一般都是加权的;这样做有两个好处:可以根据服务器的性能差异分配不同的负载;当一个节点需要被移除时,只需要将它的权重设置为0;优点:实现简单高效;容易水平扩展缺点:请求到目的节点的不确定性使其不适用于有写的场景(缓存,数据库写)节点;在数据足够大的场景下,可以实现均衡分布;优点:实现简单,容易水平扩展缺点:同RoundRobin,不能用于写的场景应用场景:数据库负载均衡,只读场景Hash方法:计算需要落在key上的节点,可以保证相同的密钥必须落在同一台服务器上;优点:同一个key必须落在同一个节点上,所以可以用在有write和read的缓存场景。缺点:节点失效后,会导致hashkey重新分配,导致攻击率大幅下降。解决方案:一致性哈希望使用keepalived保证任意节点的高可用。失败后,其他节点会顶上去。应用场景:缓存、读写一致性hash:当服务器的某个节点发生故障时,只有该节点受到影响,节点上的key保证效率最大化;比如twemproxy中的ketama方案;在生产实现中,也可以规划指定的子密钥散列,从而保证本地具有相似特征的密钥可以分布在同一台服务器上;优点:节点故障后速率下降有限应用场景:根据key的范围加载缓存:前1亿个key存放在第一个服务器,100-2亿个存放在第一个服务器第二个节点。优点:容易水平扩展,当存储不够时,增加一台服务器存储后续新的数据缺点:负载不均;数据库分布不均;忙,前期节点空闲)适用场景:数据库分片负载均衡负载根据key对服务器节点数取模:根据key对服务器节点数取模负载;比如有4台服务器,key取模0落在第一个节点,1落在第二个节点。优点:冷热数据均衡分布,数据库节点负载均衡分布;缺点:横向扩展困难;适用场景:数据库分片负载均衡纯动态节点负载均衡:根据CPU、IO、网络处理能力决定下一步请求如何调度。优点:充分利用服务器资源,保证各节点负载均衡。缺点:实现起来比较复杂,实际使用较少。无主动负载均衡:使用消息队列转换为异步模型,消除了负载均衡的问题;负载均衡是一个push模型,一直给你发数据,然后把所有的用户请求都发到消息队列,所有空闲的下游节点都会上来取数据处理;切换到拉模型后,下游节点的负载问题被消除。优点:通过消息队列的缓冲保护后端系统,当请求激增时,后端服务器不会不堪重负;横向扩展容易,新增节点后,直接拿队列即可;缺点:不实时;应用场景:不需要实时返回的场景;例如12036下单后,会立即返回提示信息:您的订单正在排队中……处理完成后,会异步通知;ratio:给每台服务器分配一个加权值的比例,根据这个比例,将用户的请求分配给每台服务器。当其中一台服务器在第2层到第7层发生故障时,BIG-IP将其从服务器队列中取出,不参与下一个用户请求的分配,直到它恢复正常。优先级(Priority):对所有服务器进行分组,为每个组定义优先级,将BIG-IP用户的请求分配给优先级最高的服务器组(在同一组中,使用round-robin或ratio算法,分配用户的请求);当优先级最高的所有服务器都发生故障时,BIG-IP会将请求发送给优先级第二的服务器组。这种方式实际上为用户提供了一种热备份的方式。最少连接(LeastConnection):将新连接传递给那些执行最少连接处理的服务器。当其中一台服务器在第2层到第7层发生故障时,BIG-IP将其从服务器队列中取出,不参与下一个用户请求的分配,直到它恢复正常。最快模式(Fastest):将连接传递给那些响应最快的服务器。当一个服务器从第二层到第七层发生故障时,BIG-IP会将其从服务器队列中取出,直到恢复正常后才参与下一个用户请求的分配。观察模式(Observed):连接数和响应时间是根据这两项的最佳平衡来为新的请求选择一个服务器。当一个服务器从第二层到第七层发生故障时,BIG-IP会将其从服务器队列中取出,直到恢复正常后才参与下一个用户请求的分配。预测模式(Predictive):BIG-IP利用收集到的服务器当前性能指标进行预测分析,选择出下一个时间片内性能将达到用户请求对应的最佳服务器的服务器。(BIG-IP检测)DynamicRatio-APM:BIG-IP收集应用和应用服务器的各种性能参数,动态调整流量分配。动态服务器行为:当主服务器组因故障而减少时,动态添加备份服务器到主服务器组中。服务质量(QoS):根据不同的优先级分配数据流。TypeofService(ToS):根据不同的服务类型(在TypeofField中标识),负载均衡分配数据流。规则模式:针对不同的数据流设置引导规则,用户可自行制定。