软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。

HAProxy提供高可用性、负载均衡以及基于TCPHTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

HAProxy介绍

反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加回。新的1.3引入了frontend,backendfrontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend

实验环境:

系统:rhel6.5

server1.example.com172.25.0.1  server2.example.com172.25.0.2为服务主机

server3.example.com:172.25.0.3server4.example.com:172.25.0.4为后端服务器

安装

server1server2

#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   //服务机为ip172.25.0.3的,名为web1

     server web2 172.25.0.4:80 check  //服务机为ip172.25.0.4,名为web2

#/etc/init.d/haproxy start

 在server3server4上,添加主页并且内容为各自的hostname。启动httpd

 LB之Haproxy_第1张图片

 

web上显示haproxy信息

server2

#vim /etc/haproxy/haproxy.cfg

maxconn下面添加

stats uri /status

LB之Haproxy_第2张图片

#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 backendfrontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend

 

server web1/2行后面加weight 1/2web1/2加权重。

server行下面加

server backup 127.0.0.1:8080 backup  //备用机为本机,当server34都坏掉后通过8080端口启用本机

#vim /etc/httpd/conf/httpd.conf

添加Listen 8080    //增加apache监听8080端口

启动httpd,并添加内容为”please try later”的主页。

server3server4httpd同时down掉后,

LB之Haproxy_第3张图片

 

rsyslog中给haproxy添加日志文件

#vim /etc/rsyslog.conf

添加

local2.*      /var/log/haproxy.log

重启rsyslog服务。

#tail -f /va/log/haproxy.log

LB之Haproxy_第4张图片

 

#vim /etc/haproxy/haproxy.cfg

stats uri /status下面添加

   stats auth admin:westos   //给本机添加认证

frontend模块中添加

acl bad src 172.25.0.251   //阻止源ip172.25.0.251的主机访问

真机ip172.25.0.251,因此出现下图

LB之Haproxy_第5张图片

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.28080

LB之Haproxy_第6张图片

注释刚添加的三行

添加

acl denyfile path /admin/

http-request deny if denyfile bad   //拒绝访问172.25.0.2/admin(访问目标为web12amdin


动静分离:

注释刚添加的两行

修改为

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

LB之Haproxy_第7张图片

 

读写分离:

添加

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

LB之Haproxy_第8张图片

通过日志可以看到,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 

LB之Haproxy_第9张图片