目录
一、Haproxy介绍:
1.Haproxy应用分析:
2.Haproxy的特性:
3.Haproxy常见的调度算法:
4.LVS、Nginx、HAproxy的区别:
4.1 Haproxy与lvs对比:
4.2 Haproxy与nginx对比:
5. Haproxy优点:
二、Haproxy部署:
1. 配置Haproxy负载调度器:
1.1 准备Haproxy调度器:
1.2 编写Haproxy配置文件:
HAProxy 的配置文件共有 5 个域:
1.3 添加Haproxy系统服务:
2.服务器节点部署:
3.测试:
三、keepalived+haproxy高可用调度集群:
1.部署两台haproxy负载调度器:
2.部署主keepalived:
3.部署备keepalived:
4.测试:
关闭haproxy模拟故障:
一、Haproxy介绍:
1.Haproxy应用分析:
LVS在企业中康复在能力很强,但存在不足:
- LVS不支持正则处理,不能实现动静分离
- 对于大型网站LVS的事实配置较为复杂,维护成本相对较
Haproxy是一款可以供高可用性、负载均衡和基于TCP和HTTP应用的代理软件
非常适用于并发大(并发达1w以上)web站点,可保持站点的会话保持或七层处理
2.Haproxy的特性:
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
- 支持多达8种负载均衡算法
- 支持Session会话保持,Cookie的引导;
- 支持通过获取指定的url来检测后端服务器的状态;
- 支持虚机主机功能,从而实现web负载均衡更加灵活;
- 支持连接拒绝、全透明代理等独特的功能;
- 拥有强大的ACL支持,用于访问控制;
- 支持TCP和HTTP协议的负载均衡转发;
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
3.Haproxy常见的调度算法:
- roundrobin,表示简单的轮询
- static-rr,表示根据权重
- leastconn,表示最少连接者先处理
- source,表示根据请求源IP
- uri,表示根据请求的URI,做cdn需使用;
- url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
- hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
- rdp-cookie(name),表示根据cookie(name)来锁定并哈希每一次TCP请求。
4.LVS、Nginx、HAproxy的区别:
4.1 Haproxy与lvs对比:
- LVS基于Linux操作系统内核实现软负载均衡,HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
4.2 Haproxy与nginx对比:
- HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。
5. Haproxy优点:
- HAProxy也是支持虚拟主机的。
- HAProxy支持8种负载均衡策略。
- HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态。
- HAProxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
- HAProxy支持TCP协议的负载均衡转发。
二、Haproxy部署:
1. 配置Haproxy负载调度器:
1.1 准备Haproxy调度器:
1.关闭防火墙:
systemctl stop firewalld
setenforce 0
2.下载安装包(或者自行上传):
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
2.安装依赖和环境:
yum install -y zlib-devel pcre-devel openssl-devel systemd-devel pcre-devel bzip2-devel gcc gcc-c++ make
3.编译安装Haproxy(我这里是自行上传的2.8.3):
cd /data/haproxy-2.8.3
make PREFIX=/usr/local/haproxy ARCH=x86_64 TARGET=31 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1
make install PREFIX=/usr/local/haproxy
4.创建登录用户:
useradd -M -s /sbin/nologin haproxy
1.2 编写Haproxy配置文件:
HAProxy 的配置文件共有 5 个域:
- global:用于配置全局参数
- default:用于配置所有frontend和backend的默认属性
- frontend:用于配置前端服务(即HAProxy自身提供的服务)实例
- backend:用于配置后端服务(即HAProxy后面接的服务)实例组
- listen:frontend + backend的组合配置,可以理解成更简洁的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下
5.创建配置文件目录:
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
#将info(及以上)的日志发送到rsyslog的local0接口,将warning(及以上)的日志发送到rsyslog的local1接口
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
maxconn 30000 #最大连接数,HAProxy 要求系统的 ulimit -n 参数大于 maxconn*2+18
#chroot /var/lib/haproxy #修改haproxy工作目录至指定目录,一般需将此行注释掉
pidfile /var/run/haproxy.pid #指定保存HAProxy进程号的文件
user haproxy #以指定的用户名身份运行haproxy进程
group haproxy #以指定的组名运行haproxy,以免因权限问题带来风险
daemon #让haproxy以守护进程的方式工作于后台
#nbproc 1 #指定启动的haproxy进程个数,只能用于守护进程模式的haproxy,默认只启动一个进程。haproxy是单进程、事件驱动模型的软件,单进程下工作效率已经非常好,不建议开启多进程
spread-checks 2 #在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;默认为0,官方建议设置为2到5之间。
defaults #配置默认参数,这些参数可以被用到listen,frontend,backend组件
log global #所有前端都默认使用global中的日志配置
mode http #模式为http(7层代理http,4层代理tcp)
option http-keep-alive #使用keepAlive连接,后端为静态建议使用http-keep-alive,后端为动态应用程序建议使用http-server-close
option forwardfor #记录客户端IP在X-Forwarded-For头域中,haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段
option httplog #开启httplog,在日志中记录http请求、session信息等。http模式时开启httplog,tcp模式时开启tcplog
option dontlognull #不在日志中记录空连接
option redispatch #当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 20000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后会将对应后端服务器标记为不可用
timeout http-request 2s #默认http请求超时时间,此为等待客户端发送完整请求的最大时长,用于避免类DoS攻击。haproxy总是要求一次请求或响应全部发送完成后才会处理、转发
timeout queue 3s #默认客户端请求在队列中的最大时长
timeout connect 1s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容
timeout client 10s #默认和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接,新版本中替代clitimeout
timeout server 2s #默认和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是高并发时,新版本中替代srvtimeout
timeout http-keep-alive 10s #默认和客户端保持长连接的最大时长。优先级高于timeout http-request 也高于timeout client
timeout check 2s #和后端服务器成功建立连接后到最终完成检查的最大时长(不包括建立连接的时间,只是读取到检查结果的时长)
frontend http-in
bind *:80
acl url_jsp path_end -i .jsp
use_backend tomcat_server if url_jsp
default_backend nginx_server
backend nginx_server
balance roundrobin
option httpchk GET /test.html
server ngx01 192.168.80.11:80 check inter 2000 fall 3 rise 2
server ngx02 192.168.80.12:80 check inter 2000 fall 3 rise 2
backend tomcat_server
balance roundrobin
option http-server-close
cookie HA_STICKY_dy insert indirect nocache
server tomcat01 192.168.80.20:8080 cookie tomcat01 check inter 2000 fall 3 rise 2
server tomcat02 192.168.80.30:8080 cookie tomcat02 check inter 2000 fall 3 rise 2
listen stats
bind *:1080
stats enable
stats refresh 30s
stats uri /stats
stats realm HAProxy\ Stats
stats auth admin:admin
1.3 添加Haproxy系统服务:
cp /opt/haproxy-2.8.3/examples/haproxy.init /etc/init.d/haproxy
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
2.服务器节点部署:
见前面博客........
3.测试:
因为动态页面做了cookie会话保持,所以需要清理历史记录才能换服务器
三、keepalived+haproxy高可用调度集群:
1.部署两台haproxy负载调度器:
步骤同上
2.部署主keepalived:
1.关闭防火墙:
systemctl disable --now firewalld
setenforce 0
2.下载keepalived
yum -y install keepalived
3.编写健康检测预防脑裂脚本:
vim /etc/keepalived/chk_haproxy.sh
#!/bin/bash
#使用killall -0检查haproxy实例是否存在,性能高于ps命令
if ! killall -0 haproxy; then
systemctl stop keepalived
fi
chmod +x /etc/keepalived/chk_haproxy.sh
4.编写keepalived配置文件:
主master:
vrrp_script chk_http_port {
script "/etc/keepalived/chk_haproxy.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.88.200 # 定义虚拟ip(VIP),可多设,每行一个
}
}
5.开启keepalived:
systemctl start keepalived
ip a 查看vip地址
3.部署备keepalived:
安装keepalived 步骤同上:
备服务器BACKUP:
vim /etc/keepalived/chk_haproxy.sh
#!/bin/bash
#使用killall -0检查haproxy实例是否存在,性能高于ps命令
if ! killall -0 haproxy; then
systemctl stop keepalived
fi
chmod +x /etc/keepalived/chk_haproxy.sh
vrrp_script chk_http_port {
script "/etc/keepalived/chk_haproxy.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 99 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.88.200 # 定义虚拟ip(VIP),可多设,每行一个
}
}
开启keepalived:
systemctl start keepalived
4.测试:
关闭haproxy模拟故障: