千万级高并发负载均衡软件HA PROXY
基于硬件的负载均衡设备:f5,big-ip等
基于软件的负载均衡产品:ha proxy,lvs,nginx等
在软件的负载均衡产品中,分为基于系统的软负载实现和基于第三方软件的软负载实现,LVS是基于系统实现的一种软负载。HA proxy是基于第三方应用实现的软负载均衡
1.haproxy简介
haproxy是一个开源的,高性能的,基于tcp第四层和http第七层应用的负载均衡软件
优点:可靠性和稳定性非常好
最高可以同时维护40000-50000个并发连接。单位时间内处理最大的请求数为20000.最大数据处理能力可达10GBPS
支持多于8种负载均衡算法,同时也支持session保持
支持虚拟主机功能。
支持连接拒绝,全透明代理等功能
haproxy拥有一个功能强大的服务器状态监控页面
haproxy 拥有强大的ACL支持
在业务系统方面。haproxy非常实用于那些并发量特别大而且需要持久连接或四层和七层处理机制的web系统,例如电商,另外haproxy也可用于mysql数据库(读操作)的负载均衡
2.四层和七层负载均衡的区别
四层负载均衡器也称为四层交换机,它主要是通过分析ip层及tcp/udp层的流量实现的基于ip+端口
tcp应用实例:负载均衡器在接收到第一个来自SYN请求时,会通过设定的负载均衡算法选择一台最佳的后端服务器,同时将报文中的目标ip修改为后端服务器ip,然后直接转发给该服务器。负载均衡器在这个过程中相当于一个路由器的作用
七层负载均衡器也称为7层交换机,位于iso应用层,支持多种应用协议,常见的HTTP,FTP,SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器。因此也称为“内容交换机”。七层负载均衡器在这个情况下类似于一个代理服务器。
3.haproxy与LVS的异同
两者都是软件负载均衡的产品。但是lvs基于系统,haproxy基于第三方应用
lvs是基于第四层的ip负载技术。haproxy是基于第四层和第七层,可提供tcp和http应用的负载均衡综合解决方案
LVS工作在iso模型第四层,状态监测功能单一。haproxy监测功能强大,可支持端口,url,脚本等多种检测方式
haproxy处理性能低于四层负载均衡模式的LVS
HAProxy常用的算法有如下8种:
balance roundrobin,表示简单的轮询,建议关注;
balance static-rr,表示根据权重,建议关注;
balance leastconn,表示最少连接者先处理,建议关注;
balance source,表示根据请求源IP,跟Nginx的ip_hash算法相似,建议关注;
balance uri,表示根据请求的URI;
balance url_param,表示根据请求的URl参数;
balance hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
balance rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
日志配置:
日志的level: local0~local7 16~23保留为本地使用
emerg 0 系统不可用
alert 1 必须马上采取行动的事件
crit 2 关键的事件
err 3 错误事件
warning 4 警告事件
notice 5 普通但重要的事件
info 6 有用的信息
debug 7 调试信息
cat /etc/redhat-release
CentOS release 6.6 (Final)
uname -r
2.6.32-504.el6.x86_64
yum install pcre-devel openssl-devel -y
tar zxvf haproxy-1.4.26.tar.gz
cd haproxy-1.4.26
make TARGET=linux26 ARCH=x86_64
make PREFIX=/application/haproxy install
配置Haproxy
Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
•global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
•default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件;
•frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择);
•backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
•listen:Frontend和Backend的组合体。
vi /etc/sysctl.conf
加入下面内容
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_nonlocal_bind = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
cd /application/haproxy/
mkdir -p bin conf logs var/run var/chroot
vim /application/haproxy/conf/haproxy.conf
global
chroot /application/haproxy/var/chroot
daemon
group www
user www
log 127.0.0.1:514 local0 warning
pidfile /application/haproxy/var/run/haproxy.pid
maxconn 20000
spread-checks 3
nbproc 8
defaults
log global
mode http
retries 3
option redispatch
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen test
bind 192.168.12.147:80
mode http
stats enable
stats hide-version
stats uri /haproxy
stats auth admin:admin
balance roundrobin
option httpclose
option forwardfor
cookie SERVERID insert indirect
timeout server 15s
timeout connect 15s
server ett-1-1 192.168.12.22:80 cookie ett-1-1 check port 80 inter 5000 fall 5
server ett-1-2 192.168.12.25:80 cookie ett-1-1 check port 80 inter 5000 fall 5
增加IP
ifconfig eth1 add 192.168.12.147
配置启动脚本
vi /etc/rc.d/init.d/haproxy
#!/bin/bash
BASE="/application/haproxy"
PROG=$BASE/sbin/haproxy
PIDFILE=$BASE/var/run/haproxy.pid
CONFFILE=$BASE/conf/haproxy.conf
case "$1" in
start)
$PROG -f $CONFFILE
;;
status)
if [ ! -f $PIDFILE ]; then
echo "pid not found"
exit 1
fi
for pid in $(cat $PIDFILE); do
kill -0 $pid
RETVAL="$?"
if [ ! "$RETVAL" = "0" ]; then
echo "process $pid died"
exit 1
fi
done
echo "process is running"
;;
restart)
$PROG -f $CONFFILE -sf $(cat $PIDFILE)
;;
stop)
kill $(cat $PIDFILE)
;;
*)
echo "USAGE: $0 start|restart|status|stop"
exit 1
;;
esac
chmod +x /etc/rc.d/init.d/haproxy
vi /etc/rsyslog.conf
#增加如下行,记录日志到/var/log/haproxy.log 文件
local0.* /var/log/haproxy.log
第三步:
vi /etc/sysconfig/rsyslog
将SYSLOGD_OPTIONS="-m 0"
改成
SYSLOGD_OPTIONS="-c 2 -r -m 0"
service rsyslog restart
/etc/init.d/haproxy start
配置文件详解:
global
log 127.0.0.1:514 local0 warning # 定义全局日志服务器
chroot /application/haproxy/var/chroot # 修改haproxy的工作目录到制定的目录,提高安全性
pidfile /application/haproxy/var/run/haproxy.pid # pid文件位置
maxconn 20000 # 最大连接数
user www # 服务运行时的身份,也可以用uid来表示
group www # 服务运行时的身份所属的组,可以用gid来表示
Daemon # 服务以守护进程的身份运行
nbproc 8 #进程数,(这个自己定义,如果启动haproxy报警告错误就改小一点)
**********************默认配置*********************************
defaults
mode http # 为http服务代理,http为7层协议,tcp4层
log global # 全局日志
option httplog # 是否允许重新分配在session 失败后
option dontlognull # 不记录健康查询的日志
contimeout 5000 #连接超时时间
clitimeout 50000#客户端超时
srvtimeout 50000#server处理超时
***********************后端服务器配置*****************************
listen test
bind 192.168.12.147:80 监听端口
mode http http的7层模式,默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
监控统计的账号和密码
stats enable
stats hide-version
stats uri /haproxy 网页登陆地址
stats auth admin:admin 登陆账号密码
balance roundrobin 负载均衡模式
option httpclose
option forwardfor
cookie SERVERID insert indirect
timeout server 15s
timeout connect 15s
server web-1-1 192.168.12.22:80 cookie web-1-1 check port 80 inter 5000 fall 5
server web-1-2 192.168.12.25:80 cookie web-1-1 check port 80 inter 5000 fall 5
###############################################################
acl访问控制
frontend web
bind *:8080
default_backend static
acl abc src 172.16.1.100
redirect prefix http://172.16.1.6/def if abc
当客户端ip为172.16.5.100时,重定向到http://172.16.5.16/def
acl要和redirect prefix或者redirect location搭配使用
官方实例,将用户登录后的url重定向到https安全连接。
acl clear dst_port 80
acl secure dst_port 8080
acl login_page url_beg /login
acl logout url_beg /logout
acl uid_given url_reg /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix https://mysite.com if login_page !secure
redirect prefix http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/ if !login_page secure
redirect location / clear-cookie USERID= if logout
访问阻止
frontend web
bind *:8080
default_backend static
acl abc src 172.16.5.100
block if abc # 阻止访问