Haproxy负载均衡集群
Haproxy概论
常用的负载均衡调度器
- 软件
通常使用开源的LVS、Haproxy、 Nginx
LVS性能最好,但是搭建相对复杂;Nginx 的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有Haproxy好。
- 硬件
一般使用比较多的是F5、Array,也有很多人使用国内的一些产品,如梭子鱼、绿盟等硬件
硬件的效果比软件好,更加稳定,但管理成本高。
Haproxy的特性
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
- 支持多达8种负载均衡算法
- 支持Session会话保持,Cookie的引导;
- 支持通过获取指定的url来检测后端服务器的状态;
- 支持虚机主机功能,从而实现web负载均衡更加灵活;
- 支持连接拒绝、全透明代理等独特的功能;
- 拥有强大的ACL支持,用于访问控制;
- 支持TCP和HTTP协议的负载均衡转发;
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
HAProxy调度算法
策略 | 方法 |
---|---|
roundrobin | 轮询 |
static-rr | 加权轮询 |
leastconn | 最小连接 |
source | 根据源地址做哈希 |
uri | 根据请求的URI地址做哈希 |
url_param | 根据请求的URL路径里传递的参数做哈希 |
hdr(NAME) | 根据请求头的字段做哈希 |
rdp-cookie(NAME) | 根据cookie里的字段做哈希 |
LVS、Nginx、HAproxy的区别
- LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
- HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡;
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。
Haproy负载均衡部署
实验需求
利用Haproxy的运用配置出负载均衡调度器,以此来调用两台Nginx服务器进行工作
- 准备
需要五台虚拟机(一台web1服务器,一台web2服务器,一台HAproxy负载均衡调度器,一台NFS共享存储机,一台外网客户机做测试作用) - 实验拓扑图
- 各设备的IP设置如下:
负载调度器:10.190.33.71
Web服务器1:10.190.33.72
Web服务器2:10.190.33.73
NFS服务器:10.190.33.74
客户端:10.190.33.88
部署共享存储
准备工作
hostnamectl set-hostname nfs-server
systemctl disable firewalld.service --now
vim /etc/selinux/config
将“SELINUX=enforcing”修改成“SELINUX=0”
reboot
安装nfs服务器必要软件及配置
yum -y install nfs-utils rpcbind
mkdir /share/wang /share/lei -p
echo '<h2>Here is <h1>WANG</h1></h2>' > /share/wang/test.html
echo '<h2>Here is <h1>LEI</h1></h2>' > /share/lei/test.html
ll -R /share
vim /etc/exports
/share/wang 10.190.33.0/24(ro)
/share/lei 10.190.33.0/24(ro)
检查nfs服务
systemctl enable --now rpcbind nfs
showmount -e
配置节点服务器(server2的步骤与serve1基本相同,故本文以server1举例)
准备工作
hostnamectl set-hostname nginx-server1
systemctl disable firewalld.service --now
vim /etc/selinux/config
将“SELINUX=enforcing”修改成“SELINUX=0”
reboot
配置节点web服务–nginx
yum安装Nginx需要独立的“repo”文件
yum install -y nginx
yum -y install nfs rpcbind
vim /etc/nginx/nginx.conf
······
keepalive_timeout 0;
systemctl enable --now rpcbind nfs
vim /etc/fstab
10.190.33.74:/share/wang/usr/share/nginx/html/ nfs defaults 0 0
mount -a
ll /usr/share/nginx/html/
cat /usr/share/nginx/html/test.html
systemctl start nginx
使用客户端检查web服务是否启动及运行正常
部署haproxy负载均衡调度器
准备工作
hostnamectl set-hostname haproxy-server
systemctl disable firewalld.service --now
vim /etc/selinux/config
将“SELINUX=enforcing”修改成“SELINUX=0”
reboot
编译安装haproxy
yum install -y zlib-devel openssl-devel pcre-devel systemd-devel
useradd -M -s /sbin/nologin haproxy
cd /opt
tar xf haproxy-2.8.3.tar.gz
cd haproxy-2.8.3/
make TARGET=linux31 USE_OPENSSL=1 ADDLIB=-lz
make install PREFIX=/usr/local/haproxy
添加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=/etc/haproxy/$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
haproxy -c -f haproxy.cfg
service haproxy start 或 /etc/init.d/haproxy start