一、 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的安装
- 采用命令的安装
yum install haproxy
四、Haproxy的配置文件说明
- global: (全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关)
- default : (配置默认参数,这些参数可以被用到frontend,backend,Listen组件) 在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,Defaults部分参数对应的值自动被覆盖。
- frontend:( 接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend) frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend
- backend : (后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器) 在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。为了保持兼容性,haproxy新的版本依然保留了listen组件配置项。两种配置方式任选一中
- Listen : (Fronted和backend的组合体) 比如haproxy实例状态监控部分配置
五、修改配置文件
Haproxy 安装完成之后,就可以根据自身项目需求修改配置文件
vim /etc/haproxy/haproxy.cfg
示例1:
只使用listen 关联“前端”和“后端”定义了一个完整的代理,进行端口转发和负载均衡。通常只对TCP流量有用
############################################################### defaults log global mode tcp maxconn 20480 option httplog option httpclose option dontlognull #option forwardfor option redispatch option abortonclose #stats refresh 30 retries 3 balance roundrobin #balance source #balance leastconn timeout check 2000 listen admin_status #haproxy web页面 bind 0.0.0.0:65532 mode http log 127.0.0.1 local3 err stats refresh 5s stats uri /admin?stats #url地址 stats auth test:test1 #用户名和密码 stats hide-version stats admin if TRUE # errorfile 403 /etc/haproxy/errorfiles/403.http # errorfile 500 /etc/haproxy/errorfiles/500.http # errorfile 502 /etc/haproxy/errorfiles/502.http # errorfile 503 /etc/haproxy/errorfiles/503.http # errorfile 504 /etc/haproxy/errorfiles/504.http capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8 listen mq #Frontend和Backend的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:45672 #监听端口 mode tcp #tcp模式 server s1 192.168.1.56:5672 check inter 5s rise 2 fall 3 #代理的服务1 server s2 192.168.1.57:5672 check inter 5s rise 2 fall 3 #代理的服务2 server s3 192.168.1.58:5672 check inter 5s rise 2 fall 3 #代理的服务3 listen mqweb bind 0.0.0.0:15672 mode tcp server s1 192.168.1.56:15672 check inter 5s rise 2 fall 3 server s2 192.168.1.57:15672 check inter 5s rise 2 fall 3 server s3 192.168.1.58:15672 check inter 5s rise 2 fall 3
示例2(采用frontend+backend模式 大多适用于http请求)
假设客户端访问 http://doc.test.com 时,要把请求分发到192.168.5.171:8080、192.168.5.174:8080、192.168.5.178:8080,这三台服务器上,我们可以这样配置。
############################################################################## defaults log global mode http maxconn 20480 option httplog option httpclose option dontlognull #option forwardfor option redispatch option abortonclose #stats refresh 30 retries 3 balance roundrobin #balance source #balance leastconn timeout check 2000 frontend web1 #frontend 名称自定义 bind 0.0.0.0:80 #绑定端口 acl url_doc path_beg doc.test.com #定义规则 use_backend docserver if url_do1 #使用规则:如果规则是 url_doc 则跳转到do1server backend backend docserver #后端服务集群的配置名称自定义 balance roundrobin #负载均衡算法 轮询 server web1 192.168.5.171:8080 check inter 5s rise 2 fall 3 server web2 192.168.5.174:8080 check inter 5s rise 2 fall 3 server web3 192.168.5.178:8080 check inter 5s rise 2 fall 3
backend:用来定义负载均衡算法
- roundrobin : 基于权重进行的轮叫算法,在服务器的性能分布经较均匀时这是一种最公平的,最合量的算法。
- static-rr:也是基于权重时行轮叫的算法,不过此算法为静态方法,在运行时调整其服务权重不会生效。
- source:是基于请求源IP的算法,此算法对请求的源IP时行hash运算,然后将结果与后端服务器的权理总数相除后转发至某台匹配的后端服务器,这种方法可以使用一个客户端IP的请求始终转发到特定的后端服务器。
- leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法。例如数据库负载均衡等。此算法不适合会话较短的环境,如基于http的应用。
- uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重要除,最后转发到某台匹配的后端服务器上。
- uri_param:此算法会椐据URL路径中的参数时行转发,这样可以保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
- hdr:此算法根据httpd头时行转发,如果指定的httpd头名称不存在,则使用roundrobin算法进行策略转发。
- rdp-cookie(name):示根据据cookie(name)来锁定并哈希每一次TCP请求.
六、启动Haproxy
#启动 systemctl start haproxy ##检测状态 systemctl status haproxy #检测进程 ps -ef|grep haproxy
七、集群
Haproxy本身是没有集群配置的,但是我们可以通过将Haproxy配置到多台服务器配置可以是一样的。然后再使用Keepalived通过虚拟IP来切换Haproxy达到我们想要的效果。