负载均衡:F5,Haproxy,lvs, nginx

负载均衡:F5,Haproxy,lvs, nginx,第1张

阅读本文前,需熟悉OSI七层参考模型。

常见的负载均衡设备,有F5,Haproxy,lvs, nginx等。

F5是商用硬件负载均衡,性能很好,但是价格昂贵,除了负载均衡,还有应用交换、会话交换、状态监控等众多功能。

F5一般做四层负载均衡,但也支持七层负载均衡。

Haproxy(以下简称ha)是软件负载均衡,开源,一般做七层负载均衡,但也支持四层负载均衡。

Linux Virtual Server(以下简称lvs)是软件负载均衡,开源,二层或四层负载均衡,已集成到linux内核,自身有完备的热备方案(keepalived+lvs),稳定性极强。

nginx也是软件负载均衡,开源,通过反向代理实现负载均衡,是七层负载均衡,性能不如上面的几个。

tips1

有些公司,测试环境用ha/lvs/nginx,生产环境用F5。

tips2

nginx做web服务器时,一般做静态资源服务器和php的web服务器,所以很多公司,会采用F5+nginx或者ha+nginx的架构

tips3

微服务中的ribbon属于客户端负载均衡,上面的几种都是服务端负载均衡

二层负载均衡

在数据链路层通过修改mac地址实现,如lvs的DR模式(直接路由模式)

三层负载均衡

在网络层通过DNAT协议修改目标地址实现

四层负载均衡

用ip+端口实现请求转发

备注:tcp报文里并没有ip,但是四层负载均衡可以用ip+端口,是因为server可以拿到ip

七层负载均衡

通过重新发起http请求实现,即client把请求发给lb,lb把请求代发给server,再把server的响应返回给client,因此七层负载均衡也经常被称为代理,七层负载均衡设备也被称为代理设备。

七层负载均衡常用于内网与外网的通信,比如内网无法直接访问外网,需要通过代理设备代发http请求,这种情况下,代理设备需要配置双网卡,以同时与内外网络通信。

由于需要重发http请求,七层负载均衡性能较差,但是更智能和安全,因为应用层可以获取甚至修改请求的真实内容(即应用数据),比如cookie、url等,可以做一些智能的操作,比如根据cookie/url转发请求,也可以做一些安全操作,比如过滤特定报文、防止SYN Flood攻击等。

使用七层负载均衡时,服务的性能受限于代理设备的网卡带宽。

常见的负载均衡策略,有轮询、加权轮询、ip_hash、cookie、url_hash,根据服务器响应时间转发、根据最少连接转发等等。

备注:nginx可以安装第三方插件,使用第三方实现的策略

轮询:按服务器列表顺序转发请求,轮询是nginx默认的策略,本策略适合服务器配置相当、请求无状态(即不依赖session)的场景

加权轮询:如果不同服务器配置不同,可以为配置高的服务器增加权重

ip_hash:根据ip哈希结果转发,可以实现同一用户持续请求同一服务器(即会话保持),适合有状态(即依赖session)的场景,对png、jpg、js、css等静态资源的请求,不适合使用本策略

cookie:根据特定cookie转发请求,一般也是用于实现会话保持,比如为服务器A、B分别增加service-flag=a、service-flag=b的cookie,后续请求根据cookie转发

可以参考 haproxy实现会话保持

url_hash:根据url哈希结果转发,同一个接口始终请求同一台服务器,一般配合缓存使用,缓存接口返回结果

根据服务器响应时间转发:优先转发到响应时间较快的服务器

根据最少连接转发:优先转发到连接数较少的服务器

F5有一些特有的负载均衡策略:利用从应用程序和服务器收集到的各项性能指标,分析并转发

负载均衡有两个步骤:

1.根据什么算法选择真实服务端,即负载均衡策略,如轮询、加权轮询、ip_hash、cookie、url_hash等;

2.把请求转发到真实服务器,转发方式有二层到七层负载均衡

keepalived软件一开始是专为lvs设计的,后来加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能,因此,keepalived还可以作为nginx、haproxy、mysql等服务的高可用解决方案。

以nginx为例,为了防止nginx本身由于宕机等原因导致网站不可用,一般会搭两套nginx反向代理,用keepalived提供一个VIP。

一般情况下,VIP只在nginx主节点上工作,如果nginx主节点不可用了,VIP会自动漂移到从节点,自动漂移的原理即VRRP协议。

VIP漂移到从节点后,如果主节点恢复正常了,VIP是否漂移回主节点,取决于当前模式是抢占模式还是非抢占模式。

下图是一张简单的架构图,解释如下:

以上观点纯属个人意见,如果错误,欢迎指出,有些地方写的很简单,是因为我也不懂~

这篇实用文章介绍如何将pfSense 2.0配置成你那些Web服务器的负载均衡器。这篇实用文章假设你已经安装了一个pfSense设备和至少两台Apache服务器,并且运行在你的网络上;还假设你具备了pfSense方面的一些知识。

要求

一台设备用于安装pfSense 2.0(如果这是你的边缘防火墙,我会建议物理机器)。

至少两台Apache2服务器(这些可以是虚拟服务器)。

对Apache服务器进行了配置,以便以某种方式同步Web文件(rsync/corosync或通过Web服务器维持文件版本最新的另一个选项)。

配置pfSense

pfSense使用负载均衡器,将某些类型的流量带来的负载分摊到多台服务器上;如果你有多台服务器用于托管运行应用程序,这很好;你可以将负载分摊到所有服务器上,而不是把负载全扔给一台服务器、导致不堪重负。

可以入手了,先点击“Services”(服务),然后点击“Load Balancers”(负载均衡器),然后点击“Monitor”(监视器)选项卡。

要添加一个新条目,点击“Plus”(添加)按钮,指定“Name”(名称)和“Description”(描述,在这个示例中,我会使用ApacheClusterMon作为名称和描述),将类型设成“HTTP”,然后为“Host”(主机)设置一个未使用的IP地址(我们随后会创建虚拟服务器的IP,以便分配给故障切换服务器组),任由“HTTP Code”(HTTP代码)设成“200 OK”。需要的话,然后点击“Save”(保存),使更改生效。

现在我们要创建服务器池。点击“Pools”(服务器池)选项卡,点击“Plus”(添加)按钮,即可添加新的服务器池。

指定一个名称(ApacheSrvPool将用在我的示例中)。将“Mode”(模式)设成“Load Balance”(负载均衡),然后将“Port”(端口)设成“80”(你可以让pfSense对其他端口上的其他应用程序实现负载均衡),将“Monitor”(监视器)设成你之前创建的监视器配置,并且指定你希望在服务器池中的所有Web服务器的IP地址,需要的话,点击“Save”(保存),使更改生效。

接下来点击“Virtual Servers”(虚拟服务器)选项卡,点击“Plus”(添加)按钮,添加一个新条目。指定“Name”(名称)和“Description”(描述),然后用你之前选择的未使用IP地址来设置“IP Address”(IP地址),将“Port”(端口)设成“80”,然后将“Virtual Server Pool”(虚拟服务器池)设成你之前创建的服务器池,点击“Submit”(提交),使更改生效。

就这样,你刚配置好了pfSense,对你的Web服务器之间的网络流量实现负载均衡。

顺便提一下,如果任何一台服务器没有给出200 OK状态这样的回应(pfSense定期向你的Web服务器发送请求,以确定它们是否正常运行),服务器池就会处于离线停运状态。要避免出现停运,最好的办法就是配置故障切换系统(下一篇文章会有介绍)。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/420296.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-25
下一篇2023-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存