• 47Haproxy集群


    Haproxy集群

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

    拓展:常见的Web集群调度器分为软件和硬件
    软件通常使用开源的LVS、Haproxy、Nginx
    硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟、深信服、360等。

    Haproxy应用分析

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

    Haproxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理
    适用于负载大的Web站点
    运行在硬件上可支持数以万计的并发连接的连接请求

    Haproxy常用调度算法

    Haproxy支持多种调度算法,最常用的有:

    1. RR(Round Robin)表示简单的轮询
      RR算法是最简单最常用的一种算法,即轮询调度。轮询分配访问请求实现负载均衡效果。
    2. LC (Least Connections)
      最小连接数算法,根据后端的节点连接数大小动态分配前端请求。此算法相比较算法有很大改进,是目前用到比较多的一种算法。
    3. SH (Source Hashing)
      基于来源访问调度算法,用于一些有Sessions会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度。此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡部分节点访问量超大,影响业务使用。
    4. static-rr,表示根据权重
    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请求。

    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认证

    • 基于命令行的管理接口

    • 日志分析器,可对日志进行分析

    LVS、Nginx、HAproxy的区别

    1. LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
    2. LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
    3. LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
    4. HAProxy功能强大,但整体性能低于4层模式的LVS负载均衡。
    5. Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。

    Haproxy搭建Web群集

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QrvZAwP-1659918794437)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803112155810.png)]

    Haproxy调度器部署

    1.关闭防火墙,增强机制
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    2.上传软件包到/opt下,并解压
    tar -xf haproxy-1.5.19.tar.gz
    3. 安装依赖包
    yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
    4.编译安装
    cd haproxy-1.5.18/
    make TARGET=linux2628 ARCH=x86_64
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    #使用uname -r查看内核,kernel大于2.6.28用TARGET=linux2628,下于的用TARGET=linux26
    ARCH=x86_64 #系统位数,64位系统

    5.配置Haproxy
    mkdir /etc/haproxy
    cp examples/haproxy.cfg /etc/haproxy/  #将配置文件拷贝到etc/haproxy下
    cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak  #备份
    vim /etc/haproxy/haproxy.cfg
    全局配置,主要用于定义全局参数,属于进程级的配置
    global  
    log /dev/log    local0 info 	#local0为日志设备,默认存放到系统日志
    log /dev/log    local1 notice  
    #log loghost    local0 info
    maxconn 4096	 #最大连接数,需考虑ulimit -n限制,推荐使用10240
    --8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
    #chroot /usr/share/haproxy     
    uid 99     #用户UID
    gid 99     #用户GID
    daemon     #守护进程模式
    nbproc 1   #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
    配置默认参数,这些参数可以被用到Listen,frontend,backend组件
    defaults    
    log     global   #引入global定义的日志格式
    mode    http 	#模式为http
    option  httplog  #日志类别为http日志格式
    option  dontlognull  #不记录健康检查日志信息
    retries 3   #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
    redispatch 	 #当服务器负载很高时,自动结束当前队列处理比较久的连接
    maxconn 2000	#最大连接数,“defaults”中的值不能超过“global”段中的定义
    #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	#设置心跳检查超时时间
    删除下面所有listen项,添加如下内容
    listen  webcluster 0.0.0.0:80	 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
    option httpchk GET /test.html	 #检查服务器的test.html文件
    balance roundrobin    #负载均衡调度算法使用轮询算法
    定义在线节点
    server inst1 192.168.74.129:80 check inter 2000 fall 3  
    server inst1 192.168.74.130:80 check inter 2000 fall 3  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    轮询算法:roundrobin;
    最小连接数算法:leastconn;
    来源访问调度算法:source;类似于nginx的ip_hash

    #check inter 2000 表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒
    #fall 3 表示连续三次检测不到心跳频率则认为该节点失效
    #若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。

    6.添加系统服务
    cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
    chmod +x /etc/init.d/haproxy
    chkconfig --add /etc/init.d/haproxy
    ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #创建软连接
    systemctl start haproxy #启动服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Nginx节点服务器部署

    #关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    #安装nginx服务
    rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    yum -y install nginx
    cd /usr/share/nginx/html/
    web1
    echo "this is syw server " >/usr/share/nginx/html/test.html
    web2
    echo "this is xjw " >/usr/share/nginx/html/test.html
    #启动服务
    systemctl start nginx
    #编辑测试文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试:在客户端浏览器输入192.168.74.128、test.html

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnknVLs8-1659918794438)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803153757312.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBpp2Qv3-1659918794439)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803153810232.png)]

    日志重新定义

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

    vim /etc/haproxy/haproxy.cfg
    #更改日志文件
    global
    	log /dev/log local0 info
    	log /dev/log local0 notice
    #重启haproxy服务
    service haproxy restart
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    需要修改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
    查看haproxy的访问请求日志信息
    访问网页后查看日志
    tail -f /var/log/haproxy/haproxy.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    使用网页访问192.168.48.10,则会产生对应的日志文件,查看/var/log/haproxy/haproxy-info.log。停止掉某个节点服务器,然后再刷新页面,开启节点服务器,则会产生haproxy-notice.log。

    temctl restart rsyslog.service
    查看haproxy的访问请求日志信息
    访问网页后查看日志
    tail -f /var/log/haproxy/haproxy.log

    
    使用网页访问192.168.48.10,则会产生对应的日志文件,查看/var/log/haproxy/haproxy-info.log。停止掉某个节点服务器,然后再刷新页面,开启节点服务器,则会产生haproxy-notice.log。
    
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hy0J5Mr-1659918794440)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803160951605.png)]
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    sql一些常用的函数--decode,case when ,nvl
    Java 获取远程excel内容-修改excel内容
    尚硅谷Vue系列教程学习笔记(6)
    PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
    axios发送常见请求方式以及拦截器的封装
    WebRTC点对点通讯建立连接的流程
    JAVA并发编程--4.3理解CountDownLatch
    腾讯不被看好?Prosus宣布减持股份,中国科技公司路在何方?
    神经网络入门书籍推荐,神经网络的书籍推荐
    Linux下vscode终端无法显示和输入
  • 原文地址:https://blog.csdn.net/qq_49124206/article/details/126220662