一、HAProxy简介

(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

(2)HAProxy **实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。**多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救

了很多站点,这个优点也是其它负载均衡器没有的。

(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

性能

HAProxy借助于OS上几种常见的技术来实现性能的最大化。

1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);

5,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;

6,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;

7,优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;

8,精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;

所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

HAProxy目前主要有三个版本: 1.3 , 1.4 ,1.5,CentOS6.6 自带的RPM包为 1.5 的。

Haproxy负载均衡算法

1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法
 
2.balance static-rr # 根据权重,建议使用
 
3.balance leastconn # 最少连接者先处理,建议使用
 
4.balance source # 根据请求源IP,建议使用
 
5.balance uri # 根据请求的URI
 
6.balance url_param,# 根据请求的URl参数'balance url_param' requires an URL parameter name
 
7.balance hdr(name) # 根据HTTP请求头来锁定每一次HTTP请求
 
8.balance rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求

Haproxy配置

cd /etc/haproxy/

vi haproxy.cfg
=========文件配置信息======
global
maxconn 100000
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
nbproc 1 
pidfile /usr/local/haproxy/logs/haproxy.pid 
log 127.0.0.1 local3 info

defaults
option http-keep-alive
maxconn 100000
mode http
timeout connect 5000ms
timeout client  50000ms
timeout server 50000ms

listen stats
mode http
bind 0.0.0.0:8111
stats enable
stats uri     /haproxy-status 
stats auth    haproxy:saltstack

frontend frontend_www_example_com
bind 192.168.56.21:81
mode http
option httplog
log global
    default_backend backend_www_example_com

backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance source
server web-node1  111.67.205.109:8180 check inter 2000 rise 30 fall 15
server web-node2  111.67.205.108:8180 check inter 2000 rise 30 fall 15
”“”

特别注意:
bind 0.0.0.0:8111
bind 192.168.56.21:81
111.67.205.109:8180
这几个端口配置,在我的centos7中端口使用

tcp        0      0 0.0.0.0:8111            0.0.0.0:*               LISTEN      60273/haproxy       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1536/nginx: master  
tcp        0      0 111.67.205.109:81       0.0.0.0:*               LISTEN      60273/haproxy       
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      11662/pure-ftpd (SE 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      973/sshd            
tcp        0      0 0.0.0.0:888             0.0.0.0:*               LISTEN      1536/nginx: master  
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      1021/python         
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      4833/mysqld         
tcp6       0      0 :::21                   :::*                    LISTEN      11662/pure-ftpd (SE 
tcp6       0      0 :::22                   :::*                    LISTEN      973/sshd

然后

netstat -ntlp查看端口是否有haproxy
systemctl start haproxy启动haproxy
systemctl status haproxy

haproxy 开启监控页面 haproxy启动_HTTP


表示配置启动成功

haproxy 开启监控页面 haproxy启动_IP_02


启动前端页面有以下注意:

默认情况下8111端口只能在内部访问,不能公开访问需要有以下配置才能公开
1. 添加开放对外的端口(8111)

  > firewall-cmd --zone=public --add-port=8111/tcp--permanent
返回success为成功
命令含义:

--zone #作用域

--add-port=8111/tcp #添加端口,格式为:端口/通讯协议

--permanent #永久生效

2.重启防火墙:
> systemctl restart firewalld.service

3.查看已经对外开放的端口

> firewall-cmd --list-ports

systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。

启动: systemctl start firewalld
查看状态: systemctl status firewalld 
停止: systemctl disable firewalld
禁用: systemctl stop firewalld
启动服务:systemctl start firewalld.service
关闭服务:systemctl stop firewalld.service
重启服务:systemctl restart firewalld.service
服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
查看区域信息:  firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic

登录haproxy账号密码是:

stats uri     /haproxy-status 
stats auth    haproxy:saltstack
账号:haproxy
密码:saltstack