软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。
HAProxy介绍
反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加回。新的1.3引入了frontend,backend;frontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。
实验环境:
系统:rhel6.5
server1.example.com:172.25.0.1 和 server2.example.com:172.25.0.2为服务主机
server3.example.com:172.25.0.3和server4.example.com:172.25.0.4为后端服务器
安装
在server1和server2上
#yum install -y haproxy
#vim /etc/haproxy/haproxy.cfg
保留最后的listen模块,上面注释相应模块
listen westos *:80 //haproxy使用80端口
balance roundrobin //负载均衡为rr
server web1 172.25.0.3:80 check //服务机为ip为172.25.0.3的,名为web1
server web2 172.25.0.4:80 check //服务机为ip为172.25.0.4,名为web2
#/etc/init.d/haproxy start
在server3和server4上,添加主页并且内容为各自的hostname。启动httpd。
在web上显示haproxy信息
在server2上
#vim /etc/haproxy/haproxy.cfg
在maxconn下面添加
stats uri /status
#vim /etc/haproxy/haproxy.cfg
frontend westos *:80
default_backend web
backend web
balance roundrobin
server web1 172.25.0.3:80 check
server web2 172,25.0.4:80 check
//将listen模块分为frontend 和backend。frontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。
在server web1/2行后面加weight 1/2给web1/2加权重。
在server行下面加
server backup 127.0.0.1:8080 backup //备用机为本机,当server3或4都坏掉后通过8080端口启用本机
#vim /etc/httpd/conf/httpd.conf
添加Listen 8080 //增加apache监听8080端口
启动httpd,并添加内容为”please try later”的主页。
当server3与server4的httpd同时down掉后,
在rsyslog中给haproxy添加日志文件
#vim /etc/rsyslog.conf
添加
local2.* /var/log/haproxy.log
重启rsyslog服务。
#tail -f /va/log/haproxy.log
#vim /etc/haproxy/haproxy.cfg
在stats uri /status下面添加
stats auth admin:westos //给本机添加认证
在frontend模块中添加
acl bad src 172.25.0.251 //阻止源ip为172.25.0.251的主机访问
真机ip为172.25.0.251,因此出现下图
在acl下继续添加
block if bad
errorloc 403 http://172.25.0.2:8080
redirect location http://172.25.0.2:8080 if bad //当172.25.0.2:80出现403错误时跳转172.25.0.2:8080
注释刚添加的三行
添加
acl denyfile path /admin/
http-request deny if denyfile bad //拒绝访问172.25.0.2/admin(访问目标为web1或2的amdin)
动静分离:
注释刚添加的两行
修改为
frontend westos *:80
acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend p_w_picpaths if url_static //当网址以p_w_picpaths javascripts结尾时调用p_w_picpaths模块
default_backend upload
backend p_w_picpaths
balance roundrobin
server web1 172.25.0.3:80 check
server backup 127.0.0.1:8080 backup
backend upload
server web2 172.25.0.4:80 check
在server3中的/var/www/html/p_w_picpaths文件夹中添加图片
server2:
#/etc/init.d/harpoxy reload
读写分离:
添加
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
use_backend p_w_picpaths if read //为读时调用p_w_picpaths模块
use_backend upload if write //为写时调用upload模块
在server3/4中添加upload文件夹(包含相应的php文件),在upload中添加upload文件夹。
#chmod 777 -R /var/www/html/upload
通过日志可以看到,server3通过调用p_w_picpaths模块读取上传信息,然后server4通过upload模块将文件存到server4的/var/www/html/upload/upload/中。上传后,可以在server4中的upload中找到上传的文件
通过pacemaker调用haproxy
在server1/2上
#/etc/init.d/corosync start
#crm configure
#primitive vip ocf:heartbeat:IPaddr2 params ip=172.25.0.100 cidr_netmask=32 op minitor interval=30s
#primitive haproxy lsb:haproxy op monitor interval=30s
#commit
#group hagroup vip haproxy