HAproxy负载均衡
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HAproxy负载均衡相关的知识,希望对你有一定的参考价值。
HAproxy 简介
- HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
- HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
- HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
- HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
为什么要使用HAproxy
- 免费开源,稳定性也是非常好,这个可通过一些项目可以看出来,单Haproxy也跑得不错,稳定性可以与硬件级的F5相媲美;
- 根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps usingMyricom’s 10GbE NICs (Myri-10G PCI-Express),这个数值作为软件级负载均衡器是相当惊人的。
- HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻
- 击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
- HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用,这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
- HAProxy现多于线上的mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
- 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
- HAProxy支持虚拟主机。
- HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
注,在功能上,能以proxy反向代理方式实现Web均衡负载,这样的产品有很多。包括lvs,Nginx,ApacheProxy,lighttpd等。国内生产环境上使用Haproxy的公司很多,例如淘宝的CDN系统,
负载均衡器的性能评估因素
三个重要因素:
- 会话率 :单位时间内的处理的请求数
- 会话并发能力:并发处理能力
- 数据率:处理数据能力
经过官方测试统计,haproxy 单位时间处理的最大请求数为20000个,可以同时维护40000-50000个并发连接,最大数据处理能力为10Gbps。综合上述,haproxy是性能优越的负载均衡、反向代理服务器。
安装HAproxy
安装haproxy
1 [[email protected] ~]# yum -y groupinstall "Development Tools" 2 [[email protected] ~]# yum -y install haproxy
配置文件
1 [[email protected] ~]# rpm -ql haproxy 2 /etc/haproxy #配置文件目录 3 /etc/haproxy/haproxy.cfg #配置文件 4 /etc/rc.d/init.d/haproxy #启动脚本 5 /usr/sbin/haproxy #haproxy 命令 6 /usr/share/man/man1/haproxy.1.gz #man 文档
haproxy 命令详解
1 [[email protected] ~]# haproxy -h 2 HA-Proxy version 1.5.14 2015/07/02 3 Copyright 2000-2015 Willy Tarreau <[email protected]> 4 5 Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ] 6 [ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ] 7 -v displays version ; -vv shows known build options. 8 -d enters debug mode ; -db only disables background mode. 9 -dM[<byte>] poisons memory with <byte> (defaults to 0x50) 10 -V enters verbose mode (disables quiet mode) 11 -D goes daemon ; -C changes to <dir> before loading files. 12 -q quiet mode : don‘t display messages 13 -c check mode : only check config files and exit 14 -n sets the maximum total # of connections (2000) 15 -m limits the usable amount of memory (in MB) 16 -N sets the default, per-proxy maximum # of connections (2000) 17 -L set local peer name (default to hostname) 18 -p writes pids of all children to this file 19 -de disables epoll() usage even when available 20 -dp disables poll() usage even when available 21 -dS disables splice usage (broken on old kernels) 22 -dV disables SSL verify on servers side 23 -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments. 24 haproxy [-f < 配置文件>] [ -vdVD ] [-n 最大并发连接总数] [-N 每个侦听的最大并发数] 25 [ -p <当前的PID文件> ] [-m <内存限制M>] 26 -v 显示当前版本信息;-vv 显示已知的创建选项 27 -d 前台,debug模式;-db 禁用后台模式,程序跑在前台 28 -V 详细模式 29 -D daemon模式启动 30 -q 安静模式,不输出信息 31 -c 对配置文件进行语法检查 32 -n 最大并发连接总数 33 -m 限制的可用内存大小 34 -N 设置默认的连接数 35 -p 设置当前的PID文件 36 -de 不使用epoll 37 -ds 不使用speculative epoll 38 -dp 不使用poll 39 -sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后 40 -st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
默认配置文件
1 [[email protected] haproxy]# cat haproxy.cfg 2 #--------------------------------------------------------------------- 3 # Example configuration for a possible web application. See the 4 # full configuration options online. 5 # 6 # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt #官方配置文档,很详细,英文没问题的博友,可以看看 7 # 8 #--------------------------------------------------------------------- 9 #--------------------------------------------------------------------- 10 # Global settings #全局配置文件 11 #--------------------------------------------------------------------- 12 global 13 # to have these messages end up in /var/log/haproxy.log you will 14 # need to: #配置日志 15 # 16 # 1) configure syslog to accept network log events. This is done 17 # by adding the ‘-r‘ option to the SYSLOGD_OPTIONS in 18 # /etc/sysconfig/syslog #修改syslog配置文件 19 # 20 # 2) configure local2 events to go to the /var/log/haproxy.log 21 # file. A line like the following can be added to 22 # /etc/sysconfig/syslog #定义日志设备 23 # 24 # local2.* /var/log/haproxy.log 25 # 26 log 127.0.0.1 local2 # 27 #全局的日志配置 其中日志级别是[err warning info debug] 28 #local0 是日志设备,必须为如下24种标准syslog设备的一种: 29 #kern user mail daemon auth syslog lpr news 30 #uucp cron auth2 ftp ntp audit alert cron2 31 #local0 local1 local2 local3 local4 local5 local6 local7 32 chroot /var/lib/haproxy 33 pidfile /var/run/haproxy.pid #将所有进程的pid写入文件启动进程的用户必须有权限访问此文件。 34 maxconn 4000 #最大连接数,默认4000 35 user haproxy #用户 36 group haproxy #组 37 daemon ##创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon" 38 # turn on stats unix socket #unix socket 文件 39 stats socket /var/lib/haproxy/stats 40 #--------------------------------------------------------------------- 41 # common defaults that all the ‘listen‘ and ‘backend‘ sections will 42 # use if not designated in their block #默认的全局设置,这些参数可以被利用配置到frontend,backend,listen组件 43 #--------------------------------------------------------------------- 44 defaults 45 mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK 46 log global #采用全局定义的日志 47 option httplog #日志类别http日志格式 48 option dontlognull #不记录健康检查的日志信息 49 option http-server-close #每次请求完毕后主动关闭http通道 50 option forwardfor except 127.0.0.0/8 #不记录本机转发的日志 51 option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器 52 retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置 53 timeout http-request 10s #请求超时 54 timeout queue 1m #队列超时 55 timeout connect 10s #连接超时 56 timeout client 1m #客户端连接超时 57 timeout server 1m #服务器连接超时 58 timeout http-keep-alive 10s #长连接超时 59 timeout check 10s #检查超时 60 maxconn 3000 #最大连接数 61 #--------------------------------------------------------------------- 62 # main frontend which proxys to the backends #frontend 与backends 代理配置 63 #--------------------------------------------------------------------- 64 frontend main *:5000 65 #acl策略配置 66 acl url_static path_beg -i /static /images /javascript /stylesheets 67 acl url_static path_end -i .jpg .gif .png .css .js 68 use_backend static if url_static #满足策略要求,则响应策略定义的backend页面 69 default_backend app #不满足则响应backend的默认页面 70 #--------------------------------------------------------------------- 71 # static backend for serving up images, stylesheets and such #定义使用静态后端图像,样式表等 72 #--------------------------------------------------------------------- 73 backend static 74 balance roundrobin #负载均衡模式轮询 75 server static 127.0.0.1:4331 check #服务器定义 76 #--------------------------------------------------------------------- 77 # round robin balancing between the various backends 78 #--------------------------------------------------------------------- 79 backend app 80 balance roundrobin #负载均衡模式轮询 81 server app1 127.0.0.1:5001 check #服务器定义,check进行健康检查 82 server app2 127.0.0.1:5002 check 83 server app3 127.0.0.1:5003 check 84 server app4 127.0.0.1:5004 check
haproxy 配置文件详解
配置文件的格式
HAProxy的配置处理3类来主要参数来源:
- ——最优先处理的命令行参数,
- ——“global”配置段,用于设定全局配置参数;
- ——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;4.全局配置
注,“global”配置中的参数为进程级别的参数,且通常与其运行的OS相关。
时间格式
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。
- us: 微秒(microseconds),即1/1000000秒;
- ms: 毫秒(milliseconds),即1/1000秒;
- s: 秒(seconds);
- m: 分钟(minutes);
- h:小时(hours);
- d: 天(days);
例子
下面的例子配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的"server"。
1 global 2 daemon 3 maxconn 25600 4 defaults 5 mode http 6 timeout connect 5000ms 7 timeout client 50000ms 8 timeout server 50000ms 9 frontend http-in 10 bind *:80 11 default_backend servers 12 backend servers 13 server server1 127.0.0.1:8080 maxconn 32
全局配置
(1).进程管理及安全相关的参数
1. chroot <jail dir>:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限; 2. daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用; 3. gid <number>:以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险; 4. group <group name>:同gid,不过指定的组名; 5. log <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个; 6. log-send-hostname [<string>]:在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名; 7. nbproc <number>:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式; 8. pidfile:将所有进程的pid写入文件启动进程的用户必须有权限访问此文件 9. uid:以指定的UID身份运行haproxy进程; 10. ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项; 11. user:同uid,但使用的是用户名; 12. stats: 13. node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时; 14. description:当前实例的描述信息;
(2).性能调整相关的参数
1. maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“n”;“ulimit n”自动计算的结果正是参照此参数设定的; 2. maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大; 3. noepoll:在Linux系统上禁用epoll机制; 4. nokqueue:在BSE系统上禁用kqueue机制; 5. nopoll:禁用poll机制; 6. nosepoll:在Linux禁用启发式epoll机制; 7. nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.2528系列的内核上,tcp重组功能有bug存在; 8. spreadchecks <0..50, in percent>:在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长; 9. tune.bufsize <number>:设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值; 10. tune.chksize <number>:设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改; 11. tune.maxaccept <number>:设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为1可以禁止此限制;一般不建议修改; 12. tune.maxpollevents <number>:设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量; 13. tune.maxrewrite <number>:设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值; tune.rcvbuf.client <number>: 14. tune.rcvbuf.server <number>:设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节;强烈推荐使用默认值; 15. tune.sndbuf.client: 16. tune.sndbuf.server:
(3).Debug相关的参数
1. debug 2. quiet
代理
代理相关的配置可以如下配置段中。
- defaults <name>
- frontend <name>
- backend <name>
- - listen <name>
“defaults”段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
“listen”段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
haproxy 配置文件中的关键字参考
1.balance
格式:
1 ###########全局配置######### 2 global 3 log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出] 4 log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug] 5 daemon #以后台形式运行harpoxy 6 nbproc 1 #设置进程数量 7 maxconn 4096 #默认最大连接数,需考虑ulimit-n限制 8 #user haproxy #运行haproxy的用户 9 #group haproxy #运行haproxy的用户所在的组 10 #pidfile /var/run/haproxy.pid #haproxy 进程PID文件 11 #ulimit-n 819200 #ulimit 的数量限制 12 #chroot /usr/share/haproxy #chroot运行路径 13 #debug #haproxy 调试级别,建议只在开启单进程的时候调试 14 #quiet 15 16 ########默认配置############ 17 defaults 18 log global 19 mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK 20 option httplog #日志类别,采用httplog 21 option dontlognull #不记录健康检查日志信息 22 retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置 23 #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip 24 option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现 25 #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持 26 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 27 maxconn 4096 #默认的最大连接数 28 timeout connect 5000ms #连接超时 29 timeout client 30000ms #客户端超时 30 timeout server 30000ms #服务器超时 31 #timeout check 2000 #心跳检测超时 32 #timeout http-keep-alive10s #默认持久连接超时时间 33 #timeout http-request 10s #默认http请求超时时间 34 #timeout queue 1m #默认队列超时时间 35 balance roundrobin #设置默认负载均衡方式,轮询方式 36 #balance source #设置默认负载均衡方式,类似于nginx的ip_hash 37 #balnace leastconn #设置默认负载均衡方式,最小连接数 38 39 ########统计页面配置######## 40 listen stats 41 bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称 42 mode http #http的7层模式 43 option httplog #采用http日志格式 44 #log 127.0.0.1 local0 err #错误日志记录 45 maxconn 10 #默认的最大连接数 46 stats refresh 30s #统计页面自动刷新时间 47 stats uri /stats #统计页面url 48 stats realm XingCloud\\ Haproxy #统计页面密码框上提示文本 49 stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名 50 stats auth Frank:Frank #设置监控页面的用户和密码:Frank 51 stats hide-version #隐藏统计页面上HAProxy的版本信息 52 stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本) 53 54 ########设置haproxy 错误页面##### 55 #errorfile 403 /home/haproxy/haproxy/errorfiles/403.http 56 #errorfile 500 /home/haproxy/haproxy/errorfiles/500.http 57 #errorfile 502 /home/haproxy/haproxy/errorfiles/502.http 58 #errorfile 503 /home/haproxy/haproxy/errorfiles/503.http 59 #errorfile 504 /home/haproxy/haproxy/errorfiles/504.http 60 61 ########frontend前端配置############## 62 frontend main 63 bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。 64 acl web hdr(host) -i www.abc.com #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。 65 acl img hdr(host) -i img.abc.com #如果访问img.abc.com这个域名,就触发img规则。 66 use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。 67 use_backend imgserver if img #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。 68 default_backend dynamic #不满足则响应backend的默认页面 69 70 ########backend后端配置############## 71 backend webserver #webserver作用域 72 mode http 73 balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数 74 option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它 75 server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3 76 server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3 77 #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 78 #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 79 80 backend imgserver 81 mode http 82 option httpchk /index.php 83 balance roundrobin 84 server img01 192.168.137.101:80 check inter 2000 fall 3 85 server img02 192.168.137.102:80 check inter 2000 fall 3 86 87 backend dynamic 88 balance roundrobin 89 server test1 192.168.1.23:80 check maxconn 2000 90 server test2 192.168.1.24:80 check maxconn 2000 91 92 93 listen tcptest 94 bind 0.0.0.0:5222 95 mode tcp 96 option tcplog #采用tcp日志格式 97 balance source 98 #log 127.0.0.1 local0 debug 99 server s1 192.168.100.204:7222 weight 1 100 server s2 192.168.100.208:7222 weight 1
以上是关于HAproxy负载均衡的主要内容,如果未能解决你的问题,请参考以下文章