目前常见的Web集群调度器分为软件和硬件
软件通常使用开源的LVS、Haproxy、Nginx
LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,高并发没有Haproxy好
LVS在企业应用中抗负载能力很强,但存在不足
Haproxy是一款可提供高可用性、负载均衡、及基于TCP(四层代理)和HTTP(七层代理)应用的代理的软件
方法名 | 说明 |
---|---|
RR (Round Robin) | RR算法是最简单常用的一种算法,即轮询调度 |
LC(Least Connections) | 最小连接数算法,根据后端的节点连接数大小动态分配前端请求。 |
SH(Source Hashing) | 基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度 |
2、HAProxy负载均衡策略(8种)
HAProxy负载均衡策略 | 说明 |
---|---|
roundrobin | 表示轮询 |
static-rr | 表示加权轮询 |
leastconn | 表示最小连接数 |
source | 表示根据源地址哈希 |
uri | 表示根据URL哈希 |
url_param | 表示根据URL参数哈希 |
har(name) | 表示根据HTTP请求头哈希 |
rdp-cookie(name) | 表示根据cookie(name)哈希 |
负载均衡性能:
支持的代理类型:
支持的健康检查方式:
环境准备 Haproxy服务器 192.168.80.10
Nginx 服务器1 192.168.80.100
Nginx 服务器2 192.168.80.101
客户端 192.168.80.200
(1)关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0
haproxy-1.5.19.tar.gz
(2)安装 Haproxy
编译安装
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
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
或
yum安装
yum insttall -y haproxy
cd /etc/haproxy
ls
vim haproxy.cfg
————HAProxy 的配置文件共有5个域————
●global: 用于配置全局参数
●default:用于配置所有frontend和backend的默认属性
●frontend: 用于配置前端服务(即HAProxy自身提供的服务)实例
●listen: frontend + backend的组合配置,可以理解成更简洁的配置方法,front end域和backend域中所有的配置都可以配置在listen域下
(3)Haproxy服务器配置
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global
--4~5行--修改,配置日志记录,local0为日志设备,默认存放到系统日志
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
chroot /var/lib/haproxy #修改haproxy工作目录至指定目录,一般需将此行注释掉
pidfile /var/run/haproxy.pid
maxconn 4000 #最大连接数,HAProxy 要求系统的 ulimit -n 参数大于 maxconn*2+18
user haproxy #以指定的用户名身份运行haproxy进程
group haproxy #以指定的组名运行haproxy,以免因权限问题带来风险
daemon #守护进程模式
spread-checks 2 #在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;默认为0,官方建议设置为2到5之间。
defaults(此字段中配置信息一般不用更改,只需注意个别细节)
mode http #模式为http(7层代理http,4层代理tcp)
log global #定义日志为global配置中的日志定义
option httplog #开启httplog,在日志中记录http请求、session信息等。http模式时开启httplog,tcp模式时开启tcplog
option dontlognull #不在日志中记录空连接
option http-keep-alive
option forwardfor except 127.0.0.0/8 #记录客户端IP在X-Forwarded-For头域中,haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段
option redispatch #当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上
retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后会将对应后端服务器标记为不可用
timeout http-request 10s #默认http请求超时时间,此为等待客户端发送完整请求的最大时长,用于避免类DoS攻击。haproxy总是要求一次请求或响应全部发送完成后才会处理、转发
timeout queue 1m #默认客户端请求在队列中的最大时长
timeout connect 10s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接,新版本中替代clitimeout
timeout server 1m #默认和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是高并发时,新版本中替代srvtimeout
timeout http-keep-alive 10s #默认和客户端保持长连接的最大时长。优先级高于timeout http-request 也高于timeout client
timeout check 10s #和后端服务器成功建立连接后到最终完成检查的最大时长(不包括建立连接的时间,只是读取到检查结果的时长)
maxconn 3000 #最大连接数
frontend http-in #定义前端域
bind *:80 #设置监听地址和端口,指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址
acl url_static path_beg -i /static /images/javascript /stylesheets #定义ACL,当uri以定义的路径开头时,ACL[url_static]为true
acl url_static path_end -i -i .jpg .gif .png .css .js #定义ACL,当uri以定义的路径结尾时,ACL[url_static]为true
use_backend static_backend if url_static #当[url_static]为true时,定向到后端域static_backend中
default_backend dynamic_backend #其他情况时,定向到后端域dynamic_backend中
backend static_backend #定义后端域static_backend
balance roundrobin #使用轮询算法
option httpchk GET /test.html #表示基于http协议来做健康状况检查,只有返回状态码为2xx或3xx的才认为是健康的,其余所有状态码都认为不健康。不设置该选项时,默认采用tcp做健康检查,只要能建立tcp就表示健康。
server inst1 192.168.92.12:80 check inter 2000 rise 2 fall 3
server inst2 192.168.92.13:80 check inter 2000 rise 2 fall 3 #inter 2000 rise 2 fall 3是默认值,可以省略
backend dynamic_backend #定义后端域dynamic_backend
balance roundrobin
option http-server-close
cookie HA_STIKY_dy insert indirect nocache
server app1 192.168.92.12:8080 cookie appser1 check
server app2 192.168.92.13:8080 cookie appser2 check
listen stats #定义监控页面
bind *:1080 #绑定端口1080
stats enable #启用统计报告监控
stats refresh 30s #每30秒更新监控数据
stats uri /stats #访问监控页面的uri
stats realm HAProxy\ Stats #监控页面的认证提示
stats auth admin:admin #监控页面的用户名和密码
--删除下面所有listen项--,添加
listen webcluster 0.0.0.0:80 #定义一个名为webcluster的应用
option httpchk GET /test.html #检查服务器的test.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.80.100:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.80.101:80 check inter 2000 fall 3
---------------------参数说明---------------------------------------------------------------------------
balance roundrobin #负载均衡调度算法
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hash
check inter 2000 #表示haproxy服务器和节点之间的一个心跳频率
fall 3 #表示连续三次检测不到心跳频率则认为该节点失效
若节点配置后带有“backup”表示该节点只是个备份节点,只有主节点失效该节点才会上。不携带“backup”,表示为主节点,和其它主节点共同提供服务。
(4)添加haproxy 系统服务
cp /opt/haproxy-1.5.19/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
systemctl stop firewalld
setenforce 0
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
make && make install
--192.168.80.100---
echo "this is kgc web" > /usr/local/nginx/html/test.html
--192.168.80.101---
echo "this is benet web" > /usr/local/nginx/html/test.html
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx #启动nginx 服务
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
说明:
这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息
maxconn | 最大连接数,根据应用实际情况进行调整,推荐使用10 240 |
---|---|
daemon | 守护进程模式,Haproxy可以使用非守护进程模式启动,建议使用守护进程模式启动 |
nbprod | 负载均衡的并发进程数,建议与当前服务器CPU核数相等或为其2倍 |
retries | 重试次数,主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次 |
option http-server-close | 主动关闭http请求选项,建议在生产环境中使用此选项 |
timeout http-keep-alive | 长连接超时时间,设置长连接超时时间,可以设置为10s |
timeout http-request | http请求超时时间,建议将此时间设置为5~10s,增加http连接释放速度 |
timeout client | 客户端超时时间,如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右 |