haproxy
1. 简介
Haproxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机。
haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。负载均衡LVS是基于四层。
haproxy 高性能负载均衡优点如下:
haproxy是支持虚拟主机的,可以工作在4/7层
能够补充nginx 的一些缺点,比如 session 的保持、cookie 的引导等工作
支持url 检测后端的服务器
它跟lvs 一样,只是一款负载均衡软件,单纯从效率上来讲,haproxy 更会比nginx又更出色的负载均衡速度,在并发处理上也是优于nginx的
haproxy可以对mysql 读进行负载均衡,对后端的MySQL节点进行 检测和负载均衡,haproxy 支持多种算法。
haproxy+keepalived 企业高性能web 能够支持千万级并发网站。
2. 安装配置
2.1 安装
下载网址:http://download.openpkg.org/components/cache/haproxy/
# wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.10.tar.gz # tar -xvf haproxy-1.8.10.tar.gz # cd haproxy-1.8.10 # make TARGET=linux2628 PREFIX=/usr/local/haproxy/
# 2.0以后 make TARGET=linux-glibc PREFIX=/usr/local/haproxy/
# make install PREFIX=/usr/local/haproxy # /usr/local/haproxy/sbin/haproxy -v
2.2 haproxy 配置文件详解
###########全局配置######### global log 127.0.0.1 local0 # 日志输出配置,所有日志都记录在本机,通过local0输出 log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warring info debug] daemon #以后台形式运行harpoxy nbproc 8 #进程数量(可设置多个进程提高性能) maxconn 4096 #默认最大连接数 uid #运行haproxy的用户uid gid #运行haproxy的用户所属组的gid pidfile /var/run/haproxy.pid #haproxy 进程PID文件 ulimit-n 65535 #ulimit 的数量限制 chroot /usr/share/haproxy #chroot运行路径 debug #haproxy 调试级别,建议只在开启单进程的时候调试 quiet ########默认配置############ defaults log global mode http #所处理的类别(7层http,四层tcp) maxconn 20480 #最大连接数
option httplog #日志类别http日志格式
option httpclose #每次请求完毕后主动关闭http通道 option dontlognull #不记录健康检查的日志信息 retries 3 #3次连接失败就认为是服务器不可用,也可以通过后面设置 option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 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 #设置默认负载均衡方式,最小连接数 ########监控页面配置######## listen admin_stats #Frontend和Backend的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:65535 # 监听端口 mode http #http的7层模式 option httplog #采用http日志格式 log 127.0.0.1 local3 err #错误日志记录 maxconn 10 #默认的最大连接数 stats refresh 30s #每个5s自动刷新监控页面 stats uri /stats #监控页面url stats realm Nanshan\ Haproxy #监控页面的提示信息 stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名 stats auth wind:wind #设置监控页面的用户和密码:wind stats hide-version #隐藏统计页面上HAProxy的版本信息 stats admin if TRUE #设置手工启动/禁用,后端服务器
########监控haproxy 后端服务器状态
listen site_status
bind 0.0.0.0:1081 #监听端口
mode http #http7层模式
log 127.0.0.1 local3 err #[err warning info debug]
monitor-uri /site_status #网站健康监测URL,用了检测haproxy 管理的网站是否可用,正常返回200,不正常返回530
acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略,当挂在负载均衡上的指定 backend 的有效机器数小于 1 台时返回true
monitor fail if site_dead #当满足策略时返回503
monitor-net 192.168.80.130/32 #来自192.168.80.130 的日志信息不会被记录和转发
monitor-net 192.168.80.131/32 #来自192.168.80.131 的日志信息不会被记录和转发
########设置haproxy 错误页面##### #errorfile 403 /usr/local/haproxy/errorfiles/403.http #errorfile 500 /usr/local/haproxy/errorfiles/500.http #errorfile 502 /usr/local/haproxy/errorfiles/502.http #errorfile 503 /usr/local/haproxy/errorfiles/503.http #errorfile 504 /usr/local/haproxy/errorfiles/504.http ########frontend配置############## frontend main bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。 acl abc hdr(host) -i www.abc.com #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发abc规则,。 acl bcd hdr(host) -i www.bcd.com #如果访问www.bcd.com这个域名,就触发bcd规则。 use_backend abcserver if abc #如果上面定义的abc规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。 use_backend bcdserver if bcd #如果上面定义的bcd规则被触发,即访问www.bcd.com,就将请求分发到bcdserver这个作用域。 default_backend dynamic #不满足则响应backend的默认页面 ########backend配置############## backend abcserver mode http #http的7层模式 balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数 option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它 server web1 192.168.80.133:80 cookie 1 weight 5 check inter 2000 rise 2 fall 3 server web2 192.168.80.134:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
2.3 配置haproxy 服务
# cd /usr/local/haproxy/ # mkdir etc # touch /usr/local/haproxy/etc/haproxy.cfg
2.4 配置文件内容
global maxconn 2000 log 127.0.0.1 local0 uid 1000 gid 1000 chroot /var/empty nbproc 4 daemon defaults log global mode http maxconn 2000 option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend nginx bind *:80 mode http log global option httplog option dontlognull option nolinger option http_proxy maxconn 8000 timeout client 30s acl abc hdr_end(host) -i www.abc.com acl bcd hdr_end(host) -i www.bcd.com use_backend abcserver if abc use_backend bcdserver if bcd default_backend abcserver backend abcserver balance roundrobin option httpchk /index.html HTTP/1.0 server web1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 4 backend bcdserver balance roundrobin option httpchk /index.html HTTP/1.0 server web1 192.168.80.134:80 cookie 1 check inter 2000 rise 2 fall 3 weight 1
3. haproxy + keepalived
环境准备
nginx1:192.168.80.131 nginx2:192.168.80.134 keepalived+haproxy(master):192.168.80.133 keepalived+haproxy(backup):192.168.80.132 VIP:192.168.80.250
3.1 安装keepalived
# tar -zxvf keepalived-2.0.20.tar.gz # cd keepalived-2.0.20 # ./configure --prefix=/usr/local/keepalived # make && make install # cp keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/ # cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ # mkdir -p /etc/keepalived # cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ # cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
3.2 配置keepalived
master
! Configuration File for keepalived global_defs { router_id haproxy1 } vrrp_script check { script "/data/sh/check_haproxy.sh" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.250 } track_script { check } }
backup
! Configuration File for keepalived global_defs { router_id haproxy1 } vrrp_script check { script "/data/sh/check_haproxy.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.250 } track_script { check } }
3.3 创建检测脚本
# cat /data/sh/check_haproxy.sh #!/bin/bash #auto check haproxy process killall -0 haproxy if [[ $? -ne 0 ]];then /etc/init.d/keepalived stop fi
3.4 haproxy 配置
# cat /usr/local/haproxy/haproxy.cfg global maxconn 8000 log 127.0.0.1 local0 uid 1000 gid 1000 chroot /var/empty daemon defaults log global mode http maxconn 2000 option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend nginx bind 192.168.80.250:80 mode http log global option httplog option dontlognull maxconn 8000 stats uri /haproxy?stats default_backend abcserver backend abcserver balance roundrobin option forwardfor option httpchk GET /index.html server web1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 2 server web2 192.168.80.134:80 cookie 2 check inter 2000 rise 2 fall 3 weight 1
主备服务器上haproxy 配置可相同。