理解分布式架构下的“负载均衡”是第二个更大的挑战。这个时候,我们就会想到通过扩容来提供更好的服务。什么是负载均衡?我们一般会把多台机器组成一个集群对外提供服务。但是,我们的网站只提供一个访问入口,例如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+四层负载+七层负载的方式进行多级负载均衡。阿里云常用的SLB负载均衡工具,硬件负载均衡性能优秀,功能全面,但价格昂贵,一般适合有钱的公司早期或长期使用。因此,软件负载均衡在互联网领域得到了广泛的应用。常用的软件负载均衡软件有LVS、Nginx、HAProxy等,LVS/Nginx/HAProxy是目前使用最广泛的三种负载均衡软件。LVSLVS(LinuxVirtualServer),又称Linux虚拟服务器,是由张文松博士发起的一个自由软件项目。使用LVS技术的目标是通过LVS和Linux操作系统提供的负载均衡技术,实现高性能、高可用的服务器集群。具有良好的可靠性、可扩展性和可操作性,从而以低成本实现最佳的服务性能。LVS主要用于四层负载均衡。LVS架构LVS搭建的服务器集群系统由三部分组成:最前端的负载均衡层(LoaderBalancer)。中间的服务器组层用ServerArray表示。第一层数据共享存储层用SharedStorage表示。从用户的角度来看,所有应用都是透明的,用户只是在使用虚拟服务器提供的高性能服务。LVS各层级详细介绍:LoadBalancer层:位于整个集群系统的最前端,由一个或多个负载调度器(DirectorServer)组成,LVS模块安装在DirectorServer上。Director的主要作用类似于一个路由器,它包含了为完成LVS功能而设置的路由表,通过这些路由表将用户的请求分发到ServerArray层的应用服务器(RealServer)。同时,DirectorServer上必须安装一个RealServer服务的监控模块Ldirectord。该模块用于监控各个RealServer服务的健康状态。当RealServer不可用时将其从LVS路由表中移除,恢复时重新加入。ServerArray层:由一组实际运行应用服务的机器组成。RealServer可以是Web服务器、Mail服务器、FTP服务器、DNS服务器、视频服务器中的一种或多种。每个虚拟服务器通过高速局域网或分布式广域网连接。在实际应用中,DirectorServer也可以同时充当RealServer的角色。共享存储层:是为所有RealServer提供共享存储空间和内容一致性的存储区域,物理上一般由磁盘阵列设备组成。为了提供内容的一致性,数据一般可以通过NFS网络文件系统进行共享,但是NFS在繁忙的业务系统中性能不是很好。这时候可以使用集群文件系统,比如RedHat的GFS文件系统,Oracle提供的OCFS2文件系统等。从整个LVS结构可以看出DirectorServer是整个的核心LVS。目前DirectorServer使用的操作系统只能是Linux和FreeBSD。Linux2.6内核无需任何设置即可支持LVS功能,而FreeBSD在很多应用中并没有作为DirectorServer使用,性能不是很好。对于RealServer,几乎所有的系统平台都可以使用,Linux、Windows、Solaris、AIX、BSD系列都可以得到很好的支持。NginxNginx是一个可以反向代理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完成工作后,直接关闭子进程,更换新的子进程,使用新的规则。HAProxyHAProxy也是一款用的比较多的负载均衡软件。HAProxy提供高可用、负载均衡、代理基于TCP和HTTP的应用,支持虚拟主机,是一个免费、快速、可靠的解决方案。特别适合那些负载比较大的网站。运行时模式可以轻松安全地集成到当前架构中,同时保护您的Web服务器不暴露在网络中。HAProxy是一种用C语言编写的免费开源软件,可通过TCP和HTTP提供高可用性、负载均衡和应用程序代理。HAProxy主要用于七层负载均衡。常见的负载均衡算法上面在介绍负载均衡技术时提到,负载均衡服务器在决定将请求转发到哪个真实服务器时,是通过负载均衡算法来实现的。负载均衡算法可以分为两类:静态负载均衡算法,包括轮询、比率和优先级。动态负载均衡算法,包括最小连接数、最快响应速度、观察方法、预测方法、动态性能分配、动态服务器补充、服务质量、服务类型、规则模式。循环法:顺序循环法将请求到每个服务器的顺序循环法连接。当第二层到第七层服务器出现故障时,BIG-IP会将其从顺序循环队列中取出,直到恢复正常后才参与下一次轮询。以轮询的方式依次请求和调度不同的服务器;实现的时候一般都是对服务器进行加权,这样有两个好处:1.可以根据服务器的性能差异来分配不同的负载。2、当需要淘汰节点时,只需要将其权重设置为0即可。优点:实现简单高效;易于水平扩展。缺点:请求到目的节点的不确定性,不适合写场景(缓存,写数据库)。应用场景:数据库或应用服务层只有读的场景。随机模式:请求随机分发到各个节点;在数据足够大的场景下,可以实现均衡分布。优点:实现简单,易于水平扩展。缺点:同RoundRobin,不能用于有写的场景。应用场景:数据库负载均衡也是只读场景。哈希法:根据key计算出需要落下的节点,可以保证相同的key一定落在同一台服务器上。优点:同一个key必须落在同一个节点上,所以可以用于读写兼备的缓存场景。缺点:节点失效后,hashkey会重新分配,导致攻击率大幅下降。解决方案:一致性哈希或者使用keepalived来保证任意一个节点的高可用,其他节点出现故障后会上来。应用场景:缓存,读写。一致性哈希:当服务器的某个节点发生故障时,只有该节点上的密钥受到影响,确保最高的成功率。比如twemproxy中的ketama方案;在生产实现中,也可以规划指定的子密钥散列,从而保证本地具有相似特征的密钥可以分布在同一台服务器上。优点:节点故障后速率下降有限。应用场景:缓存。根据key范围加载:根据key范围加载,前1亿个key存放在第一个服务器,100-2亿个存放在第二个节点。优点:容易横向扩展。当存储不够时,增加一台服务器来存储后续的新数据。缺点:负载不均;数据库分布不均。(数据可以区分冷热,一般最近注册的用户比较活跃,导致后续服务器很忙,而早期的节点空闲很多。)适用场景:分库负载均衡。Loadaccordingtomoduloofservernodesbykey:根据key对服务器节点数取模加载;例如有4台服务器,取模为0的key落在第一个节点上,1落在第二个节点上。优点:冷热数据分布均衡,数据库节点负载分布均匀。缺点:横向扩展困难。适用场景:数据库分片负载均衡。纯动态节点负载均衡:根据CPU、IO、网络的处理能力决定如何调度下一个请求。优点:充分利用服务器资源,保证多节点负载均衡。缺点:实现复杂,实用性差。无主动负载均衡:使用消息队列切换为异步模型,消除负载均衡问题;负载平衡是一种不断向您发送数据的推送模型。然后将所有用户请求发送到消息队列,所有空闲的下游节点都会上来取数据进行处理;切换到pull模型后,消除了下游节点的负载问题。优点:通过消息队列的缓冲保护后端系统,当请求激增时,后端服务器不会不堪重负;水平扩展容易,新增节点后,直接拿队列即可。缺点:不是实时的。应用场景:不需要实时返回的场景。比如12036下单后,立即返回提示信息:您的订单正在排队中……订单处理完成后,会异步通知。ratio:给每台server分配一个权重值,将用户的请求按照这个ratio分配给每台server。当其中一台服务器在第2层到第7层发生故障时,BIG-IP将其从服务器队列中取出,不参与下一个用户请求的分配,直到它恢复正常。优先级(Priority):对所有服务器进行分组,为每个组定义优先级,将BIG-IP用户的请求分配给优先级最高的服务器组(在同一组中,使用round-robin或ratio算法,分配用户请求)。当最高优先级的所有服务器都发生故障时,BIG-IP将请求发送给第二优先级的服务器组。这种方式实际上为用户提供了一种热备份的方式。最少连接(LeastConnection):将新连接传递给那些执行最少连接处理的服务器。当第二层到第七层服务器发生故障时,BIG-IP会将其从服务器队列中取出,直到恢复正常后才参与下一次用户请求的分配。最快模式(Fastest):将连接传递给那些响应最快的服务器。当第二层到第七层服务器发生故障时,BIG-IP会将其从服务器队列中取出,直到恢复正常后才参与下一次用户请求的分配。观察模式(Observed):连接数和响应时间是根据这两项的最佳平衡来为新的请求选择一个服务器。当第二层到第七层服务器发生故障时,BIG-IP会将其从服务器队列中取出,直到恢复正常后才参与下一次用户请求的分配。预测模式(Predictive):BIG-IP利用收集到的服务器当前性能指标进行预测分析,根据用户的请求(通过BIG-IPIPfor检测)。动态性能分配(DynamicRatio-APM):根据BIG-IP采集的应用和应用服务器的性能参数,动态调整流量分配。动态服务器法(DynamicServerAct):当主服务器群的数量因故障而减少时,备份服务器被动态添加到主服务器群中。服务质量(QoS):根据不同的优先级分配数据流。TypeofService(ToS):负载均衡根据不同的服务类型(在TypeofField中标识)分配数据流。规则模式:针对不同的数据流设置引导规则,用户可自行调整。负载均衡的几种算法Java实现代码1、轮询2、加权随机负载均衡算法3、随机负载均衡算法4、负载均衡ip_hash算法作者:陈谦平简介:13年软件开发经验,学新东西快,自学推动追求卓越,积极应对问题和变化。精通.NET、Java服务器开发、iOS、BI数据库开发;拥有多年移动平台、互联网平台研发管理经验。
