haproxy简介
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层http协议, 4层负载均衡:用的是tcp协议加端口号做的负载均衡
HaProxy的核心功能
# 负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
# 健康检查:支持TCP和HTTP两种健康检查模式
# 会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
# SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
# HTTP请求重写与重定向
# 监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态
HaProxy的关键特性
性能
1 . 采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
2 . 大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
3 . HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
4 . HAProxy作者在8年前(2009)年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。
稳定性
作为建议以单进程模式运行的程序,HAProxy对稳定性的要求是十分严苛的。按照作者的说法,HAProxy在13年间从未出现过一个会导致其崩溃的BUG,HAProxy一旦成功启动,除非操作系统或硬件故障,否则就不会崩溃(我觉得可能多少还是有夸大的成分)。 在上文中提到过,HAProxy的大部分工作都是在操作系统内核完成的,所以HAProxy的稳定性主要依赖于操作系统,作者建议使用2.6或3.x的Linux内核,对sysctls参数进行精细的优化,并且确保主机有足够的内存。这样HAProxy就能够持续满负载稳定运行数年之久。
个人建议
1 . 使用3.x内核的Linux操作系统运行HAProxy
2 . 运行HAProxy的主机上不要部署其他的应用,确保HAProxy独占资源,同时避免其他应用引发操作系统或主机的故障
3 . 至少为HAProxy配备一台备机,以应对主机硬件故障、断电等突发情况(搭建双活HAProxy的方法在后文中有描述)
4 . sysctl的建议配置(并不是万用配置,仍然需要针对具体情况进行更精细的调整,但可以作为首次使用HAProxy的初始配置使用)
Haproxy服务器部署
关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
安装 Haproxy //编译安装
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.7.2.tar.gz
cd haproxy-1.7.2/
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
参数说明: TARGET=linux26 #内核版本, #使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
Haproxy服务器配置
useradd -M -s /sbin/nologin haproxy
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
//yum安装
yum install -y haproxy
HAProxy 的配置文件共有 5 个域:
global:用于配置全局参数
default:用于配置所有frontend和backend的默认属性
frontend:用于配置前端服务(即HAProxy自身提供的服务)实例
backend:用于配置后端服务(即HAProxy后面接的服务)实例组
listen:frontend + backend的组合配置,可以理解成更简洁的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下
配置文件
######################## 全局配置 ############################
####### 参数是进程级的,通常和操作系统(OS)相关
global
chroot /var/haproxy # 锁定运行目录
uid 99 # 所属运行的用户uid
gid 99 # 所属运行的用户组
daemon # 守护进程。以后台形式运行haproxy
nbproc 1 # haproxy进程数,与CPU保持一致
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
ulimit-n 65535 # ulimit的数量限制
maxconn 20480 # 默认最大连接数
log 127.0.0.1 local0 # 日志输出配置,所有日志都记录在本机系统日志,通过 local0 输出
log 127.0.0.1 local1 notice # notice 为日志级别,通常有24个级别(error warring info debug)
######################### 默认设置 ##########################
## 这些参数可以被利用配置到 frontend,backend,listen组件
defaults
log global # 定义日志为global(全局)配置中的日志定义
mode http # 所处理的类别 (网络七层协议中,tcp是第4层的会话层、http是第7层的应用层)
maxconn 20480 # 最大连接数
option httplog # 日志类别http日志格式
option httpclose # 每次请求完毕后主动关闭http通道
option dontlognull # 不记录健康检查的日志信息
option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # 当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
stats refresh 30 # 统计页面刷新间隔
retries 3 # 检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
balance roundrobin # 默认的负载均衡的方式,轮询方式,上面的第4段8种负载均衡算法
#balance source # 默认的负载均衡的方式,类似nginx的ip_hash
#balance leastconn # 默认的负载均衡的方式,最小连接
contimeout 5000 # 连接的超时时间
clitimeout 50000 # 客户端的超时时间
srvtimeout 50000 # 服务器的超时时间
timeout check 2000 # 心跳检测的超时时间
#################### 监控页面的设置 #######################
listen admin_status # Frontend 和Backend 的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:65532 # 监听端口
mode http # http的7层网络模式
log 127.0.0.1 local3 err # 错误日志记录
stats refresh 5s # 每隔5秒自动刷新监控页面
stats uri /admin?stats # 监控页面的url
stats realm itnihao\ itnihao # 监控页面的提示信息是 it ni hao
stats auth admin:admin # 监控页面的用户和密码admin。可以设置多个用户名,如下所示
stats auth admin1:admin1 # 监控页面的用户和密码 admin1
stats hide-version # 隐藏统计页面上的 HAproxy版本信息
stats admin if TRUE # 手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
####################### frontend配置 ################################
##### 注意,frontend 配置里面可以定义多个 acl 进行匹配操作
frontend http_80_in
bind 0.0.0.0:80 # 监听端口,即 haproxy 提供web服务的端口,和 lvs 的vip端口类似
mode http # http的7层模式
log global # 应用全局的日志配置
option httplog # 启用http的log
option httpclose # 每次请求完毕后主动关闭 http 通道,HA-Proxy不支持keep-alive模式
option forwardfor # 如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从 Http Header 中获得客户端IP
acl html url_reg -i \.html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
acl jsp url_reg -i \.jsp$ #1.访问控制列表名称jsp。规则要求访问以jsp结尾的url(可选)
use_backend jspserver if jsp #2.如果满足acl jsp规则,则推送给后端服务器jspserver
default_backend httpservers #不满足acl策略默认后端服务器组
######################### backend的设置 ########################
### 下面我将设置三组服务器 server_web,server_blog,server_bbs
############### backend server_web ##############
backend server_web
mode http # http的7层模式
balance roundrobin # 负载均衡的方式,roundrobin平均方式
cookie SERVERID # 允许插入serverid到cookie中,serverid后面可以定义
option httpchk GET /index.html # 心跳检测的文件
server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1
server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
# server web2 192.168.16.3:80 表示 服务器定义,
# cookie web2 表示 serverid为web2,
# check inter 1500 表示 检测心跳频率,
# rise 3 表示 3次正确认为服务器可用,
# fall 3 表示 3次失败认为服务器不可用,
# weight 2 表示 权重
添加haproxy 系统服务
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 90 30
#description: Haproxy Service Control Script
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=/var/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
#Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
start()
{
echo -e "Starting $DESC: $PROGNAME\n"
$DAEMON -f $CONFIG
echo "......"
}
stop()
{
echo -e "Stopping $DESC: $PROGNAME\n"
haproxy_pid="$(cat $PIDFILE)"
kill $haproxy_pid
echo "......"
}
restart()
{
echo -e "Restarting $DESC: $PROGNAME\n"
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo "......"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
exit 0
cd /etc/init.d/
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
修改配置文件
yum安装通过一下命令去掉注释
sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
nbproc 1
defaults
mode http
log global
retries 3
option httplog
option httpclose
option redispatch
option abortonclose
maxconn 4000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen stats
bind *:82
stats enable
stats uri /haproxy
stats auth lisi:123
frontend web
mode http
bind *:80
option httplog
acl html url_reg -i \.html$
acl jsp url_reg -i \.jsp$
use_backend jspserver if jsp
use_backend httpservers if html
default_backend httpservers
backend httpservers
balance roundrobin
server http1 192.168.10.11:81 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.10.10:81 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
backend jspserver
balance roundrobin
server web1 192.168.10.13:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server web2 192.168.10.11:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
maxconn < maxconn>:当前server的最大并发连接数;
backlog < backlog>:当前server的连接数达到上限后的后援队列长度;
backup:设定当前server为备用服务器;和nginx里的sorry server 是一样的;
cookie < value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;
disabled:标记为不可用;相当于nginx里的down;
redir < prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
weight < weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;
on-error < mode>:后端服务故障时采取的行动策略;策略有如下几种:
fastinter:表示缩短健康状态检测间的时长;
fail-check:表示即健康状态检测失败,也要检测;这是默认策略;
sudden-death:模拟一个致命前的失败的健康检查,一个失败的检查将标记服务器关闭,强制fastinter
mark-down:立即标记服务器不可用,并强制fastinter;
check:对当前server做健康状态检测;
addr :检测时使用的IP地址;
port :针对此端口进行检测;
inter < delay>:连续两次检测之间的时间间隔,默认为2000ms;
rise < count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2;
fall < count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;
haproxy默认不开启日志记录,如果不更改配置,在/var/log/haproxy.log和/var/log/message配置文件都不会写入日志记录,为了方便更好排错,还是开启比较好。
日志级别:
日志的级别为local0~local7,另外16~23保留为本地使用:
配置:
1、vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
#local2是设备,对应于 /etc/rsyslog.conf中的配置,默认回收info的日志级别
2、编辑系统日志配置
vim /etc/rsyslog.conf
默认有下面的设置,会读取 /etc/rsyslog.d/*.conf目录下的配置文件
$IncludeConfig /etc/rsyslog.d/*.conf
为haproxy创建一个独立的配置文件
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
#如果不加下面的的配置则除了在/var/log/haproxy.log中写入日志外,也会写入message文件
配置完成后重启haproxy和rsyslog服务
systemctl restart haproxy rsyslog