Haproxy 搭建 web 集群

Haproxy 搭建 web 集群

一: Haproxy 概述

1.1 Haproxy 的作用

  • Haproxy是可以提供高可用,负载均衡,以及基于TCP 和HTTP 应用的代理,是免费、快速并且可靠的一种解决方案。
  • Haproxy 非常适用于并发大(并发1w 以上) web 站点。这些站点通常又需要会话保持或7层处理。
  • Haproxy的运行模式使得它可以很简单安全的整合至当前的架构中。同时可以保护web服务器不暴露到网络上。

1.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认证;
  • 基于命令行的管理接口;
  • 日志分析器,可对日志进行分析。

1.3 常见的web 集群调度器

目前常见的web集群调度器分为软件和硬件

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

1.4 Haproxy应用分析

  • LVS在企业应用中抗负载能力很强,但存在不足

    • LVS不支持正则处理,不能实现动静分离

    • 对于大型网站,LVS的实施配置复杂,维护成本相对较高

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


1.5 Haproxy 的调度算法

HAProxy负载均衡策略非常多,常见的有如下8种:

  1. roundrdbin,表示简单的轮询
  2. static-rr,表示根据权重
  3. leastconn,表示最少连接者先处理
  4. source,表示根据请求源IP
  5. uri,表示根据请求的URI,做cdn需使用;
  6. url param,表示根据请求的URl参数' balance url param’ requires an URL parameter name
  7. hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
  8. rdp-cookie (name),表示根据据cookie (name)来锁定并哈希每一次TCP请求.

1.6 Nginx ,LVS ,Haproxy 各自的优点与缺点

1.6.1 Nginx 优缺点

  • Nginx的优点:
    工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构。Nginx正则规则比HAProxy更为强大和灵活。
  • Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,LVS对网络稳定性依赖比较大,稳定要求相对更高。
  • Nginx安装和配置、测试比较简单、方便,有清晰的日志用于排查和管理,LVS的配置、测试就要花比较长的时间了。
  • 正则表达式比Haproxy 强大
  • 可以承担高负载压力且稳定,一般能支撑几万次的并发量,负载度比LVS相对小些。
  • Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等。
  • Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。
  • Nginx作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,很多场景下都将其作为反向代理加速器。
  • Nginx作为静态网页和图片服务器,这方面的性能非常优秀,同时第三方模块也很多。

Nginx的缺点:

  • Nginx 7层代理仅能支持http、https和Email协议,这样就在适用范围上面小些。
  • 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
  • 不支持Session的直接保持,需要通过ip_hash和cookie的引导来解决。

1.6.2 LVS优缺点

LVS的优点:

  • 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
  • LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案。
  • 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
  • 应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等。

LVS的缺点:

  • 软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势。
  • 如果是网站应用比较庞大的话,LVS-DR+Keepalived实施起来就比较复杂了。相对来说,Nginx-HAProxy+Keepalived就简单多了。

1.6.3 Haproxy优缺点

HAProxy的优点:

  • HAProxy也是支持虚拟主机的。
  • HAProxy支持8种负载均衡策略。
  • HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态。
  • HAProxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
  • HAProxy支持TCP协议的负载均衡转发。

Haproxy缺点

  • 不支持POP/SMTP协议
  • 不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
  • 重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
  • 多进程模式支持不够好
  • 日志依赖于syslogd

1.7 Nginx ,LVS,Haproxy 的对比

Nginx LVS Haproxy
性能 一般 最好 稍好
转发 支持 4层 ,7层转发。4层需要开启stream 模块 只支持4层转发 支持 4层7层
对节点的健康检查 被动检查,检查功能比较差 主动检查,检查功能弱于Haproxy 主动检查,检查功能最强
是否支持正则 支持 ,且正则表达式丰富 不支持正则 支持正则,但是弱于nginx
负载均衡策略 一共有6种 一共有 10种 一共有8种
负载均衡功能应用 7 层代理只能支持 http,https,mail 协议,应用面小 应用面广,几乎可以为所有的应用提供负载均衡 还能对mysql 进行负载均衡,应用强于nginx 但是比LVS 不足


二:使用Haproxy 搭建web 集群

2.1 拓扑

Haproxy 服务器 : 192.168.23.103

nginx 服务器 : 192.168.23.12 ; 192.168.23.13

客户端: 192.168.23.104

image-20210823204240939



2.2 搭建Haproxy 服务器

2.2 .1 编译安装 Haproxy

将软件包 haproxy-1.5.19.tar.gz 上传到 /opt/ 目录下

systemctl stop firewalld
setenforce  0

yum -y install pcre-devel bzip2-devel gcc gcc-c++ make
tar  zxvf /opt/haproxy-1.5.19.tar.gz

cd  /opt/haproxy-1.5.19/

uname -r     #查看内核版本
# 3.10.0-693.el7.x86_64

make  TARGET=linux2628  ARCH=x86_64   &&  make install 
#TARGET=linux2826,  内核版本。
#如果内核版本是 2.6.18-371.e15,使用TARGET=linux26
#如果内核版本是 2.6.28 以上版本,则使用TARGET=linux2628
#ARCH=x86_64     ,系统是 x86架构64位系统



2.2.2 Haproxy 服务器配置

全局配置

mkdir  /etc/haproxy
cp  /opt/haproxy-1.5.19/examples/haproxy.cfg  /etc/haproxy/haproxy.cfg

vim  /etc/haproxy/haproxy.cfg 
global
        log /dev/log    local0 info
        log /dev/log    local0 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        nbproc 1
        #debug
        #quiet

image-20210823211058149



配置默认参数

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        #contimeout     5000
        #clitimeout     50000
        #srvtimeout     50000
        timeout http-request 10s
        timeout queue 1m
        timeout connect 10s
        timeout client 1m
        timeout server 1m
        timeout http-keep-alive 10s
        timeout check 10s

image-20210823212208435



设置listen 项

listen  webcluster 0.0.0.0:80
        #option httpchk GET /test.html  如果要监控网页就加上这一行。当加上这一配置后,节点服务器必须有该网页文件,且网站可以访问
        balance roundrobin
        server  inst1 192.168.23.12:80 check inter 2000 fall 3
        server  inst2 192.168.23.13:80 check inter 2000 fall 3

image-20210823233501222



2.2.3 添加 Haproxy 到系统服务

cp /opt/haproxy-1.5.19/examples/haproxy.init  /etc/init.d/haproxy

vim /etc/init.d/haproxy 
[ "${NETWORKING}" = "no" ] && exit 0   #将第26 行的 [ ${NETWORKING} = "no" ]  的变量加上双引号


chmod  +x /etc/init.d/haproxy
chkconfig  --add  /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy  /usr/sbin/haproxy  #Haproxy的启动脚本定义了,要在/usr/sbin/目录下有haproxy文件

netstat -natp  | grep :80    #haproxy 使用tcp 80 端口。查看是否有服务占用

systemctl start haproxy 
netstat -natp | grep :80



2.3 搭建节点服务器

两台节点服务器一起

systemctl stop firewalld
setenforce  0

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum makecache 

yum  -y install nginx

192.168.23.12 编写网页文件

cd  /usr/share/nginx/html/
echo "this is mynet  web " > index.html
echo "this is mynet test web " > test.html

systemctl start nginx
netstat -natp | grep :80

image-20210823222545805



192.168.23.13 编写网页文件

cd  /usr/share/nginx/html/
echo "this is benet  web " > index.html
echo "this is benet test web " > test.html

systemctl start nginx
netstat -natp | grep :80

2.4 haproxy 查看 集群状态

haproxy

systemctl restart haproxy   #此时,再重启可以了
systemctl status haproxy   #查看状态

image-20210823223324692



将192.168.23.12 服务器的nginx 服务停止

systemctl stop nginx

再次在haproxy 服务器上查看状态

systemctl  status haproxy 

image-20210823223629903



在hapoxy 上查看系统日志

vim /var/log/messages   #查看最后的信息

image-20210823223833532



2.5 客户端访问测试

将192.168.23.12 服务器nginx 服务启动

systemctl restart nginx 

客户端 192.168.23.104 访问 haproxy 服务器

  curl http://192.168.23.103
  curl http://192.168.23.103
  curl http://192.168.23.103/test.html
  curl http://192.168.23.103/test.html

image-20210823232154438



2.6 haproxy 的配置文件项整体说明

-----------  全局配置 主要用来定义全局参数,用于进程级的配置,通常和操作系统配置有关------- 
global
        log /dev/log    local0 info  #定义Haproxy 的日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
        log /dev/log    local0 notice
        #log loghost    local0 info
        maxconn 4096                #最大连接数,需考虑ulimit-n限制
        #chroot /usr/share/haproxy    #chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
        uid 99                    #用户uid ,此uid 在/etc/passwd 中为nobody 用户
        gid 99                    #用户gid
        daemon                    #守护进程模式
        nbproc 1                 #设置并发进程数,建议设置为当前服务器cpu核数相当或者2倍
        #debug
        #quiet

------ 配置默认参数,这些参数可以被用到Listen,frontend,backend组件---
defaults
				log     global					#定义日志为global配置中的日志定义
				mode    http					#模式为http
				option  httplog					#采用http日志格式记录日志
				option  dontlognull				#不记录健康检查日志信息
				retries 3						#检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
				redispatch						#当服务器负载很高时,自动结束当前队列处理比较久的连接
				maxconn 2000					#最大连接数,defaults 中的值不可以超过gloab 中的定义
				#contimeout      5000			  #连接超时时间 单位是毫秒
				#clitimeout      50000			#客户端超时时间
				#srvtimeout      50000			#服务器超时时间
        timeout http-request 10s     #默认http 请求超时时间
        timeout queue 1m              #默认队列超时时间
        timeout connect 10s           #默认连接超时时间,版本中替代contimeout,可以向后兼容
        timeout client 1m             #默认客户端超时时间,新版本中替代clitimeout,可以向后兼容
        timeout server 1m             #默认服务器超时时间,新版本中替代srvtimeout,可以向后兼容
        timeout http-keep-alive 10s   #默认持久连接超时时间
        timeout check 10s              #设置心跳检查超时时间


------- haproxy 实例  状态监控 部分配置 -------
listen  webcluster 0.0.0.0:80              #定义一个名为webcluster 的应用
        option httpchk GET /test.html     #检查服务器的test.html文件
        balance roundrobin                 #负载均衡调度算法使用轮询算法roundrobin
        server  inst1 192.168.23.12:80 check inter 2000 fall 3   #定义在线节点
        server  inst2 192.168.23.13:80 check inter 2000 fall 3
# check inter 2000 监控检查间隔时间为2000毫秒
#fall 3   连续3次检测不到该节点,认为该节点失效
#如果节点 后面有 “backup ”,表示该节点只是个备份节点,仅在所有在线节点都失效后才启用该节点


listen stats 0.0.0.0:1080   								#监听端口
   		 stats refresh 30s   									#统计页面自动刷新时间
 		   stats uri /stats  										#统计页面url
   		 stats realm Haproxy Manager 					#进入管理解面查看状态信息
  		 stats auth admin:admin 						 	#统计页面用户名和密码设置
			#stats hide-version 									##隐藏统计页面上HAProxy的版本信息

### 删除后续多余的配置####


三: 配置Haproxy 的监控页面与 Haproxy 的日志自定义


3.1 配置Haproxy 的监控页面

3.1.1 修改Haproxy 的配置文件

vim /etc/haproxy/haproxy.cfg
#在配置文件最后再加上一个 listen 
listen stats 0.0.0.0:1080             #监听端口
    stats refresh 30s                  #统计页面自动刷新时间
    stats uri /stats                  #统计页面url
    stats realm Haproxy Manager        #进入管理解面查看状态信息
    stats auth admin:admin              #统计页面用户名和密码设置
    #stats hide-version               ##隐藏统计页面上HAProxy的版本信息

image-20210824001616162



3.1.2 重启服务,访问测试

systemctl restart haproxy 
firefox http://192.168.23.103:1080/stats

image-20210824001905615

image-20210824002248114


备注:

Queue队列数据的信息(当前队列数量,最大值,队列限制数量);

Session rate每秒会话率(当前值,最大值,限制数量);

Sessions总会话量(当前值,最大值,总量,Lbtot: total number of times a server was selected选中一台服务器所用的总时间);

Bytes(入站、出站流量);

Denied(拒绝请求、拒绝回应);

Errors(错误请求、错误连接、错误回应);

Warnings(重新尝试警告retry、重新连接redispatches);

Server (状态、最后检查的时间(多久前执行的最后一次检查)、权重、备份服务器数量、down机服务器数量、down机时长)



3.2 Haproxy 日志自定义

默认haproxy 的日志是输出到 系统的系统日志中,使用不是非常方便。为了更好的管理haproxy的日志,可以将haproxy的日志单独定义出来。需要修改 rsyslog 配置,为了方便管理,将haproxy 相关的配置独立定义到haproxy.conf中,并放到/etc/rsyslog.d/下,rsyslog启动时,会自动加载此目录下的所有配置文件


3.2.1 修改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下,将haproxy 的notice 日志记录到 /var/log/haproxy/haproxy-notice.log
# " &~ " 表示当日志写入到 日志文件后,rsyslog 停止处理这个信息

3.2.2 重启服务,并查看目录下的文件

systemctl restart rsyslog.service 
systemctl restart haproxy

#haproxy 目录自动生成,并且目录下有haproxy-info.log  haproxy-notice.log 文件
ls /var/log/haproxy/      
#haproxy-info.log  haproxy-notice.log

image-20210824004329277


3.2.3 动态跟踪日志,并客户端访问

tail -f /var/log/haproxy/haproxy-info.log   #动态查看haproxy 的访问请求日志信息

同时,客户端访问 负载均衡器 192.168.23.103

image-20210824004742846


Haproxy 报错解决

做了日志自定义的应该去自定义日志的 info 日志查看。没有做的直接再 /var/log/messages 查看

报错一:

报错信息

将haproxy 加入到 系统服务中后,使用 systemctl status haproxy 时,有/etc/rc.d/init.d/haproxy: 第 26 行:[: =: 期待一元表达式 报错‘

img


原因:

查看 /etc/rc.d/init.d/haproxy 发现第26 行是 [ ${NETWORKING} = "no" ] && exit 0,这个报错,是应为中括号里的比较 ,左边缺少参数


解决

修改文件 /etc/rc.d/haproxy 的第 26 行,给变量加上 双引号,然后执行 systemctl daemon-reload

img



报错二:

报错信息

启动haproxy 时,报错。查看系统日志信息,报错 Proxy stats started. 代理服务器系统状态 是 启动的

image-20210824010539722


原因

显示 Proxy stats started ,表示当前服务是启动的,这是 因为 haproxy 的端口被占用当前haproxy 使用的80端口被占用


解决

方法一:

使用 ss -natp | grep :80 查看哪个服务占用的80 端口,然后停止服务.(当前 httpd 服务占用,如果不重要,可以停止)

image-20210824011142208


方法二:

修改配置文件中的 haproxy 的监听端口修改为 非 80 端口 (不建议,haproxy 本身就多用来对外提供web服务)

image-20210824011559897

posted @ 2021-08-24 08:37  知己一语  阅读(668)  评论(0编辑  收藏  举报