Haproxy讲解

来源:互联网 发布:safari3 for windows 编辑:程序博客网 时间:2024/06/04 19:56

首先讲一讲三大主流软件负载均衡器对比(LVS VS Nginx VS Haproxy)

LVS:1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生3、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)4、应用范围比较广,可以对所有应用做负载均衡;5、不支持正则处理,不能做动静分离。6、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)7、配置 复杂,对网络依赖比较大,稳定性很高。

Ngnix:1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;3、Nginx安装和配置比较简单,测试起来比较方便;4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。8、不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)10、Nginx还能做Web服务器即Cache功能。

HAProxy的特点是:1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3、支持url检测后端的服务器出问题的检测会有很好的帮助。4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)10、不能做Web服务器即Cache。

三大主流软件负载均衡器适用业务场景:
1、网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。
2、网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对维护人员的要求也会更高,投入成本也更大。

注:Niginx与Haproxy比较:Niginx支持七层、用户量最大,稳定性比较可靠。Haproxy支持四层和七层,支持更多的负载均衡算法,支持session保存等。具体选型看使用场景,目前来说Haproxy由于弥补了一些Niginx的缺点用户量也不断在提升。

讲解Haproxy

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者***请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。(新版本引入了frontend,backend指令;frontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend.)现在用HAProxy主要在于它有以下优点,这里我总结下:1、HAProxy是支持虚拟主机的,通过frontend指令来实现2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3、支持url检测后端的服务器出问题的检测会有很好的帮助。4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。6、能对请求的url和header中的信息做匹配,有比lvs有更好的7层实现7、HAProxy的负载均衡算法现在也越来越多了,具体有如下8种:①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;②static-rr,表示根据权重,建议关注;③leastconn,表示最少连接者先处理,建议关注;④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法⑤ri,表示根据请求的URI;⑥rl_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name;⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。HAProxy配置中分五大部分:global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块listen:frontend和backend的组合体haproxy在默认情况不会记录日志,除了在haproxy.conf中的global段指定日志的输出外,还需要配置系统日志的配置文件1.在haproxy中globallog127.0.0.1local3         #local3是设备,对应于 /etc/rsyslog.conf中的配置,默认回收info的日志级别2.编辑系统日志配置 vim  /etc/rsyslog.conf  local3.*/var/log/haproxy.log#如果不加下面的的配置则除了在/var/log/haproxy.log中写入日志外3.配置rsyslog的主配置文件,开启远程日志# vim /etc/sysconfig/rsyslogSYSLOGD_OPTIONS=”-c2-r-m0″#-c 2 使用兼容模式,默认是 -c 5#-r 开启远程日志#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能重启 haproxy和rsyslog haproxy中的session保持实现1.在client增加cookie8backend backend_wwwoption forwardforcookie SERVERID insert indirect nocache#插入session信息option     redispatch#当后端rs挂了,可立即切换,不会出现503错误option httpchk HEAD / HTTP/1.0balance roundrobinserver www1 192.168.1.198:80 cookie www1check inter 2000 rise 30 fall 15server www2 192.168.1.52:80 cookie www2 checkinter 2000 rise 30 fall 152.balance source根据原ip,经过hash计算后,指定后端固定的rs6backend backend_wwwoption forwardforoption httpchk HEAD / HTTP/1.0balancesourceserver www1 192.168.1.198:80 check inter2000 rise 30 fall 15server www2 192.168.1.52:80check inter 2000 rise 30 fall 15

通过HAProxy的ACL规则实现智能负载均衡由于HAProxy可以工作在七层模型下, 因此,要实现HAProxy的强大功能,一定要使用强大灵活的ACL规则,通过ACL规则可以实现基于HAProxy的智能负载均衡系统。HAProxy通过ACL规则完成两种主要的功能,分别是:1)通过设置的ACL规则检查客户端请求是否合法。如果符合ACL规则要求,那么就将放行,反正,如果不符合规则,则直接中断请求。2)符合ACL规则要求的请求将被提交到后端的backend服务器集群,进而实现基于ACL规则的负载均衡。HAProxy中的ACL规则经常使用在frontend段中,使用方法如下:acl  自定义的acl名称  acl方法  -i  [匹配的路径或文件]其中:acl:是一个关键字,表示定义ACL规则的开始。后面需要跟上自定义的ACL名称 。acl方法:这个字段用来定义实现ACL的方法,HAProxy定义了很多ACL方法,经常使用的方法有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end等。-i:表示忽略大小写,后面需要跟上匹配的路径或文件或正则表达式。与ACL规则一起使用的HAProxy参数还有use_backend,use_backend后面需要跟上一个backend实例名,表示在满足ACL规则后去请求哪个backend实例,与use_backend对应的还有default_backend参数,它表示在没有满足ACL条件的时候默认使用哪个后端backend。下面列举几个常见的ACL规则例子:acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)acl bbs_policy hdr_dom(host) -i  bbs.z.cnacl url_policy url_sub -i  buy_sid=use_backend server_wwwifwww_policyuse_backend server_appifurl_policyuse_backend server_bbsifbbs_policydefault_backend server_cache一个动静分离的例子acl url_static path_beg -i/data/static/images/javascript/stylesheets#url开头为这些的静态内容acl url_static path_end -i .jpg .gif .png .css .js .html .ico#url结尾带为这些的静态内容use_backend staserifurl_static#如果静态内容符合url_static的条件,就调度到staser中的服务器default_backend             dyser#其他默认调度到dyser中的服务器

参考:
http://www.jianshu.com/p/a942debcf272
http://www.jianshu.com/p/f087425d6463
http://www.jianshu.com/p/92677d58b6f1

原创粉丝点击