haproxy原理简述

haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 
haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在时下的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。 
haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。 
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

haproxy的优点
  • 免费开源,稳定性也是非常好。单haproxy也跑得不错,稳定性可以与硬件级的F5相媲美。

  • 根据官方文档,haproxy可以跑满10Gbps,这个数值作为软件级负载均衡器是相当惊人的。

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

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

  • haproxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。

  • 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。

  • HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。

操作系统环境架构
操作系统均为centos6.4 64位
[root@haproxy-01 ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
 
[root@haproxy-01 ~]# uname -m
x86_64
 
haproxy-01:192.168.33.131
haproxy-02:192.168.33.132
node1:192.168.33.129
node2:192.168.33.128
haproxy安装

在haproxy-01/02机器上安装haproxy软件。这里使用yum安装即可,使用源码也可根据自己情况而定

[root@haproxy-01 ~]# yum list all |grep haproxy
haproxy.x86_64                              1.5.4-3.el6                  base
[root@haproxy-01 ~]# yum install haproxy -y
[root@haproxy-02 ~]# yum install haproxy -y
haproxy-01机器上操作

1.haproxy服务命令使用

[root@haproxy-01 ~]# /etc/init.d/haproxy --help
Usage: /etc/init.d/haproxy {start|stop|status|restart|try-restart|reload|force-reload}

2.haproxy主配置文件

[root@haproxy-01 ~]# ll /etc/haproxy/haproxy.cfg
-rw-r--r-- 1 root root 3142 Jan 20 23:56 /etc/haproxy/haproxy.cfg

3.haproxy相关配置文件路径以及文档等等

[root@haproxy-01 ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.5.4
........................
........................

4.haproxy版本

[root@haproxy-01 haproxy]# haproxy -version
HA-Proxy version 1.5.4 2014/09/02
Copyright 2000-2014 Willy Tarreau <w@1wt.eu>
2台web节点实例

web节点内容

[root@node1 ~]# cat /var/www/html/index.html
<h1>node1 129</h1>
 
[root@node2 ~]# cat /var/www/html/index.html
<h1>node2 128</h1>

 
后端web节点访问情况

haproxy负载均衡器及反向代理(一)_负载

haproxy配置文件内容如下
[root@haproxy-01 haproxy]# tail -n 15 haproxy.cfg
frontend web
    bind *:80
    default_backend    webservers
backend webservers
    balance roundrobin
    option httpclose
    option forwardfor
    server node1 192.168.33.129:80 check
    server node2 192.168.33.128:80 check
 
listen status
    bind *:81
        stats enable
    stats uri /admin?stats
    stats auth admin:123456
    stats refresh 5s
    stats hide-version
    stats admin if TRUE

haproxy配置文件中除了defaults段职位其他都给注释了,上面是新添加的内容,stats refresh 5s

上面内容解释如下 
frontend 前端,相当于nginx server段,web *:80监听任意地址的80端口,default_backend默认找那个后端的名称 
backend 后端,相当于nginx的upstream段,balance roundrobin算法默认是rr模式

haproxy服务启动

[root@haproxy-01 haproxy]# service haproxy restart
Stopping haproxy:                                          [  OK  ]
Starting haproxy:                                          [  OK  ]
客户端浏览器访问

 haproxy负载均衡器及反向代理(一)_haproxy_02 
就这么简单,haproxy已经起到负载的作用了

haproxy web界面访问

访问地址

http://192.168.33.131:81/admin?stats

 haproxy负载均衡器及反向代理(一)_负载_03

haproxy负载均衡器及反向代理(一)_haproxy_04记录haproxy日志

修改rsyslog配置文件,内容如下

[root@haproxy-01 haproxy]# sed -n '13p;14p;17p;18p;62p' /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
local2.*                        /var/log/haproxy.log

重启rsyslog服务

[root@haproxy-01 haproxy]# /etc/init.d/rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

刷新客户端访问然后查看日志

haproxy负载均衡器及反向代理(一)_均衡器_05

以上其实是基于tcp端口4层轮询负载

其他参数解释记录一下

check port 80 表示对80端口进行检查
inter 3000 fall 3 表示每三秒检查一次,一共检查三次,有问题的机器就会剔除
 
默认不加inter 3000 fall 3,则默认情况每两秒检查一次,一共检查3三次,有问题的机器就会剔除
rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
 
maxconn 10240 最大连接数
weight 5 权重

haproxy配置文件其实写法不止下面一种方式还有其方式

frontend web
    bind *:80
    default_backend    webservers
backend webservers
    balance roundrobin
    option forwardfor
    option httpclose
    server node1 192.168.33.129:80 check
    server node2 192.168.33.128:80 check

吧上面的内容改写后示例

listen web
    bind *:80
    balance roundrobin
    option forwardfor
    option httpclose
    server node1 192.168.33.129:80 check
    server node2 192.168.33.128:80 check
    server node3 192.168.33.127:80 check backup

backup其实就是热备的,当节点node1和node2挂了之后就会启用node3节点服务

关于haproxy后端节点如果无法记录客户端真实ip地址的话

apache修改相应的内容如下

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b" common

nginx后端节点

server段标签中的proxy_set_header X-Forwarded-For $remote_addr;与proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;功能都是一样获取来自真实的客户端访问的ip地址

但是我的客户端请求是haproxy负载本身也能记录客户端的IP地址,后端节点服务都能记录来自真实的ip