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

十分钟搞懂负载均衡

时间:2023-03-17 00:59:19 科技观察

首先要明白,所谓“均衡”不能狭义地理解为将相同的工作负载分配给所有实际的服务器,因为多台服务器的承载能力不同,可能体现在硬件配置1.网络带宽的差异也可能是由于某台服务器身兼多职。我们所说的“平衡”是指我们希望所有的服务器都不会过载并且能够高效地运行。1、http重定向当http代理(如浏览器)向web服务器请求某个URL时,web服务器可以通过http响应头信息中的Location标签返回一个新的URL。这意味着HTTP代理需要继续请求这个新的URL来完成自动跳转。性能缺陷:1.吞吐率限制主站点服务器的吞吐率被平均分配给转移服务器。现在假设采用RR(RoundRobin)调度策略,子服务器的最大吞吐率为1000reqs/s,那么主服务器的吞吐率必须达到3000reqs/s才能充分发挥三者的作用子服务器,那么如果有100个子服务器,那么主服务器的吞吐率可想而知很大?反之,如果主服务器的最大吞吐率为6000reqs/s,那么分配给子服务器的平均吞吐率为2000reqs/s,当前子服务器的***吞吐率为1000reqs/s,所以子服务器的数量必须增加到6个才能满足要求。2、重定向访问的深度不同。有的重定向静态页面,有的重定向复杂的动态页面。那么实际服务器的负载差异是不可预测的,而主服务器什么都不知道。所以用重定向的方式做全站的负载均衡是不好的。我们需要权衡传输请求的开销和处理实际请求的开销。前者比后者越小,重定向越有意义,比如下载。你可以去很多镜像下载站点试试,你会发现基本的下载都是使用Location重定向的。2、DNS负载均衡DNS负责提供域名解析服务。访问站点时,首先要通过该站点域名的DNS服务器获取该域名指向的IP地址。在这个过程中,DNS服务器完成域名到IP地址的映射,同样,这个映射也可以是一对多的。此时DNS服务器作为一个负载均衡调度器,就像http重定向转换策略一样,将用户请求分发到多个服务器上,但其实现机制完全不同。使用dig命令查看“baidu”的DNS设置。可见百度有3条A记录。与http重定向相比,基于DNS的负载均衡完全省去了所谓的主站,或者说DNS服务器已经充当了主站。但不同的是,作为调度器,几乎不需要担心DNS服务器本身的性能。由于DNS记录可以被用户的浏览器缓存,也可以被各级互联网接入服务商的DNS服务器缓存,只有当缓存过期后,才会再次请求该域名的DNS服务器进行解析。也有人说DNS没有http的吞吐量限制,理论上可以最大化实际服务器的数量。特点:1.可根据用户IP进行智能分析。DNS服务器可以在所有可用的A记录中找到离用户最近的服务器。2、动态DNS:每次IP地址变化时及时更新DNS服务器。当然,因为有缓存,一定的延迟是不可避免的。缺点:1、用户无法直接看到DNS解析到哪个实际服务器,给服务器运维人员调试带来不便。2.策略的局限性。比如不能在调度策略中引入HTTP请求的上下文。在上述基于HTTP重定向的负载均衡系统中,调度器工作在HTTP层面。能够充分理解HTTP请求,根据站点的应用逻辑进行设计。调度策略,如根据请求不同的URL进行合理的过滤和中转。3、如果要根据实际服务器的实时负载差异来调整调度策略,这就需要DNS服务器在每次解析操作的时候分析各个服务器的健康状态。对于DNS服务器来说,这种自定义开发的门槛很高。更不用说大多数站点只是使用第三方DNS服务。4、DNS记录缓存,各级节点DNS服务器不同程序的缓存,看得头晕目眩。5、基于以上几点,DNS服务器并不能很好的完成工作负载均衡分配。最后,是否选择基于DNS的负载均衡方式,完全取决于你的需求。3.反向代理负载均衡这个想必大家都有所触动,因为几乎所有的主流web服务器都热衷于支持基于反向代理的负载均衡。它的核心工作是转发HTTP请求。相对于之前的HTTP重定向和DNS解析,反向代理的调度器起到了用户和实际服务器之间的中间人的作用:1.任何对实际服务器的HTTP请求都必须经过调度器2.调度器必须等待针对实际服务器HTTP响应,反馈给用户(前两种方式不需要调度反馈,实际服务器直接发送给用户)特点:1.丰富的调度策略。比如可以为不同的实际服务器设置不同的权重,达到谁多干活的效果。2、对反向代理服务器的并发处理能力要求很高,因为它工作在HTTP层面。3.反向代理服务器的转发操作本身需要一定的开销,比如创建线程,与后端服务器建立TCP连接,接收后端服务器返回的处理结果,解析HTTP头信息,频繁用户空间和内核空间的切换等这部分时间虽然不长,但是当后端服务器处理请求的时间很短的时候,转发的开销就显得尤为突出。比如请求静态文件,使用上面介绍的基于DNS的负载均衡方式就比较合适。4、反向代理服务器可以监控后端服务器,如系统负载、响应时间、可用性、TCP连接数、流量等,从而根据这些数据调整负载均衡策略。5.反射代理服务器允许用户始终将一个会话周期内的所有请求转发到特定的后端服务器(粘性会话)。这样做的好处是保持本地对session的访问,防止后端服务器动态内存缓存的资源浪费。四、IP负载均衡(LVS-NAT)由于反向??代理服务器工作在HTTP层,其自身的开销严重制约了可扩展性,从而限制了其性能极限。能否在HTTP层级以下实现负载均衡?NAT服务器:工作在传输层,可以修改发送的IP数据包,将数据包的目的地址修改为实际的服务器地址。从Linux2.4内核开始,其内置的Neftilter模块在内核中维护了一些数据过滤表,这些表包含了控制数据过滤的规则。好消息是Linux提供了iptables来插入、修改和删除过滤表。更令人兴奋的是Linux2.6.x内核内置了IPVS模块。其工作性质与Netfilter模块类似,但更侧重于实现IP负载均衡。想知道你的服务器内核有没有安装IPVS模块,可以有IPVS已经安装的输出。IPVS的管理工具是ipvsadm,它提供了一个基于命令行的配置界面,通过它可以快速实现负载均衡系统。这就是大名鼎鼎的LVS(LinuxVirtualServer,Linux虚拟服务器)。1、打开scheduler的包转发选项echo1>/proc/sys/net/ipv4/ip_forward2。检查实际服务器是否已经使用NAT服务器作为默认网关。如果没有,添加routeadddefaultgwxx.xx.xx.xx3,使用ipvsadm配置ipvsadm-A-t111.11.11.11:80-srr添加虚拟服务器,-t后面是服务器的外网ip和端口,-srr指的是RR调度策略使用simplepolling(这个属于静态调度策略,另外LVS也提供了一系列的动态调度策略,比如最小连接(LC),最小连接权重(WLC),最短预期时间延迟(SED)等)ipvsadm-a-t111。11.11.11:80-r10??.10.120.210:8000-mipvsadm-a-t111.11.11.11:80-r10??.10.120.211:8000-m添加两个实际服务器(不需要有外网ip),-r后面是实际服务器的内网ip和端口,-m表示使用NAT方式转发数据包。运行ipvsadm-L-n查看实际服务器的状态。这个做完了。实验证明采用基于NAT的负载均衡系统。NAT服务器作为调度器可以将吞吐率提升到一个新的高度,几乎是反向代理服务器的两倍多,这主要是由于内核中请求转发的开销较低。但是一旦请求内容过大,无论是基于反向代理还是基于NAT,负载均衡的整体吞吐量相差不大,也就是说对于成本高的内容,采用简单的反向代理构建负载均衡系统值得考虑。这么强大的系统还是有瓶颈的,那就是NAT服务器的网络带宽,包括内网和外网。当然,如果你不缺钱,你可以花钱买千兆交换机或者十兆交换机,甚至是负载均衡硬件设备,但是如果你是个屌丝,怎么办?一种简单有效的方式是将基于NAT的集群与之前的DNS混合使用,比如5个100Mbps出口宽带集群,然后利用DNS将用户请求均衡指向这些集群。同时,您还可以使用DNS智能解析,实现就近访问。这样的配置对于大部分业务来说已经足够了,但是对于提供下载或者视频等服务的大型站点来说,NAT服务器还是不够用。5、直接路由(LVS-DR)NAT工作在网络分层模型的传输层(第4层),而直接路由工作在数据链路层(第2层),看起来比较尴尬。它通过修改数据包的目的MAC地址(不修改目的IP)将数据包转发给实际的服务器。不同的是,实际服务器的响应数据包会直接发送给客户端,不经过调度器。1、网络设置这里假设有一个负载均衡调度器,两台实际服务器,购买了三个外网ip,每台机器一个。三台机器的默认网关需要相同,最后设置相同的ip别名,这里假设别名是10.10.120.193。这样调度器就会通过10.10.120.193这个IP别名来访问,你可以把站点的域名指向这个IP别名。2.在loopback接口lo中添加ip别名。这是为了防止实际服务器寻找其他具有该IP别名的服务器并在实际服务器中运行:另外,还需要防止实际服务器响应网络中IP别名的ARP广播为此目的,执行:echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announcecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"1">/proc/sys/net/ipv4/conf/all/arp_announce配置完成后,可以使用ipvsadm配置LVS-DR集群ipvsadm-A-t10.10.120。193:80-srripvsadm-a-t10.10.120.193:80-r10??.10.120.210:8000-gipvsadm-a-t10.10.120.193:80-r10??.10.120.211:8000-g-g表示直接使用最大LVS-DR与LVS-NAT相比的优势在于LVS-DR不受调度器带宽的限制。例如,假设WAN交换机出口处的三台服务器的带宽被限制为10Mbps,只要连接调度器和两台实际服务器的LAN交换机之间没有速度限制。那么,使用LVS-DR理论上可以达到最大20Mbps的出口带宽,因为它的实际服务器的响应数据包可以直接发送给服务器,不需要调度器。用户端,所以跟调度器的出口宽带无关,只有自己的。而如果使用LVS-NAT,集群最多只能使用10Mbps的宽带。因此,响应数据包远超服务请求数据包越多,调度器传输请求开销越应该减少,整体可扩展性越能提高,最终越依赖WAN出口宽带。一般来说,LVS-DR适合构建可扩展的负载均衡系统。无论是Web服务器,文件服务器,还是视频服务器,都有着出色的性能。前提是你必须为实际设备购买一系列合法的IP地址。6、IP隧道(LVS-TUN)基于IP隧道的请求转发机制:将调度器收到的IP包封装在一个新的IP包中转发给实际服务器,然后实际服务器的响应包可以直接到达客户。目前大部分Linux都支持,可以用LVS实现,称为LVS-TUN。与LVS-DR不同的是实际服务器和调度器不能在同一个WANt网段,调度器通过IP隧道技术将请求转发给实际服务器,所以实际的服务器也必须有一个合法的IP地址。一般来说,LVS-DR和LVS-TUN都适用于非对称响应和请求的Web服务器。如何选择取决于你的网络部署需求,因为LVS-TUN可以根据需要部署实际的服务器。地域不同,传输请求基于就近访问的原则,所以如果你有类似的需求,应该选择LVS-TUN。