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
2台web节点实例
web节点内容
[root@node1 ~]# cat /var/www/html/index.htmlnode1 129
[root@node2 ~]# cat /var/www/html/index.htmlnode2 128
后端web节点访问情况
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 web界面访问
访问地址
http://192.168.33.131:81/admin?stats
记录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 ]
刷新客户端访问然后查看日志
以上其实是基于tcp端口4层轮询负载
其他参数解释记录一下
check port 80 表示对80端口进行检查 inter 3000 fall 3 表示每三秒检查一次,一共检查三次,有问题的机器就会剔除 默认不加inter 3000 fall 3,则默认情况每两秒检查一次,一共检查3三次,有问题的机器就会剔除 rise:设定健康状态检查中,某离线的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