HAProxy 提供高可用性、负载均衡以及基于 TCP (第四层)和 HTTP(第七层) 应用的负载均衡软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大且需要持久连接或四层和七层处理机制的 web 站点,例如门户网站或电商网站等。
作为专业的负载均衡软件,它有如下的显著优点:
(1) 单位时间内处理的最大请求数和最大数据处理能力都很大;
(2) 支持8中负载均衡算法,同时也支持session会话保持;
(3) 从1.3版本以后,支持连接拒绝、全透明代理等功能,而这些功能其他负载均衡器不具备;
(4) 拥有强大的服务器状态监控页面;
(5) 拥有强大的ACL支持,支持虚拟主机;
HAProxy 和LVS的异同:
(1) LVS基于linux操作系统实现负载均衡,HAProxy基于第三应用实现;
(2) LVS是基于四层的负载均衡技术,而HAProxy是基于四层和七层技术、可提供HTTP、TCP应用的的综合解决方案;
(3) LVS工作在第四层,状态监控功能单一,HAProxy可支持端口、URL、间本等多种状态检测方法;
(4) 虽然HAProxy功能强大,但整体处理性能低于四层的LVS,LVS拥有更接近硬件设备的网络吞吐和连接负载的能力。
常用的调度算法如下:
roundrobin:简单轮叫,服务器性能分布比较均匀时,此算法最公平、最合理;
static-rr:表示根据权重进行轮叫,此为静态方法,在运行时调整服务器权重不会生效;
leastconn:将新的连接发送给具有最少连接数目的后端服务器,适用与会话时间较长的场景中;
source:基于请求源IP的算法,可以使同一个客户端的IP请求始终被发送到某个特定的后端服务器上,我们用其作为解决session问题的一种方法;
uri:表示根据请求的URI;
uri_param:表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
hdr(name):表示根据HTTP头来锁定每一次HTTP请求,若指定的头不存在,则使用roundrobin进行调度;
一、 实验环境
172.25.18.1 ha1.tb.com
172.25.18.2 ha2.tb.com
172.25.18.3 www1.tb.com
172.25.18.4 www2.tb.com
172.25.18.5 bbs.tb.com
172.25.18.6 blog.tb.com
172.25.18.7 default.tb.com
系统环境RHEL6.5,防火墙和Selinux关闭
二、日志策略配置
HAProxy为了节省读写I/O所消耗的性能,没有自动配置日志输出功能。在RHEL6.5中,由可以实现UDP日志接收、将日志写入文件、将日志写入数据库等功能的rsyslog管理日志。因此,要先确保系统中安装了rsyslog。
从HAProxy的配置文件中可知,需要做两处修改:
(1) 修改/etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m 0"
“-r”表示接受远程日志; “-c 2”,使用兼容rsyslog和syslogd的模式
(2) 编辑/etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log
imdup,是模块名,支持UDP协议;
第二行表示允许514端口接收使用UDP和TCP转发过来的日志,rsyslog在默认情况下,就是使用514端口监听UDP的;
将HAProxy的日志信息存储到/var/log/haproxy.log中。
之后重启rsyslog服务,即可将HAProxy日志写入指定文件中。
三、后端真实服务器的配置
实验中以HTTP为例,验证HAProxy的负载均衡。
在后端五个主机上同时安装并开启httpd服务,并在发布目录中写入测试文件。可使用脚本或pssh加速执行。
[root@www ~]# pssh -i -H 172.25.18.1 "yum install -y hhtpd ; /etc/init.d/httpd start;echo `hostname` > /var/www/html/index.html"
四、HAProxy调度器的配置
HAProxy的配置虽然比较复杂,但常用的参数并不多,且所有配置都在一个文件中。
1、 配置文件概述
HAProxy的配置文件主要由如下五部分组成:
(1) global
用于设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
(2)default
默认参数的配置,在此部分设置的参数,会自动引用到下面的frontend、backend和listen部分。
(3)frontend
用于设置设置前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端节点。
(4)backend
用于设置集群后端真实服务器,以处理前端用户的请求。
(5)listen
类似与HAProxy的监控页面的设置。
2、具体的配置如下
[root@ha1 ~]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 全局的日志配置,local2是日志设备
pidfile /var/run/haproxy.pid 指定HAProxy进程的pid文件
maxconn 4000 每个HAProxy进程可接受的最大连接数
user nobody 运行HAProxy进程的用户
group nobody
Daemon 设置HAProxy进程进入后台运行
nbproc 1 设置HAProxy启动时创建的进程数
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http HAProxy实例运行的模式
option httplog HAProxy日志默认不记录HTTP请求,此选项可以启用日志记录HTTP请求
retries 3 连接后端服务器的失败重试次数
timeout connect 10s 连接到一台服务器的最长等待时间
timeout client 30s 连接客户端发送数据时的最长等待时间
timeout server 30s 服务器回应客户端数据发送的最长等待时间
timeout check 10s 设置对后端服务器的检测超时时间
#---------------------------------------------------------------------
#listen part
#---------------------------------------------------------------------
listen admin_status
bind 0.0.0.0:19088 用于定义一个或几个监听的套接字
mode http
log 127.0.0.1 local0 err
stats refresh 30s 设置监控页面的自动刷新时间
stats uri /haproxy_status 设置监控统计页面的URL路径,可任意指定
stats realm welcome login\ Haproxy 登录监控页面时的文本提示信息
stats auth admin:redhat 登录监控也面时的用户名和密码
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend tb 定义前端虚拟节点的名称为tb
bind *:80
mode http
option forwardfor 使后端服务器可以获得客户端的真实IP
log global 使用全局的日志配置
acl url_www hdr_reg(host) -i ^(www.tb.com|tb.com)
acl url_bbs hdr_dom(host) -i bbs.tb.com
acl url_blog hdr_beg(host) -i blog.
ACL的使用方法如下:
acl 自定义的acl名称 acl方法 -i [匹配的文件或路径]
acl:是一个关键字,表示ACL规则的开始;
acl方法:常用的有hdr_reg(host)、hdr_beg(hosts)、url_sub、url_dir、path_beg、path_end;
-i:表示不区分大小写。
use_backend server_www if url_www
use_backend server_bbs if url_bbs
use_backend server_blog if url_blog
default_backend server_default
use_backend后需要跟一个backend实例名,表示在满足ACL规则后去请求哪个backend实例名。default_backend表示在没有满足ACL条件的时候默认使用哪个后端。
第一条ACL规则表示如果客户端以www.tb.com或tb.com发送请求时,则此规则返回TRUE,第一个use_backend定义当url_www规则返回TRUE时,要调度的后端为server_www。
#---------------------------------------------------------------------
#backend for default
#---------------------------------------------------------------------
backend server_default 后端真实服务器组的名称
mode http
option redispatch 此参数用于cookie保持的环境中
option abortonclose 设置在服务器负载高时自动结束队列中处理时间比较长的连接
balance roundrobin 定义负载均衡算法为轮叫
cookie SERVERID 表示允许向cookie插入SERVERID
server default 172.25.18.7:80 cookie default inter 2000 rise 2 fall 3 check
server关键字用来定义后端真实服务器,使用格式为:
server
常用的参数有:cookie,为指定的后端服务器设置cookie值;
check,对后端服务器执行健康检查;
inter,设置健康状态检查的时间间隔;
rise,从故障状态转至正常状态需要成功检查的次数;
fall,后端服务器从正常状态转至不可用状态需要检查的次数;
#---------------------------------------------------------------------
#backend for www.tb.com or tb.com
#---------------------------------------------------------------------
backend server_www
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
server www1 172.25.18.3:80 cookie www1 inter 2000 weight 2 rise 2 check fall 3
server www2 172.25.18.4:80 cookie www2 inter 2000 weight 2 rise 2 check fall 3
#---------------------------------------------------------------------
#backend for bbs.tb.com
#---------------------------------------------------------------------
backend server_bbs
mode http
option redispatch
option abortonclose
balance source
cookie SERVERID
server bbs 172.25.18.5:80 cookie bbs inter 2000 rise 2 fall 3 check
#---------------------------------------------------------------------
#backend for blog.tb.com
#---------------------------------------------------------------------
backend server_blog
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
server blog 172.25.18.6:80 cookie blog inter 500 rise 2 fall 3 check
五、开启服务并测试
[root@ha1 haproxy]# /etc/init.d/haproxy start
1、 使用HAProxy的监控平台
与监控页面相关的设置已在part部分做了详细设置。在监控页面中,详细记录了frontend、backend等信息,并用不同的颜色标记出了backend中真实主机的状态。
在浏览器中输入http://172.25.18.1:19088/haproxy_status 进行访问
2、负载均衡和虚拟主机测试
当不断刷新访问www.tb.com或是tb.com时,server_www的两台后端服务器默认的web页面信息会轮流的出现,这表明实现了server_www的负载均衡功能;
当访问blog.tb.com时,只会出现server_blog后端的服务器的web页面,而不会出现其他的页面信息,表明实现了虚拟主机功能。
3、故障转移测试
server_www中有两台主机,假设将172.25.18.3的HTTPD服务停止,当访问www.tb.com或是tb.com时,就不会访问到172.25.18.3这个节点。
http://blog.chinaunix.net/uid-30241692-id-5151676.html