介绍
HAProxy是一个开源的、高性能的、基于TCP和HTTP应用的负载均衡软件,借助HAProxy可快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案
HAProxy的优点
1) 可靠性和稳定性非常好,可以与硬件的F5相媲美
2) 最高可以同时维护40000–50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbps
3) 支持多于8种负载均衡算法 ,同时也支持session保持
4) 支持虚拟主机功能
5) 从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能
6) HAProxy拥有一个功能强大的服务器状态监控页面
7) HAProxy拥有功能强大的ACL支持
HAProxy是借助于操作系统的技术特征来实现性能最大化的,因此,在使用HAProxy时,对操作系统进行性能调优是非常重要的。在业务系统方面,HAProxy非常适用于那些并发量特别大而且需要持久连接或四层和七层处理机制的web系统。另外,HAProxy也可以用于MySQL读操作的负载均衡
安装
编译安装
http://pkgs.fedoraproject.org/repo/pkgs/haproxy/
#解压
tar -zxvf haproxy-1.7.9.tar.gz
cd haproxy-1.7.9
#安装
[root@haproxy ~]# tar zxf haproxy-1.7.9.tar.gz
[root@haproxy ~]# cd haproxy-1.7.9
[root@haproxy haproxy-1.7.9]# make TARGET=linux26 PREFIX=/usr/local/haproxy
[root@haproxy haproxy-1.7.9]# make install PREFIX=/usr/local/haproxy
[root@haproxy haproxy-1.7.9]# mkdir /usr/local/haproxy/conf
[root@haproxy haproxy-1.7.9]#
cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
#参数说明
TARGET=linux31 #内核版本,使用uname -r查看内核
ARCH=x86_64 #系统位数
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径
复制脚本
[root@haproxy haproxy-1.7.9]# cp examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy-1.7.9]# chmod a+x /etc/init.d/haproxy
[root@haproxy haproxy-1.7.9]# chkconfig --add haproxy
[root@haproxy haproxy-1.7.9]# chkconfig haproxy on
[root@haproxy haproxy-1.7.9]# chkconfig --list haproxy
在线安装
安装yum install haproxy
查看配置rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
配置
根据功能、用途不同,其配置文件主要由5部分组成,分别为global部分,defaults部分,frontend部分、backend部分、listen部分
1)global部分
用于设置全局配置参数,属于进程级的配置,通常用操作系统配置相关
###########全局配置#########
global
log 127.0.0.1 local0 #全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err, warning, info, debug 4种。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info
daemon #以后台形式运行harpoxy,推荐运行模式
nbproc 1 #设置进程数量,默认只启动一个进程;建议该值设置时小于CPU核数
maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
#user haproxy #运行haproxy的用户
#group haproxy #运行haproxy的用户所在的组
pidfile /usr/local/haproxy/logs/haproxy.pid #haproxy 进程PID文件
#ulimit-n 819200 #ulimit 的数量限制
#chroot /usr/share/haproxy #chroot运行路径
#debug #haproxy 调试级别,建议只在开启单进程的时候调试
#quiet
2) defaults部分
默认参数的配置部分。在些部分设置的参数,默认会自动引用到下面的frontend, backend和listen部分
########默认配置############
defaults
log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
tcp模式:在此模式下,客户端和服务器端间将建立一个全双工的连接,不会对七层报文做任何检查,为默认的模式;经常用于SSL, SSH, SMTP等应用
http模式:在此模式下,客户端请求在转发至后端服务器前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝
health模式:目前已经被废除
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
#option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip 【for httpd X-Forwarded-For】
option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
#option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时
#timeout http-keep-alive10s #默认持久连接超时时间
#timeout http-request 10s #默认http请求超时时间
#timeout queue 1m #默认队列超时时间
balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source #设置默认负载均衡方式,类似于nginx的ip_hash
#balnace leastconn #设置默认负载均衡方式,最小连接数
3) frontend部分
用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend
########frontend前端配置##############
frontend www #通过frontend关键字定义了一个名为"www"的前端虚拟节
bind *:80 #此选项用于定义一个或者几个监听的套接字,只能在frontend和listen中定义
格式如下: bind [<address>:[port_range]] [interface];
mode http
log global #使用global段中定义的日志格式
option httplog # HAProxy日志是不记录HTTP请求的,此选项的作用是启用日志记录HTTP请求
option dontlognull
option nolinger
option http_proxy
maxconn 8000
timeout client 30s
option forwardfor #此选项的作用是保证后端服务器可记录客户端真实的IP
# layer3: Valid users
acl allow_host src 192.168.200.150/32
http-request deny if !allow_host
# layer7: prevent private network relaying
acl forbidden_dst url_ip 192.168.0.0/24
acl forbidden_dst url_ip 172.16.0.0/12
acl forbidden_dst url_ip 10.0.0.0/8
http-request deny if forbidden_dst
default_backend test-proxy-srv #指定后端默认的服务器池
4) backend部分
用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求
backend htmpool
mode http
option redispatch #此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端服务器出现故障,客户端的cookie是不会刷新的,这就会造成无法访问。此时,如果设置了此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
option abortonclose #此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接
balance roundrobin #指定负载均衡算法
roundrobin 基于权重进行轮叫调度的算法
static-rr基于权重进行轮叫调度的算法,不过此算法为静态算法,在运行时调整其服务器权重不会生效
source基于请求源IP的算法。此算法先对请求的源IP进行HASH运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器
leastconn此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法 ,例如数据库负载均衡
uri此算法会对部分或整个URI进行HASH运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上
uri_param此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上
hdr此算法根据HTTP头进行转发,如果指定的HTTP头名称不存在,则使用roundrobin算法 进行策略转发
cookie SERVERID #表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义
option httpchk GET /index.php #此选项表示{不建议使用}
格式如下option httpchk <method> <uri> <version>
ethod表示HTTP请求的方式,常用的有OPTIONS,HEAD, GET几种方式。一般的健康检查可以采用HEAD方式进行,而不是采用GET方式,这是因为HEAD方式没有数据返回,仅检查响应报文的状态码是不是200.因此相对于GET, HEAD的方式更简单、更快
uri表示要检测的URL地址
version指定心跳检测时的HTTP的版本号
server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.1.1.2:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3
# server用于定义多台后端真实服务器
server <name> <address>:[port] [param*]
name为后端真实服务器指定一个内部名称,随便定义一个即可
address:port指定后端服务器的IP地址及端口
aram*参数 常用的参数:
check 表示启用对此后端服务器执行健康状态检查
inter 设置健康状态检查的时间间隔,单位是毫秒
rise 检查多少次认为服务器可用
fall 检查多少次认为服务器不可用
weight 设置服务器的权重,默认为1, 最大为256。 设置为0表示不参与负载均衡
backup 设置备份服务器,用于所有后端服务器全部不可用时
cookie 为指定的后端服务器设置cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能
backend用于定义一个名称为htmpool的后端服务器组,根据需要可以定义多个
5) listen用于配置HAProxy监控页面相关的参数
listen admin_status
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s #设置监控统计页面自动刷新的时间
stats uri /haproxy-status #监控页面访问的URI路径
stats realm Welcome login #设置登录监控页面时,密码框上的提示信息
stats auth admin:admin #设置登录监控页面的用户名,密码。用户密码用冒号隔开,可以设置多个,每行一个
stats hide-version #在监控页面上隐藏HAProxy的版本号
stats admin if TRUE #设置此选项,可在监控页面上启用、禁用后端服务器,仅在1.4.9版本以后生效
通过HAProxy的ACL规则实现智能负载均衡
# layer3: Valid users
acl allow_host src 192.168.200.150/32
http-request deny if !allow_host
# layer7: prevent private network relaying
acl forbidden_dst url_ip 192.168.0.0/24
acl forbidden_dst url_ip 172.16.0.0/12
acl forbidden_dst url_ip 10.0.0.0/8
http-request deny if forbidden_dst
ACL规则主要完成如下两种功能:
1、通过设置的ACL规则检查客户端请求是否合法。如果符合ACl规则要求,那么将放行;如果不符合规则,则直接中断请求
2、符合ACL规则要求的请求将被转发到后端的指定backend服务器,进而实现基于ACL规则的负载均衡
HAProxy的ACL规则常定义在frontend段中,格式如下:
acl <acl名称> <acl方法> -i [匹配的路径或文件]
常用的acl方法:
hdr_reg(host) #根据正则表达式匹配
hdr_dom(host) #域名
hdr_beg(host) #用什么开头
url_sub #url包含什么字符
url_dir #ull目录名
path_end
path_beg
-i 表示不区分大小写
示例1:
acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)
acl bbs_policy hdr_dom(host) -i bbs.z.cn
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if bbs_policy
use_backend server_bbs if url_policy
default_backend server_cache
示例2:
acl url_static path_end .gif .png .jpg .css .js
acl host_www hdr_beg(host) -i www
acl host_static hdr_beg(host) -i img. vedio. download. ftp.
use_backend static if host_static || host_www url_static
use_backend www if host_www
default_backend server_cache
管理
(编译安装)
启动:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
查看HAProxy进程
# ps aux | grep haproxy
查看端口
# netstat -antp | grep -e 80 -e 9188
重启haproxy
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `cat /var/run/haproxy.pid`
停止haproxy
# killall haproxy
(yum安装)
启动:
systemctl start haproxy
systemctl stop haproxy
systemctl restart haproxy
监控平台:
http://127.0.0.1:9188/haproxy-status admin/admin
log
参数文件
vim /etc/sysconfig/rsyslog
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
# -c 2 linux6默认有 -r允许接收日志
SYSLOGD_OPTIONS="-c 2 -r"
# vim /etc/rsyslog.conf
# Provides UDP syslog reception
ModLoad imudp
UDPServerRun 514
# Provides TCP syslog reception
ModLoad imtcp
InputTCPServerRun 514
#添加
local0.* /var/log/haproxy.log
重启
systemctl restart rsyslog.service
调度web
#
# demo config for Proxy mode
#
global
maxconn 20000
ulimit-n 50000
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
nbproc 1
daemon
pidfile /var/run/haproxy.pid
defaults
mode http
retries 3
timeout connect 5s
timeout client 10s
timeout server 30s
timeout check 2s
frontend test-proxy
bind *:80
mode http
log global
option httplog
option dontlognull
option nolinger
option http_proxy
maxconn 8000
timeout client 30s
#bind-process 2
acl host_test hdr_dom(host) -i www.mysqlx.com
use_backend server_test if host_test
#直接使用ip是找不到服务的,就走默认的,完美解决IP访问
default_backend server_test
backend server_test
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
#option httpchk HEAD /status.html
server test1 192.168.10.1:8080 cookie test1 weight 3 check inter 2000 rise 1 fall 2
server test2 192.168.10.2:80 cookie test2 weight 3 check inter 2000 rise 1 fall 2
listen admin_status
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm Welcome login
stats auth admin:admin
stats hide-version
stats admin if TRUE
调度mysql
listen mysql
bind *:3366
mode tcp
balance roundrobin
server mysql1 192.168.122.40:3306 weight 1 check inter 1s rise 2 fall 2
server mysql2 192.168.122.50:3306 weight 1 check inter 1s rise 2 fall 2