HAproxy是一款基于TCP(第四层)和HTTP(第七层)应用的代理软 件,它也可以作为负载均衡器使用,而且完全免费。借助HAproxy,可以快速并可靠地提供基于TCP层和HTTP层应用的代理解决方案。HAproxy 最主要的优点是性能突出,它特别适合那些负载特别大的WEB站点,这些站点通常需要具备会话保持或七层处理功能。HAproxy完全可以支持数以万计的并 发链接,而且它的运行模式可以让你简单而安全地将它整合到你当前的架构中,同时可以保护你的WEB服务器不暴露到网络上(通过防火墙80端口映射的方 法)。作为一款优秀的负载均衡软件,HAproxy优点如下:
1.前面两台负载均衡服务器ha1、ha2,后面两台web服务器web1、web2
ha1:192.168.1.8
ha2:192.168.1.9
vip:192.168.1.10
web1:192.168.1.33
web2:192.168.1.34
2.在两台ha上安装haproxy
tar zxvf haproxy-1.4.21.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.21/
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cd /usr/local/haproxy
mkdir conf
cd conf/
cp /usr/src/haproxy-1.4.21/examples/haproxy.cfg ./
vi haproxy.cfg
global
log 127.0.0.1 local0
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
log 127.0.0.1 local3
mode http
option httplog
option httpclose
option forwardfor
option redispatch
option dontlognull
retries 2
maxconn 2000
balance source
stats uri /haproxy-stats
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen www.qikangwei.com
bind *:80
option httpchk HEAD /index.php HTTP/1.0
server web1 192.168.1.33:80 cookie applinst1 check inter 2000 rise 2 fall 5
server web2 192.168.1.34:80 cookie applinst2 check inter 2000 rise 2 fall 5
两台ha的haproxy.cfg配置一样. ..
mkdir /usr/local/haproxy/logs
vi /etc/syslog.conf 添加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
vi /etc/sysconfig/syslog 修改
SYSLOGD_OPTIONS="-r -m 0"
service syslog restart
3.在两台ha安装keepalived
tar zxvf keepalived-1.1.15.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.1.15/
./configure
make
make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/
mkdir /etc/keepalived
cd /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf ./
vi keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_master
}
vrrp_instance hello {
state MASTER ###另外一台ha上改为BACKUP
interface eth0
virtual_router_id 51
priority 150 ###另外一台ha上的值要比这个小
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.10
}
}
4.启动keepalived和haproxy
service keepalived start
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
(重启haproxy的命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`)
5.若要支持虚拟主机,可以修改haproxy.cfg配置文件 如下
global
log 127.0.0.1 local0
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
log 127.0.0.1 local3
mode http
option httplog
option httpclose
option forwardfor
option redispatch
option dontlognull
retries 2
maxconn 2000
stats uri /haproxy-stats
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend http_80_in
bind *:80
mode http
acl qikangwei hdr_dom(host) -i www.qikangwei.com
acl helloqikangwei hdr_dom(host) -i www.helloqikangwei.com
use_backend qikangwei_com if qikangwei
use_backend helloqikangwei_com if helloqikangwei
backend qikangwei_com
mode http
balance source
option httpchk HEAD /index.php HTTP/1.0
server web1 192.168.1.33:80 cookie applinst1 check inter 2000 rise 3 fall 3
server web2 192.168.1.34:80 cookie applinst2 check inter 2000 rise 3 fall 3
backend helloqikangwei_com
mode http
balance source
option httpchk HEAD /index.php HTTP/1.0
server web1 192.168.1.33:80 cookie applinst1 check inter 2000 rise 3 fall 3
server web2 192.168.1.34:80 cookie applinst2 check inter 2000 rise 3 fall 3
---------------------------- Haproxy配置多域名负载均衡
global
user haproxy #所属运行的用户uid
group haproxy #所属运行的用户组
chroot /usr/local/haproxy
daemon #运行方式为后台工作
quiet #安装模式,启动时无输出
nbproc 4 #创建工作的进程数目
maxconn 40000
log 127.0.0.1 local0 notice #日志文件的输出定向
spread-checks 2
defaults
timeout server 150s
timeout connect 150s
timeout client 150s
timeout http-request 150s
timeout queue 150s
http-check disable-on-404
option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
retries 3 #3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
stats uri /status #haproxy 监控页面的访问地址
stats auth admin:admin #查看监控的帐户密码
stats refresh 60s #监控页面的刷新时间
frontend http
#option forwardfor header X-Real-IP
bind-process 4 #针对多核处理,启用处理器数量
maxconn 1000000
bind :80
acl host_ileiming hdr_beg(host) -i www.ileiming.com
use_backend www.ileiming.com if host_ileiming #判断域名www.ileiming.com用host_ileiming负载均衡规则
acl host_keatv hdr_beg(host) -i www.keatv.com
use_backend www.keatv.com if host_keatv #判断域名www.keatv.com用host_keatv负载均衡规则
option httplog #启用被动的http连接关闭
option dontlognull #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
backend www.keatv.com
balance roundrobin #负载均衡算法
option httpchk HEAD /index.html HTTP/1.0 #健康检查
mode http #所处理的类别
cookie SERVERID insert indirect
option abortonclose
#option forwardfor #default或是frontend设置了,这里就可以不用设置了
server web1 192.168.1.100:80 check cookie web1 rise 2 fall 3 #后端的主机 IP &权衡
server web2 192.168.1.101:80 check cookie web1 rise 2 fall 3 #后端的主机 IP &权衡
backend www.ileiming.com
balance roundrobin #负载均衡算法
option httpchk HEAD /index.php HTTP/1.0 #健康检查
mode http #所处理的类别
cookie SERVERID insert indirect
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链
#option forwardfor #default或是frontend设置了,这里就可以不用设置了
server web1 192.168.1.102:80 check cookie web1 rise 2 fall 3 #后端的主机 IP &权衡
server web2 192.168.1.103:80 check cookie web1 rise 2 fall 3 #后端的主机 IP &权衡
balance 后面是负载均衡算法,haproxy给出了一下几个值作为负载均衡算法,大家可以根据自己的需求选择自己需要的负载均衡算法
roundrobin 每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个 backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必 担心。
static-rr 每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服 务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
leastconn 连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如 LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
source 对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结 果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会 话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调 整。
uri 对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般 用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是 算法会根据"hash-type"的变化做调整。算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为 1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
url_param 在HTTP GET请求的查询串中查找<param>中指定的URL参数。若使用了修饰符"check_post",如果在URL问号('?')后面的查 询串中找不到参数,就会搜索HTTP POST 请求实体。或者在指定的一些字节后面尝试搜索消息体。如果搜索不到实体, 则使用round robin算法。例如,假设客户端总是在前128个字节发送LB参数,就可以指定它。默认为48。如果到达网关的字节数量不够,实体数据是检索不到的,至 少有:(default/max_wait, Content-Length or first chunk length)。如果Content-Length没有或为0,就不需要等待客户端发送更多的数据。当Content-Length有值且大 于<max_wait>,则等待仅限于<max_wait>,并假设有足够的数据用于搜索参数的存在。万一Transfer- Encoding被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户 ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权 重是无效的,但是算法会根据"hash-type"的变化做调整。