HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作
HAProxy的优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;
7、HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制***蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS***的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
8、HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
9、细微的头部处理 : 使得编写基于header的规则更为简单,同时可以处理URI的某部分。
10、快而可靠的头部处理 : 使用完全RFC2616 兼容的完整性检查对一般的请求全部进行分析和索引仅仅需要不到2ms 的时间。
11、模块化设计 : 允许更多人加入进此项目,调试也非常简单. poller已经分离, 已经使得它们的开发简单了很多. HTTP已经从TCP分离出来了,这样增加新的七层特性变得非常简单. 其他子系统也会很快实现模块化
投机I/O 处理 : 在一个套接字就绪前就尝试从它读取数据。poller仅推测哪个可能就绪哪个没有,尝试猜测,并且如果成功,一些开销很大的系统调用就可以省去了。如果失败,就会调用这些系统调用。已知的使用Linux epoll()已经净提升起码10%了。
12、 ACLs : 使用任意规则的任意组合作为某动作的执行条件。
下面是关于haproxy的简单配置:
安装haproxy
yum install haproxy -y
更改配置文件
vim /etc/haproxy/haproxy.cfg listen westos *:80 #监听端口为80 balance roundrobin #算法 server wb1 172.25.9.4:80 check #realserver开启的服务为apache server wb1 172.25.9.5:80 check /etc/init.d/haproxy start #启动服务
设定监控页面:
vim /etc/haproxy/haproxy.cfg stats uri /status (可以加如defaults里也可以另起监听端口) /etc/init.d/haproxy restart
将监控页面的前端与后端分离:
vim /etc/haproxy/haproxy.cfg frontend westos *:80 default_backend web #默认的后端为web backend web balance roundrobin server web1 172.25.9.4:80 check server web1 172.25.9.5:80 check /etc/init.d/haproxy restart
为监控页面添加用户
vim /etc/haproxy/haproxy.cfg stats auth admin:westos /etc/init.d/haproxy restart
添加备机
vim /etc/haproxy/haproxy.cfg server backup 127.0.0.1:8080 backup #这里的8080为更改后的apache服务 /etc/init.d/haproxy restart
当realserver全挂了后显示备机的网页
添加haproxy的日志
打开UDP监听端口
vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514
添加日志记录:
local2.* /var/log/haproxy.log /etc/init.d/rsyslog restart
通过tail -f /var/log/haproxy.log
可以实时观测日志:
设定acl控制列表
vim /etc/haproxy/haproxy.cfg frontend westos *:80 acl bad src 172.25.9.250 #设定250主机不能访问#redirect location http://172.25.9.4:80 if bad #重定向250的访问 block if bad errorloc 403 http://172.25.9.2:8080 #将403错误重定向#acl denyfile path /admin/ #设定拒绝访问的目录#http-request deny if denyfile bad #http也拒绝访问 /etc/init.d/haproxy restart
动静分离
当访问的页面以static等目录开始以.jpg等结束时访问的是p_w_picpaths否则访问web
vim /etc/haproxy/haproxy.cfg 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 default_backend web backend p_w_picpaths balance roundrobin server web1 172.25.9.4:80 check backend web server web1 172.25.9.5:80 check /etc/init.d/haproxy restart
读写分离:
当写的时候访问web(如上传文件),否则访问p_w_picpaths
vim /etc/haproxy/haproxy.cfg acl read method GET acl read method HEAD acl write method PUT acl write method POST use_backend web if write default_backend p_w_picpaths backend p_w_picpaths balance roundrobin server web1 172.25.9.4:80 check backend web server web1 172.25.9.5:80 check /etc/init.d/haproxy restart