一、四层和七层负载均衡的区别
所谓的四层就是ISO参考模型中的第四层。四层负载均衡也称为四层交换机,它主要是 通过分析IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡。常见的基于四层的负 载均衡器有LVS、F5等。
以常见的TCP应用为例,负载均衡器在接收到第一个来自客户端的SYN请求时,会通 过设定的负载均衡算法选择一个最佳的后端服务器,同时将报文中目标IP地址修改为后端 服务器IP,然后直接转发给该后端服务器,这样一个负载均衡请求就完成了。从这个过程来看,一个TCP连接是客户端和服务器直接建立的,而负载均衡器只不过完成了一个类似路由 器的转发动作。在某些负载均衡策略中,为保证后端服务器返回的报文可以正确传递给负载均衡器,在转发报文的同时可能还会对报文原来的源地址进行修改。整个过程下图所示。
同理,七层负载均衡器也称为七层交换机,位于 OSI 的最高层,即应用层,此时负载均衡器支持多种应用协议,常见的有 HTTP、FTP、SMTP 等。七层负载均衡器可以根据报文内 容,再配合负载均衡算法来选择后端服务器,因此也称为“内容交换器”。比如,对于 Web 服务器的负载均衡,七层负载均衡器不但可以根据“IP+端口”的方式进行负载分流,还可以根据网站的 URL、访问域名、浏览器类别、语言等决定负载均衡的策略。例如,有两台 Web 服务器分别对应中英文两个网站,两个域名分别是 A、B,要实现访问 A 域名时进入中 文网站,访问 B 域名时进入英文网站,这在四层负载均衡器中几乎是无法实现的,而七层负 载均衡可以根据客户端访问域名的不同选择对应的网页进行负载均衡处理。常见的七层负载均衡器有 HAproxy、Nginx 等。
这里仍以常见的TCP应用为例,由于负载均衡器要获取到报文的内容,因此只能先代替后端服务器和客户端建立连接,接着,才能收到客户端发送过来的报文内容,然后再根据该 报文中特定字段加上负载均衡器中设置的负载均衡算法来决定最终选择的内部服务器。纵观 整个过程,七层负载均衡器在这种情况下类似于一个代理服务器。整个过程如下图所示。
对比四层负载均衡和七层负载均衡运行的整个过程,可以看出,在七层负载均衡模式下,
负载均衡器与客户端及后端的服务器会分别建立一次TCP连接,而在四层负载均衡模式下, 仅建立一次TCP连接。由此可知,七层负载均衡对负载均衡设备的要求更高,而七层负载均 衡的处理能力也必然低于四层模式的负载均衡。
二、A与LVS的异同
下面就这两种负载均衡软件的异同做一个简单总结:
1)两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,而HAProxy是基于第三应用实现的软负载均衡。
2)LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术、可提供TCP和HTTP应用的负载均衡综合解决方案。
3)LVS工作在ISO模型的第四层,因此其状态监测功能单一,而HAProxy在状态监测 方面功能强大,可支持端口、URL、脚本等多种状态检测方式。
4)HAProxy虽然功能强大,但是整体处理性能低于四层模式的LVS负载均衡,而LVS拥有接近硬件设备的网络吞吐和连接负载能力。
综上所述,HAProxy和LVS各有优缺点,没有好坏之分,要选择哪个作为负载均衡器,要以实际的应用环境来决定。
三、快速安装A集群软件
可以在HAProxy的官网http://www.haproxy.org/下载HAProxy的源码包,这里以操作系统Centos6.6 X64版本为例,下载的HAProxy是haproxy-1.6.7.tar.gz,安装过程如 下:
#tar -zxvf haproxy-1.6.7.tar.gz
#cd haproxy-1.6.7
#make TARGET=linux26 PREFIX=/usr/local/haproxy
注:此处TARGET=linux26是填写系统内核版本 ,内核版本怎么看. uname -r 。如我的版本是2.6.32-504.el6.x86_64, 直接填写26即可。
#make install PREFIX=/usr/local/haproxy
将haproxy安装到/usr/local/haproxy下
#mkdir /usr/local/haproxy/conf
haproxy默认不创建配置文件目录,这里是创建haproxy配置文件目录
# cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
#haproxy安装完成后,默认安装目录中没有配置文件,这里是将源码包里面的示例配置文件拷贝到配置文件目录
这样,HAProxy就安装完成了。
四、A基础配置文件详解
HAProxy配置文件根据功能和用途,主要有5个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。
(1) global部分 用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
(2) defaults部分 默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、
backend和listen部分中,因此,如果某些参数属于公用的配置,只需在defaults部分添加 一次即可。而如果在frontend、backend和listen部分中也配置了与defaults部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
(3) ronte部分
此部分用于设置接收用户请求的前端虚拟节点。frontend是在HAProxy1.3版本之后才引 入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了 HAProxy配置文件的复杂性。frontend可以根据ACL规则直接指定要使用的后端backend。
(4) backend部分 此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前
端用户的请求。添加的真实服务器类似于LVS中的real server节点。
(5) ste部分
此部分是frontend部分和backend部分的结合体。在HAProxy1.3版本之前,HAProxy的 所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy新的版本仍然保留了listen 组件的配置方式。目前在HAProxy中,两种配置方式任选其一即可。
下面是一个完整的HAProxy配置文件
Global
log127.0.0.1 local0 info
maxconn4096
usernobody
groupnobody
daemon
nbproc 1
pidfile/usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeoutconnect 10s
timeoutclient 20s
timeoutserver 30s
timeoutcheck 5s
frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
#acl host_wwwhdr_dom(host) -i www.zb.com
#acl host_imghdr_dom(host) -i img.zb.com
#use_backendhtmpool if host_www
#use_backendimgpool if host_img
default_backend htmpool
backend htmpool
mode http
optionredispatch
optionabortonclose
balance static-rr
cookieSERVERID
optionhttpchk GET /index.jsp
server237server 192.168.81.237:8080 cookie server1weight 6 check inter 2000 rise2 fall 3
serveriivey234 192.168.81.234:8080 cookie server2weight 3 check inter 2000 rise 2 fall 3
backend imgpool
mode http
optionredispatch
optionabortonclose
balance static-rr
cookieSERVERID
optionhttpchk GET /index.jsp
serverhost236 192.168.81.236:8080 cookie server1 weight 6 check inter 2000rise 2fall 3
listen admin_stats
bind0.0.0.0:9188
mode http
log127.0.0.1 local0 err
statsrefresh 30s
stats uri/haproxy-status
statsrealm welcome login\ Haproxy
stats authadmin:admin~!@
statshide-version
statsadmin if TRUE
五、启动与测试hprox的负载均衡功能
1、启动与管理haproxy
启动服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
重启服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg \
-st `cat/usr/local/haproxy/logs/haproxy.pid`
停止服务:
# killall haproxy
六、ro负载均衡器算法与使用技巧
1、HAProxy支持的负载均衡算法
(1)、roundrobin,表示简单的轮询,负载均衡基础算法
(2)、static-rr,表示根据权重
(3)、leastconn,表示最少连接者先处理
(4)、source,表示根据请求源IP
(5)、uri,表示根据请求的URI;
(6)、url_param,表示根据请求的URl参数来进行调度
(7)、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
(8)、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
2、常用的负载均衡算法
(1)轮询算法:roundrobin
(2)根据请求源IP算法:source
(3)最少连接者先处理算法:lestconn
七、通过A的ACL规则实现智能负载均衡
由于HAProxy可以工作在七层模型下,因此,要实现HAProxy的强大功能,一定要使用强大灵活的ACL规则,通过ACL规则可以实现基于HAProxy的智能负载均衡系统。HAProxy 通过ACL规则完成两种主要的功能,分别是:
1)通过设置的ACL规则检查客户端请求是否合法。如果符合ACL规则要求,那么就将
放行,反正,如果不符合规则,则直接中断请求.
2)符合ACL规则要求的请求将被提交到后端的backend服务器集群,进而实现基于
ACL规则的负载均衡。
HAProxy中的ACL规则经常使用在frontend段中,使用方法如下:
acl 自定义的acl名称 acl方法 [匹配的路径或文件]
其中:
acl:是一个关键字,表示定义ACL规则的开始。后面需要跟上自定义的ACL名称。
acl方法:这个字段用来定义实现ACL的方法,HAProxy定义了很多ACL方法,经常使用的方法有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、 path_beg、path_end等。
-i:表示忽略大小写,后面需要跟上匹配的路径或文件或正则表达式。
与ACL规则一起使用的HAProxy参数还有use_backend,use_backend后面需要跟上一个backend实例名,表示在满足ACL规则后去请求哪个backend实例,与 use_backend对应的还有default_backend参数,它表示在没有满足ACL条件的时候默认使用哪个后端backend。
下面列举几个常见的ACL规则例子:
acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)
acl bbs_policy hdr_dom(host) -i bbs.z.cn
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if url_policy
use_backend server_bbs if bbs_policy
default_backend server_cache
八、使用HAProxy的Web监控平台
HAProxy虽然实现了服务的故障转移,但是在主机或者服务出现故障的时候,并不能发出通知告知运维人员,这对于及时性要求很高的业务系统来说,是非常不便的,不过,HAProxy 似乎也考虑到了这一点,在新的版本中HAProxy推出了一个基于Web的监控平台,通过这 个平台可以查看此集群系统所有后端服务器的运行状态,在后端服务或服务器出现故障时,
监控页面会通过不同的颜色来展示故障信息,这在很大程度上解决了后端服务器故障报警的 问题,运维人员可通过监控这个页面来第一时间发现节点故障,进而修复故障。
登录地址是:http://IP:9188/haproxy-status
用户名和密码:就是在配置文件里设置的 admin、admin~!@
九、pro高可用负载均衡系统
1、高可用HAproxy集群系统的拓扑结构
在备机重新安装haproxy,然后配置haproxy,这个不再介绍,下面直接给出配置好的 keepalived.conf文件内容。在haproxy-server主机上,keepalived.conf的内容如下:
global_defs
{notification_email
{
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id HAProxy_DEVEL
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
#设置探测 haproxy 服务运行状态的方式,这里的“killall -0 haproxy”仅仅是检测 haproxy 服务状态
interval 2
}
vrrp_instance HAProxy_HA {
state BACKUP
#在 haproxy-server 和 backup-haproxy 上均配置为 BACKUP interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器不设置 authentication {
auth_type PASS
auth_pass 1111
}
track_script
{check_haproxy
}
virtual_ipaddress {
192.168.66.10/24 dev eth0 #HAProxy 的对外服务 IP,即 VIP
}
}
最后,将keepalived.conf文件复制到backup-haproxy服务器上对应的位置,然后将 keepalived.conf文件中priority值修改为90,由于配置的是不抢占模式,因此,还需要在backup-haproxy服务器上去掉nopreempt选项。
完成所有配置后,分别在haproxy-server和backup-haproxy主机上依次启动haproxy服 务和keepalived服务。注意,这里一定要先启动haproxy服务,因为keepalived服务在启动 的时候会自动检测 haproxy服务是否正常,如果发现haproxy服务没有启动,那么主、备keepalived将自动进入fault状态。在依次启动服务后,在正常情况下VIP地址应该运行在 haproxy-server服务器上,通过命令“ipa”可以查看VIP是否已经正常加载。
本文转自pizibaidu 51CTO博客,原文链接:http://blog.51cto.com/pizibaidu/1833986,如需转载请自行联系原作者