haproxy负载均衡(haproxy负载均衡介绍)

http://www.itjxue.com  2023-02-22 11:43  来源:未知  点击次数: 

负载均衡——LVS,HAProxy和Nginx对比分析

负载均衡(Load Balance)是应用于互联网后台系统架构设计中的各层,它将请求均匀分摊到多个操作单元上执行。

目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,但是硬件设备昂贵,不如软件适应互联网公司的快速发展。最常用的负载均衡软件有LVS、HAProxy和Nginx,结合高可用软件有Heartbeat、Keepalived,可以搭建出承载海量请求的成熟架构如LVS+Keepalived、HAProxy+keepalived等.

三种负载均衡软件LVS、HAProxy和Nginx的优缺点说明如下:

LVS的优点:

LVS的缺点:

HAProxy的优点:

Nginx的优点:

Nginx的缺点:

简单地不负责任地说,性能上LVSHANginx,功能性和便利性上NginxHALVS。

对于一个大型后台系统来说,LVS、HAProxy和Nginx常常可以配合使用在不同的层级,LVS用在接入层的最前端,承担最大规模的流量分发;HAProxy负责按域名分流;而Nginx只需要作为Web服务器负责单机内多实例的负载均衡,或负责目录结构分流和静态资源缓存等需求。

所谓的四层与七层负载均衡,就是在对后台服务器进行负载均衡时,依据OSI四层的信息或七层的信息来决定怎么样转发流量。比如四层负载均衡通过报文中的目标IP地址和端口,七层负载均衡通过报文中的应用层信息(URL、HTTP头部等信息),选择到达目的的内部服务器。四层负载均衡在解包上的消耗更少,可以达到更高的性能。而七层负载算法可以通过更多的应用层信息分发请求,功能性上更强大。

七层负载均衡软件可以通过URL、Cookie和HTTP head等信息,而不仅仅是IP端口分发流量,还可以修改客户端的请求和服务器的响应(例如HTTP请求中的Header的重写),极大提升了应用系统在网络层的灵活性。

在网络中常见的SYN Flood攻击中,黑客会对同一目标大量发送SYN报文,耗尽服务器上的相关资源,以达到Denial of Service(DoS)的目的。四层模式下这些SYN攻击都会被转发到后端的服务器上;而在七层模式下这些SYN攻击在负载均衡设备上就截止,不会影响后台服务器的正常运营。另外负载均衡设备可以在七层层面设定多种策略,过滤SQL Injection等应用层面的特定攻击手段,进一步提高系统整体安全。

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

阅读本文前,需熟悉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是否漂移回主节点,取决于当前模式是抢占模式还是非抢占模式。

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

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

如何在Linux上使用HAProxy配置HTTP负载均衡系统

一、安装HAProxy

1、创建HAProxy运行账户和组

groupadd haproxy #添加haproxy组

useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy用户直接登录系统

2、安装编译工具

yum install gcc gcc-c++ make openssl-devel kernel-devel

3、安装HAProxy

HAProxy下载地址:

上传haproxy-1.5.2.tar.gz到/usr/local/src目录中

cd /usr/local/src #进入软件包存放目录

tar zxvf haproxy-1.5.2.tar.gz #解压

cd haproxy-1.5.2 #进入安装目录

make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haprpxy #编译

make install PREFIX=/usr/local/haproxy #安装

参数说明:

TARGET=linux26 #使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26

CPU=x86_64 #使用uname -r查看系统信息,如x86_64 x86_64 x86_64 GNU/Linux,此时该参数就为x86_64

PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径

4、设置HAProxy

mkdir -p /usr/local/haproxy/conf #创建配置文件目录

mkdir -p /etc/haproxy #创建配置文件目录

cp /usr/local/src/haproxy-1.5.2/examples/haproxy.cfg /usr/local/haproxy/conf/haproxy.cfg #拷贝配置模板文件

ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接

cp -r /usr/local/src/haproxy-1.5.2/examples/errorfiles /usr/local/haproxy/errorfiles #拷贝错误页面

ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles #添加软连接

mkdir -p /usr/local/haproxy/log #创建日志文件目录

touch /usr/local/haproxy/log/haproxy.log #创建日志文件

ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log #添加软连接

cp /usr/local/src/haproxy-1.5.2/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件

chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限

chkconfig haproxy on #设置开机启动

update-rc.d haproxy defaults 99 # ubuntu 设置开机启动

ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin #添加软连接

5、配置haproxy.cfg参数

cp /usr/local/haproxy/conf/haproxy.cfg /usr/local/haproxy/conf/haproxy.cfg-bak #备份

vi /usr/local/haproxy/conf/haproxy.cfg #编辑,修改

global

log 127.0.0.1 local0 notice

maxconn 2000

user haproxy

group haproxy

defaults

log global

mode http

option httplog

option dontlognull

retries 3

option redispatch

timeout connect 5000

timeout client 10000

timeout server 10000

listen appname 0.0.0.0:80

mode http

stats enable

stats uri /haproxy?stats

stats realm Strictly\ Private

stats auth A_Username:YourPassword

stats auth Another_User:passwd

balance roundrobin

option httpclose

option forwardfor

server lamp1 10.0.0.1:80 check

server lamp2 10.0.0.2:80 check

这里的haproxy.cfg只是一个案例,你可以根据实际情况修改

Hive/Impala--HAProxy实现Impala/HiveServer2负载均衡

1、在集群中选择一个节点,使用yum方式安装HAProxy服务

2.启动与停止HAProxy服务,并将服务添加到自启动列表

将/etc/haproxy目录下的haproxy.cfg文件备份,新建haproxy.cfg文件,添加如下配置

主要配置了HAProxy的http状态管理界面、impalashell和impalajdbc的负载均衡。

配置完成后重启HAProxy

浏览器访问http://{hostname}:1080/stats查看状态界面

使用多个终端同时访问,并执行SQL语句,查看是否会通过HAProxy服务自动负载到其它Impala Daemon节点

使用Impala shell访问HAProxy服务的25003端口,命令如下

打开第一个终端访问并执行SQL

同时打开第二个终端访问并执行SQL

通过以上测试可以看到,两个终端执行的SQL不在同一个Impala Daemon,这样就实现了Impala Daemon服务的负载均衡。

url改变为haproxy的host以及impala jdbc负载均衡配置的端口:

编辑/etc/haproxy/haproxy.cfg文件,在文件末尾增加如下配置

重启HAProxy服务

使用Beeline访问HAProxy服务的25005端口,命令如下

url改变为haproxy的host以及hive jdbc负载均衡配置的端口:

Haproxy 8种算法+Session共享

Haproxy有8种负载均衡算法(balance),分别如下:

1.balanceroundrobin# 轮询,软负载均衡基本都具备这种算法

2.balancestatic-rr# 根据权重,建议使用

3.balanceleastconn# 最少连接者先处理,建议使用

4.balancesource# 根据请求源IP,建议使用

5.balanceuri# 根据请求的URI

6.balanceurl_param,#根据请求的URl参数'balanceurl_param'requiresanURLparametername

7.balancehdr(name)# 根据HTTP请求头来锁定每一次HTTP请求

8.balancerdp-cookie(name)# 根据据cookie(name)来锁定并哈希每一次TCP请求

由于负载请求分发到不同服务器,可能导致Session会话不同步的问题,若想实现会话共享或保持,可采用如下3种方式:

1.用户IP 识别

haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)

配置指令

balance source

2.Cookie 识别

haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE ID。

配置指令例举

cookie SESSION_COOKIE insert indirect nocache

用firebug可以观察到用户的请求头的cookie里 有类似” Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1” SESSION_COOKIE=app1就是haproxy添加的内容

3.Session 识别

haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。

配置指令例举

appsession JSESSIONID len 64 timeout 5h request-learn

(责任编辑:IT教学网)

更多
上一篇:没有了

相关Javascript/Ajax文章

推荐Javascript/Ajax文章