一、haproxy是什么?
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
二、HAProxy的原理
所谓的四层就是ISO参考模型中的第四层。四层负载均衡也称为四层交换机,它主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡。
以常见的TCP应用为例,负载均衡器在接收到第一个来自客户端的请求时,会通过设定的负载均衡算法选择一个最佳的后端服务器,同时将报文中目标IP地址修改为后端服务器IP,然后直接转发给该后端服务器,这样一个负载均衡请求就完成了。从这个过程来看,一个TCP连接是客户端和服务器直接建立的,而负载均衡器只不过完成了一个类似路由器的转发动作。在某些负载均衡策略中,为保证后端服务器返回的报文可以正确传递给负载均衡器,在转发报文的同时可能还会对报文原来的源地址进行修改。
七层负载均衡器也称为七层交换机,位于OSI的最高层,即应用层,此时负载均衡器支持多种应用协议,常见的有HTTP、FTP、SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器,因此也称为“内容交换器”。比如,对于Web服务器的负载均衡,七层负载均衡器不但可以根据“IP+端口”的方式进行负载分流,还可以根据网站的URL、访问域名、浏览器类别、语言等决定负载均衡的策略。例如,有两台Web服务器分别对应中英文两个网站,两个域名分别是A、B,要实现访问A域名时进入中文网站,访问B域名时进入英文网站,这在四层负载均衡器中几乎是无法实现的,而七层负载均衡可以根据客户端访问域名的不同选择对应的网页进行负载均衡处理。常见的七层负载均衡器有HAproxy、Nginx等。
这里仍以常见的TCP应用为例,由于负载均衡器要获取到报文的内容,因此只能先代替后端服务器和客户端建立连接,接着,才能收到客户端发送过来的报文内容,然后再根据该报文中特定字段加上负载均衡器中设置的负载均衡算法来决定最终选择的内部服务器。纵观整个过程,七层负载均衡器在这种情况下类似于一个代理服务器。
对比四层负载均衡和七层负载均衡运行的整个过程,可以看出,在七层负载均衡模式下,负载均衡器与客户端及后端的服务器会分别建立一次TCP连接,而在四层负载均衡模式下,仅建立一次TCP连接。由此可知,七层负载均衡对负载均衡设备的要求更高,而七层负载均衡的处理能力也必然低于四层模式的负载均衡。
三、HAProxy的优点
(1)免费开源,稳定性也是非常好。单haproxy也跑得不错,稳定性可以与硬件级的F5相媲美。
(2)根据官方文档,haproxy可以跑满10Gbps,这个数值作为软件级负载均衡器是相当惊人的。
(3)haproxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)haproxy支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
(5)haproxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
(6)自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
(7)HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。
四、搭建环境
实验环境: rhel6.5 selinux and iptables disabled
实验主机:
172.25.70.1 (server1) haproxy
172.25.70.2 (server2) web1
172.25.70.3(server3) web2
五、配置负载均衡
1、下载安装包
2、安装haproxy软件
如果解压后,目录里面有.spec文件则可以制作相应的rpm包。
1、安装制作rpm的工具
yum install rpm-build -y #使用rpm-build创建rpm的二进制软件包和源码软件包
yum inatall pcre-devel -y
yum install gcc -y
2、制作haproxy的rpm包
tar zxf haproxy-1.7.3.tar.gz #解压安装包
rpmbuild -tb haproxy-1.4.23.tar.gz #创建HAProxy的rpm包
3、安装haproxy的rpm包
yum install haproxy-1.7.3-1.x86_64.rpm -y
3、拷贝haproxy的配置文件到指定目录
cp haproxy-1.7.3/examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg
4、创建haproxy指定用户及用户组
groupadd -g 200 haproxy
useradd -u 200 -g 200 haproxy
5、设定文件最大限制数
sysctl -a | grep file
vim /etc/security/limits.conf
6、修改配置文件,实现负载均衡
vim /etc/haproxy/haproxy.cfg
==============================
#
# This is a sample configuration
# haproxy >= 1.3.4 required.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats are directed to a backend dedicated to statistics.
#
global # 全局配置
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 # 日志名local0,需要手动在日志配置文件中配置
uid 200 #haproxy的用户
gid 200 #haproxy用户组
chroot /var/empty #切换根目录,安全
daemon #后台运行
defaults #默认配置
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s #客户端时间超过30秒超时
retries 2 #重试两次失败认为服务器不可用
option redispatch #当client连接到挂掉的服务器后,会切换到健康的主机
timeout connect 5s #haproxy将请求转发给后端服务器等待时长
timeout server 5s #客户端与服务端建立连接,等待服务器的超时时长
stats uri /admin/stats # haproxy监控
# The public 'www' address in the DMZ
frontend public
bind 172.25.70.1:80 name clear #haproxy服务器
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic #默认为动态页面
# The static backend backend for 'Host: img', /img and /css.
backend dynamic #动态页面
balance roundrobin #balance定义为负载均衡算法
server web1 172.25.70.2:80 check inter 1000 #指定或短服务器
server web2 172.25.70.3:80 check inter 1000
7、在server2、server3上安装httpd,编写默认发布页,并启动
yum install httpd -y
vim /var/www/html/index.html
/etc/init.d/httpd start
server2
server3
8、server1:haproxy服务器启动haproxy服务
/etc/init.d/haproxy start
9、测试
在客户端访问haproxy的主机IP
六、配置日志
在haproxy中,我们可以看到日志保存在本地,local0需要自定义
1、编辑日志服务rsyslog的配置文件
vim /etc/rsyslog.conf
======================
13 $ModLoad imudp
14 $UDPServerRun 514
62 local0.* /var/log/haproxy.log
2、重启rsyslog服务
/etc/init.d/rsyslog restart
3、测试
在客户端重新访问两次haproxy主机
日志配置成功!!!
七、监控服务
在配置文件中的:
monitor-uri /monitoruri
stats uri /admin/stats
1、在客户端浏览器中输入:172.25.70.1/admin/stats
我们关闭server3的httpd的服务,再查看监控
可以看到web2的一行红了,表示web2服务不可用了。
2、在客户端浏览器中输入:172.25.70.1/monitoruri
200 OK表示haproxy服务是正常的,不代表web1、web2的服务健康状况
八、acl访问控制
1、编辑server1(haproxy服务器)的haproxy的配置文件
vim /etc/haproxy/haproxy.cfg
acl blacklist src 172.25.70.250 #黑名单
http-request deny if blacklist #禁止黑名单中的http请求
errorloc 403 http://172.25.70.1:8080/index.html #如果被禁止,则访问70的默认发布页,对禁止的用户友好一点
2、haproxy服务端下载httpd服务,并编辑默认发布页,更改httpd服务端口
yum install httpd -y
vim /var/www/html/index.html
更改端口:
vim /etc/httpd/conf/httpd.conf
为什么要更改80为8080端口呢?因为我们的haproxy服务已经占据了80端口。httpd只能另寻出路了…
3、启动httpd服务,重启haproxy服务
/etc/init.d/haproxy restart
/etc/init.d/httpd start
4、测试
用我们添加到黑名单的主机的浏览器访问:172.25.70.1
自动跳转到haproxy服务端的httpd服务上了。
其他的客户端并不受限制,可以正常轮循。