架构
2个节点,每个节点上按照keepalive和haproxy.
1. 2个keepalive使用一个vip对外提供服务,使用备备不抢占模式
2. keepalive的作用是保证所在节点的haproxy服务处于启动状态,若haproxy启动失败则kill掉自身keepalive,由另一个keepalive节点提供服务
3. 2个haproxy的作用是使用最小连接数模式把http(s)请求发送给2个gateway,同一个时间只有一个haproxy提供服务
haproxy部署
haproxy.cfg
vim /app/haproxy/conf/haproxy.cfg
global
log 127.0.0.1 local2 info
maxconn 32768
pidfile /app/haproxy/run/haproxy.pid
stats socket /app/haproxy/lib/haproxy/stats
user mwop
group mwop
daemon #守护进程运行
nbproc 1 #指定启动的haproxy进程个数,只能用于守护进程模式的haproxy
tune.ssl.default-dh-param 2048
defaults
log global #使用global里的log
mode http
option forwardfor #允许在request 中加入X-Forwarded-For header 发往server
option dontlognull #haproxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
option httplog #定制日志格式
option log-separate-errors #对非完全成功的连接改变日志记录等级
#option tcplog #允许记录tcp 连接的状态和时间,可在测试过程中开启;
option httpclose #HAProxy在完成一次请教请求连接后,将主动关闭该连接
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option http-no-delay
retries 3
timeout connect 60s #成功连接后端服务器的最大等待时长
timeout client 10m #客户端最长空闲连接超时时长 默认单位是毫秒
timeout server 30m #后端服务器最长空闲连接超时时长
timeout check 10s
listen Stats
#mode http
bind 0.0.0.0:10000
stats enable #在web页面启动统计页
stats uri / #统计页的url地址
stats refresh 5s #设定自动刷新时间间隔
stats show-node
stats show-legends
stats hide-version
frontend gw_80_frontend
bind 0.0.0.0:80
#redirect scheme https if !{ ssl_fc }
default_backend gw_server
frontend gw_443_frontend
#mode http
bind 0.0.0.0:443 ssl crt /app/haproxy/cert/cmft.com.pem ciphers AES:ALL:!aNULL:!eNULL:!RC4:-EXPORT:-DES no-sslv3 no-tlsv10
default_backend gw_server
backend gw_server
balance leastconn
server gw1 100.75.0.21:7480 check inter 2s rise 3 fall 5 #2000mscheck一次server,连续3次成功才算可用,连续5次失败算不可用
server gw2 100.75.0.27:7480 check inter 2s rise 3 fall 5
haproxy安装
1.从已安装haproxy的机器上把/app/haproxy目录打包拷贝到新机器/app/目录下
2.需要安装gcc, yum -y install gcc automake autoconf libtool yum -y install gcc gcc-c++
3.根据haproxy.cfg里的log 127.0.0.1 local2 info 配置,需要在/etc/rsyslog.conf里添加信息并重启日志记录服务systemctl restart rsyslog
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy/haproxy.log
4.创建mwop用户: groupadd mwop
5. useradd -s /bin/bash -d /home/mwop -g mwop -G user01 mwop
6.需要查看系统配置的最大文件打开数是否符合haproxy.cfg的maxconn要求
7. mkdir /var/log/haproxy
8. chown mwop mwop /var/log/haproxy
配置参数说明
timeout connect 60s #成功连接后端服务器的最大等待时长
timeout client 10m #客户端最长空闲连接超时时长 默认单位是毫秒
timeout server 30m #后端服务器最长空闲连接超时时长
mode http #使用7层网络协议
redirect scheme https if !{ ssl_fc } #把80端口的请求重向定443
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
balance leastconn #最小连接数负载均衡算法
maxconn 32768 #haproxy单个进程最大连接数
keepalive部署
keepalive.conf
每3秒钟运行一次check_haproxy.sh脚本检查haproxy是否运行中,若已停止则尝试拉起haproxy服务,启动失败则kill掉自己。
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_haproxy {
script "/app/haproxy/bin/check_haproxy.sh"
interval 3
weight 2
}
global_defs {
notification_email {
huangaj001@cmft.com
}
notification_email_from huangaj001@cmft.com
smtp_server mail.cmrh.com
smtp_connect_timeout 30
router_id gw
}
vrrp_instance VI_1 {
state BACKUP
interface br-ex
virtual_router_id 18
priority 100 #另一个节点=90
advert_int 3
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
100.75.1.18/24
}
track_script {
chk_haproxy
}
}
check_haproxy.sh
vim /app/haproxy/bin/check_haproxy.sh
#! /bin/bash
num=`ps -C haproxy --no-header |wc -l`
if [ $num -eq 0 ]; then
/app/haproxy/sbin/haproxy -f /app/haproxy/conf/haproxy.cfg
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ]; then
killall keepalived
fi
fi
测试
haproxy参数测试
测试项 | 说明 |
check inter 10s rise 3 fall 5 | 2000mscheck一次server,连续3次成功才算可用,连续5次失败算不可用 |
timeout client | 客户端最长空闲连接超时时长 |
功能测试
测试项 | 说明 |
keepalive高可用测试 | 能及时拉起未启动的haproxy服务 |
haproxy启动失败能转移VIP | |
keepalive再次启动不会抢占原VIP | |
|
|
haproxy https 转http测试 |
|
haproxy 负载均衡测试 | 压力测试观察2个gateway处理连接数是否达到负载均衡要求 |
down一个gateway观察是否出现http请求超时 |
压力测试
测试项 | 说明 |
大量客户端并发访问集群,多个桶,多个客户端同时访问 | 观察负载均衡情况 观察是否有请求超时 |
多种类型测试:小文件读/写,大文件读写 | 观察负载均衡情况 观察是否有请求超时 |