HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,它是免费、开源、快速而且可靠的一种解决方案。javascript
1)HAProxy 也是支持虚拟主机的。
css
2)HAProxy 的优势可以补充 Nginx 的一些缺点,好比支持 Session 的保持,Cookie的引导;同时支持经过获取指定的 url 来检测后端服务器的状态。
html
3)HAProxy 跟 LVS 相似,自己就只是一款负载均衡软件;单纯从效率上来说HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。
java
4)HAProxy 支持 TCP 协议的负载均衡转发,能够对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,你们能够用 LVS+Keepalived 对 MySQL主从作负载均衡。
mysql
5)HAProxy 负载均衡策略很是多, HAProxy 的负载均衡算法如今具体有以下8种:
nginx
1> roundrobin,表示简单的轮询,这个很少说,这个是负载均衡基本都具有的;
git
2> static-rr,表示根据权重,建议关注;
github
3> leastconn,表示最少链接者先处理,建议关注;
web
4> source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制相似,咱们用其做为解决 session 问题的一种方法,建议关注;
算法
5> ri,表示根据请求的 URI;
6> rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URLparameter name;
7> hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求;
8> rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。
haproxy程序环境:
进程及安全管理:
log:定义全局的syslog服务器;最多能够定义两个;
log
[len 在代理配置段使用log global,则表示从全局继承日志设置。若是全局已经定义过两个log了,此处除引用global外还自定义了一个log,则此自定义的log失效,由于只支持两个日志设置。
nbproc
ulimit-n
链接数相关:
spread-checks <0..50, in percent> 单位百分比,有时, 须要避免以固定的时间间隔,发送代理和健康检查,不然会健康检测会过多的占用带宽。例如, 当许多逻辑服务器位于同一物理服务器上或者后端服务器数量不少的状况下。在这个参数的帮助下, 能够在检查间隔增长一些随机性时间介于0和 +/-50之间。默认值保持为0。
全部代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
部分经常使用参数,本段引自博客园——骏马金龙博客
http事务模型相关设置
(no) option http-keep-alive
启用或禁用客户端和服务端到haproxy之间的长链接。haproxy将处理全部请求和响应报文,请求完后haproxy两端的链接都处于空闲状态。因为和后端保持了链接,能够以最快的方式重用会话。(no) option http-server-close
启用或禁用在haproxy处理完第一次响应以后关闭haproxy到服务端之间长链接的功能,但客户端的长链接还保持,后续的每次请求都从新创建和后端的链接,每次响应后都关闭和后端的链接。启用该选项时,haproxy将会在转发给后端server的request数据包中添加一个"Connection:Close"标记,后端Server看到此标记就会在响应后关闭tcp链接。(no) option forceclose
启用或禁用传输完响应报文后关闭两端的链接。通常来讲,对于高速局域网络来讲,若是后端响应的速度很是快(好比后端是静态服务器响应小文件、后端是静态缓存服务器),这时创建tcp链接的代价就比较大,维持空闲链接的优点会很是明显。若是后端是动态应用程序,响应给haproxy的速度相对较慢,维持空闲链接的代价很是大,彻底能够先释放长链接以腾出资源,在须要链接的时候再创建新tcp链接。 所以:
(1).后端是静态内容缓存服务器时,或者就是静态服务器时,首选使用http-keep-alive模式;
(2).后端是动态应用程序服务器时,首选使用http-server-close模式。balance负载均衡调度算法
balance
可用于default、listen、backend配置段。
指定代理时负载均衡算法,支持的算法有:
roundrobin(默认):根据权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,表示权重能够在haproxy运行时调整后端服务器的权重并生效;
static-rr:基于权重进行轮询,与roundrobin相似,可是为静态方法,在haproxy运行时调整其服务器权重不会生效;
leastconn:新的链接请求被派发至具备最少链接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,能够在运行时调整其权重;
source:将请求的源地址进行hash运算,使得同一个客户端IP的请求始终被派发至某特定的服务器; 但当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不一样的服务器;相似于nginx的ip_hash,可用于负载均衡无cookie功能的基于TCP的协议。默认为静态;
uri:对URI的左半部分 (域名后"?"标记以前的文件路径部分)进行hash运算,并除以服务器的总权重来计算派发至某匹配服务器;这可使得对同一个URI的请求老是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法经常使用于代理缓存以提升缓存的命中率;但此算法仅应用于提供http服务的后端服务器;默认为静态算法;缺点是后端server宕机会形成严重抖动,能够经过hash-type设置hash算法为consistent一致性哈希解决。
url_param:通常用于将同一用户ID转发至同一服务器的状况。在使用了basic认证时,url中的param通常都会使用user=XXX。使用该算法会对该参数进行hash运算,而后除以总权重以决定分配到哪台后端server。
hdr(name):基于指定的请求首部名称进行调度。首部中指定名称相同的调度至同一服务器。通常使用"hdr(host)"根据请求首部中的host即目标主机来进行hash运算。使用use_domain_only选项能够基于域名来哈希,使得访问www.longshuai.com和web.longshuai.com的请求都调度至同一服务器。
rdp-cookie 微软的调度方式
rdp-cookie(name)
roundrobin和static-rr是有区别的,roundrobin是动态慢轮询,不用重启服务便可调整其权重,而static-rr必须重启服务修改的权重才生效。例如原有2台后端server,新添加一台后,roundrobin会今后时开始慢慢的将请求轮询至此新服务器 (即慢启动),而static-rr因为须要重启,因此重启前新server不会被调度到,重启后新server和旧server平均调度。通常来讲,考虑加权轮询的时候,roundrobin要比static-rr好。
通常可归入考虑的算法有roundrobin/static-rr/leastconn/uri,其中leastconn算法用于代理ldap、mysql等长时间会话链接的状况,uri算法用于代理后端为缓存服务器的状况。
(1). 用于调度MySQL服务器,使用何种算法?答:leastconn
(2). 用于调度静态服务器组,使用何种算法?答:roundrobin
(3). 调度动态应用程序服务器组,使用何种算法?答:一般客户端须要和后端应用程序服务器保持联系,通常会使用cookie或者session来实现,但若是特殊状况下没法经过它们实现,则可使用source做为最后"亲和性"手段。注意,使用source算法时,后端服务器数量一改变,就会致使大量的会话断开。
(4). 调度缓存服务器,使用何种算法?答:uri,且设置hash-type为一致性哈希算法。
server配置相关
server
定义后端主机的各服务器及其选项不可用于defaults与frontend配置段;
default-server [settings ...]
指定server的默认值,不能用于frontend配置段;
:服务器地址,支持使用主机名;
[:[port]]:端口映射;省略时,表示同bind中绑定的端口;
[param*]:为此服务器设定的一系列参数
maxconn
backlog
backup:设定当前server为备用服务器;
check:对当前server作健康状态检测;
addr :检测时使用的IP地址;
port :针对此端口进行检测;
inter
rise
fall
注意:httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;
cookie
disabled:标记为不可用;
redir
weight
统计接口启用相关的参数:
stats enable : 启用统计页;基于默认的参数启用stats page;
stats uri : /haproxy?stats 定义状态页路径;
stats realm : "HAProxy Statistics" 认证领域名,即输入用户口令时的标题信息;
stats auth : no authentication 是否开启验证;
stats scope : no restriction
stats auth
stats realm
stats uri
stats refresh
stats admin { if | unless }
配置示例:
listen stats bind :9099 stats enable stats realm HAPorxy\ Stats\ Page stats auth admin:admin stats admin if TRUE
基于cookie的session sticky的实现:
cookie
经常使用组合:insert nocache indirect
rewrite:重写cookie,不推荐使用;
insert: haproxy将报文发给客户端前,先插入一个cookie,cookie值由server项中cookie指定;
indirect: 如下3段均引用自骏马金龙博客https://www.cnblogs.com/f-ck-need-u/p/8553190.html#2-2-cookie-prefix
若是不配合"indirect"选项,服务端能够看到客户端请求时的全部cookie信息。若是配合"indirect"选项,则haproxy在将请求转发给后端时,将删除本身设置的cookie,使得后端只能看到它本身的cookie,这样对后端来讲,整个过程是彻底透明的,它不知道前面有负载均衡软件。
nocache
当客户端和HAProxy之间存在缓存时(如CDN),建议将insert配合nocache一块儿使用 ,由于nocache确保若是须要插入cookie,则可缓存页面将被标记为不可缓存。这一点很重要,由于若是全部cookie都添加到可缓存的页面上,则全部客户都将从中间的缓存层获取页面,而且将共享同一个Cookie,从而致使某台后端服务器接收的流量远远超过其余后端服务器。
prefix:
haproxy将在已存在的cookie(例如后端应用服务器设置的)上添加前缀cookie值,这个前缀部分是server指令中的cookie设置的,表明的是服务端标识符。在客户端再次访问时,haproxy将会自动移除这部分前缀,使得服务端只能看到它本身发出的cookie。在一些特殊环境下,客户端不支持多个"Set-Cookie"字段,这时可使用prefix。
使用prefix的时候,cookie指令设置的cookie名必须和后端设置的cookie同样(在本文的环境中是PHPSESSID),不然prefix模式下的haproxy不会对响应报文作任何改变。
使用访问控制列表 (ACL) 提供了一种灵活的解决方案来进行访问流量控制, 一般是根据从请求、响应或任何环境状态提取的内容来作出决策。
acl
aclname : 指定ACL名称,区分大小写,可多条ACL同名,之间是或关系,value知足其一便是匹配。
criterion:指定检查标准:
如4层:src、src_port、dst、dst_port,
7层:
path : 精确匹配字符串,例如:path -i /1.txt
path_beg : 匹配 path的前缀部分
path_dir : 路径子集匹配
path_dom : 域名子集匹配
path_end : 后缀匹配
path_len : 长度匹配
path_reg : 模式匹配
path_sub : 字符串子集匹配
url : exact string match
url_beg : prefix match
url_dir : subdir match
url_dom : domain match
url_end : suffix match
url_len : length match
url_reg : regex match
url_sub : substring match
hdr([
hdr_beg([
hdr_dir([
hdr_dom([
hdr_end([
hdr_len([
hdr_reg([
hdr_sub([
status : integer
Returns an integer containing the HTTP status code in the HTTP response.
flag:标志位,经常使用如-i 不区分大小写、-n禁止DNS解析。
frontend web *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html .txt .htm use_backend staticsrvs if url_static default_backend appsrvs backend staticsrvs balance roundrobin server stcsrv1 172.16.100.6:80 check backend appsrvs balance roundrobin server app1 172.16.100.7:80 check server app1 172.16.100.7:8080 check listen stats bind :9091 stats enable stats auth admin:admin stats admin if TRUE