集群-------Haproxy

47 篇文章 0 订阅
21 篇文章 0 订阅


一、常见的Web集群调度器

目前常见的Web集群调度器分为软件和硬件
软件通常使用开源的LVS、Haproxy、Nginx
LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,高并发没有Haproxy好
硬件一般使用的比较多的是F5,也有很多人使用梭子鱼、绿盟等国内产品。

二、Haproxy简介

2.1 Haproxy 应用分析

LVS在企业应用中抗负载能力很强,但存在不足
LVS不支持正则处理,不能实现动静分离
对于大型网站,LVS的实施配置复杂,维护成功相对较高

Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件
适用于负载大的Web站点
运行在硬件上可支持数万计的并发连接的连接请求。

2.2 Haproxy的特性

  • 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美
  • 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s
  • 支持多达8 种负载均衡算法,同时也支持会话保持
  • 支持虚拟主机功能,从而实现web负载均衡更加灵活
  • 支持连接拒绝、全透明代理等独特功能
  • 拥有强大的ACL支持,用于访问控制
  • 其独特的弹性二叉树数据结构,使数据结构的复杂性上升到了0(1),即数据的查询速度不会随着数据条目的增加而速度有所下降
  • 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源量费,让多个请求在一个tcp连接中完成
  • 支持TCP加速,零复制功能,类似于mmap机制
  • 支持响应池(response buffering)
  • 支持RDP协议
  • 基于源的粘性,类似于nginx的ip_hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器
  • 更好统计数据接口,其web接口显示后端冀全中各个服务器的接受、发送、拒绝、错误等数据的统计信息
  • 详细的健康状态检测,web接口中有关对上流服务器的健康检测状态,并提供了一定的管理功能
  • 基于流量的健康评估机制
  • 基于http认证
  • 基于命令行的管理接口
  • 日志分析器,可对日志进行分析

三、Haproxy调度算法原理

Haproxy支持多种调度算法,最常用得有三种

  • RR (Round Robin) RR算法是最简单常用得一种算法,即轮询调度
  • LC(Least Connections) 最小连接数算法,根据后端得节点连接大小动态分配前端请求
  • SH(Source Hashing)
    基于来源访问调度算法,用于一些有Session会话记录在服务器端得创建,可以基于来源得IP、Cookie等做集群调度

四、nginx、lvs、haproxy有什么区别

nginx
①支持正则
②只支持基于端口的健康检查
③不支持session的直接保持、但能通过ip_hash来解决
④对网络稳定性要求不高
⑤反向代理能力强

lvs
①只能基于四层端口转发
②尽在四层做分发作用、扛负载能力强
③应用范围广

haproxy
①支持8种负载均衡策略
②仅作负载均衡软件使用、在高并发情况下性能优于nginx
③支持url检测、支持session保持

LVS
LVS: 是基于四层的转发,只能做端口的转发,基于URL、基于目录的转发LVS做不了

优点
抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率
工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived
流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响
应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等
缺点
软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/Haproxy+Keepalived的优势所在
如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/Haproxy+Keepalived就简单多了
LVS支持的调度算法
RR:Round Robin,轮询,较常用
WRR:Weighted RR,加权轮询,较常用
SH:Source Hashing,源地址散列调度算法
DH:Destination Hashing,目标地址散列调度算法
LC:least connections,最少连接,适用于长连接应用
WLC:Weighted LC,加权最少连接,默认调度算法,较常用
SED:Shortest Expection Delay,最短延迟调度
NQ:Never Queue,永不排队调度
LBLC:Locality-Based LC,基于局部性的最少链接
LBLCR:LBLC with Replication,带复制的基于局部性最少连接

Nginx
Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做四层和七层的转发

优点
工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行
Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能
Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来
可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS小
Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点
不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。LNMP也是近些年非常流行的Web架构,在高流量环境中稳定性也很好
可作为中层反向代理使用
可作为静态网页和图片服务器
缺点
适应范围较小,仅能支持http、https、Email协议
对后端服务器的健康检查,只支持通过端口检测,不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满
Nginx的Session的保持,Cookie的引导能力相对欠缺
Nginx支持的调度算法
rr,轮询,默认调度算法
wrr,加权轮询
ip_hash,源地址hash
least_conn,最少连接
hash KEY [consistent], 一致性hash算法

Haproxy
HAproxy: 是基于四层和七层的转发,是专业的代理服务器

优点
HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段)
HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态
HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种
缺点
不支持POP/SMTP协议
不支持SPDY协议
不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能
重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好
多进程模式支持不够好
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请求
总结
Haproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做,高并发场景选择LVS

像中小型公司的话并发量没那么大,选择Haproxy或者Nginx足已,由于Haproxy是专业的代理服务器,配置简单,功能丰富,类似于增强版的Nginx,所以中小型企业推荐使用Haproxy

对节点健康检查:Haproxy LVS都主动检查 Haproxy检查的方式更丰富 Nginx只能被动检查,通过转发请求是否失败来作为判断

就性能而言:LVS > Haproxy > Nginx;功能性和便利性:Nginx > Haproxy > LVS

五、Haproxy搭建 Web 群集

5.1 实验所需安装包

Haproxy、Nginx安装包
haproxy-1.5.19.tar.gz
nginx-1.12.0.tar.gz

5.2环境配置

主机 操作系统IP地址所需软件/安装包/工具
共享服务器CentOS7192.168.94.110
nginx web(1)CentOS7192.168.94.111
nginx web(2)CentOS7192.168.94.19
客户端CentOS7192.168.94.157

5.3haproxy共享服务器搭建

关闭防火墙、增强机制
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

在这里插入图片描述

安装关系依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

在这里插入图片描述

新建用户和组便于管理
useradd -M -s /sbin/nologin nginx

在这里插入图片描述

切换至opt目录,将下载好的压缩包传进来解压
cd /opt
tar -zxf nginx-1.19.2.tar.gz

在这里插入图片描述

切换至解压后的目录下编译
cd nginx-1.19.2
 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

在这里插入图片描述

安装
make && make install -j2
做软连接,让系统识别nginx的操作命令 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

在这里插入图片描述

将nginx命令加入服务
cd /lib/systemd/system
vim nginx.service
#!/bin.bash
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

在这里插入图片描述

创建站点目录
echo "this is Nginx1" > /usr/local/nginx/html/index.html 
如果用yum 安装的nginx
echo "this is Nginx 1 " > /usr/share/nginx/html/test.html

cat /usr/local/nginx/html/index.html

在这里插入图片描述

重新加载单元、启动服务
systemctl daemon-reload 
systemctl start nginx

在这里插入图片描述

netstat -anpt | grep nginx
http://192.168.94.111/

在这里插入图片描述
在这里插入图片描述

部署nginx服务器2(192.168.94.19)

闭防火墙、增强机制
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

在这里插入图片描述

安装关系依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

在这里插入图片描述

新建用户和组便于管理 
useradd -M -s /sbin/nologin nginx

在这里插入图片描述

切换至opt目录,将下载好的压缩包传进来解压
cd /opt
tar -zxf nginx-1.12.2.tar.gz

在这里插入图片描述

切换至解压后的目录下编译
cd nginx-1.12.2
 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

在这里插入图片描述

安装
make && make install -j2

在这里插入图片描述

将nginx命令加入服务 

cd /lib/systemd/system
vim nginx.service
#!/bin.bash
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

在这里插入图片描述

创建站点目录
echo "gui mie zhi ren" > /usr/local/nginx/html/index.html 
cat /usr/local/nginx/html/index.html

在这里插入图片描述

重新加载单元、启动服务 
systemctl daemon-reload 
systemctl start nginx

在这里插入图片描述

查看是否能成功启动 
ss -anpt | grep nginx
http://192.168.94.19/

在这里插入图片描述

部署haproxy服务器
关闭防火墙、增强机制,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
 
cd /opt
haproxy-1.5.19.tar.gz

在这里插入图片描述

安装依赖软件
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make

在这里插入图片描述

解压安装包,并切换至该软件包
tar zxf haproxy-1.5.19.tar.gz 
cd haproxy-1.5.19/

在这里插入图片描述

编译安装Haproxy
make TARGET=linux2628 ARCH=x86_64
make install
 
uname -r  #查看内核版本   如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
ARCH=x86_64 #系统位数,64位系统

在这里插入图片描述
在这里插入图片描述

Haproxy服务器配置 
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
 
cd /etc/haproxy/
vim haproxy.cfg
global
--4~5行--修改,配置日志记录,local0为日志设备,默认存放到系统日志
		log /dev/log   local0 info		
        log /dev/log   local0 notice
        #log loghost    local0 info
        maxconn 4096					#最大连接数,需考虑ulimit -n限制
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
        #chroot /usr/share/haproxy
        uid 99							#用户UID
        gid 99							#用户GID
        daemon							#守护进程模式
 
defaults        
		log     global					#定义日志为global配置中的日志定义
        mode    http					#模式为http
        option  httplog					#采用http日志格式记录日志
        option  dontlognull				#不记录健康检查日志信息
        retries 3						#检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
        redispatch						#当服务器负载很高时,自动结束当前队列处理比较久的连接
        maxconn 2000					#最大连接数
        contimeout      5000			#连接超时时间
        clitimeout      50000			#客户端超时时间
        srvtimeout      50000			#服务器超时时间
 
--删除下面所有listen项--,添加
listen  webcluster 0.0.0.0:80			#定义一个名为webcluster的应用
        option httpchk GET /index.html	#检查服务器的index.html文件
        balance roundrobin				#负载均衡调度算法使用轮询算法roundrobin
        server inst1 192.168.137.15:80 check inter 2000 fall 3		#定义在线节点
        server inst2 192.168.137.20:80 check inter 2000 fall 3
 
 
balance roundrobin #负载均衡调度算法
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hash
 
check inter 2000 #表示haproxy服务器和节点之间的一个心跳频率
fall3 #表示连续三次检测不到心跳频率则认为该节点失效
若节点配置后带有“backup”表示该节点只是个备份节点,只有主节点失效该节点才会上。不携带“backup”,表示为主节点,和其它主节点共同提供服务。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加haproxy系统服务
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
cd /etc/init.d/
chmod +x haproxy 
chkconfig --add /etc/init.d/haproxy 
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start

在这里插入图片描述
在客户端进行测试
修改客户机网段
在这里插入图片描述
在这里插入图片描述

六、Haproxy集群日志重新定义

默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。

需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。

vim /etc/haproxy/haproxy.cfg
global
	log /dev/log local0 info
	log /dev/log local0 notice
 
service haproxy restart
 
#需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
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的访问请求日志信息
配置完之后重启 systemctl restart rsyslog.service之后出现haproxy-info.log 

再次重启haproxy服务之后出现 haproxy-notice.log

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞什么滚去学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值