Bootstrap

使用HAproxy搭建web群集原来这么简单(宇宙真的好谦虚啊,明明拥有一切,却叫太空)

目录

前言

一、常见的Web集群调度器

二、Haproxy应用分析

三、Haproxy调度算法原理

3.1 RR(round robin)轮询调度

3.2 LC(Least Connections)最小连接数算法

3.3 SH(Source Hashing)基于来源访问调度算法

四、HAProxy的主要特性

五、LVS、Nginx、HAproxy的区别

六、配置文件详解

七、部署负载均衡web群集

7.1 nginx节点服务器(两台相同)

7.2 haproxy服务器配置

7.3 添加haproxy系统服务

7.4 客户端测试

 八、Haproxy集群日志定义


前言

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

一、常见的Web集群调度器

  • 目前常见的Web集群调度器分为软件和硬件
  • 软件通常使用开源的LVS、Haproxy、Nginx

LVS性能最好(基于内核转发),但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy好。

LVS>HAproxy>nginx

  • 硬件一般使用比较多的是F5(最多)、Array,也有很多人使用国内的一些产品,如梭子鱼、绿盟等

不在乎成本的公司会选择用硬件,更多的是采用软件

二、Haproxy应用分析

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

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

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

一般在上百台群集中使用

  • Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件

适用于负载大的Web站点

运行在硬件上可支持数以万计的并发连接的连接请求

三、Haproxy调度算法原理

3.1 RR(round robin)轮询调度

  1. 有三个节点A、B、C
  2. 第一个用户访问会被指派到节点A
  3. 第二个用户访问会被指派到节点B
  4. 第三个用户访问会被指派到节点C
  5. 第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

3.2 LC(Least Connections)最小连接数算法

根据后端的节点连接数大小动态分配前端请求

  1. 有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6
  2. 第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5C:6
  3. 第二个用户请求会继续分配到A上,连接数变为A:6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端
  4. 由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况;此算法相比较rr算法有很大改进,是目前用到比较多的一种算法

3.3 SH(Source Hashing)基于来源访问调度算法

用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度

  1. 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B
  2. 当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度
  3. 此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

主要用的就是以上三个,还要一些可以了解一下

(1)roundrobin,表示简单的轮询

(2)static-rr,表示根据权重

(3)1eastconn,表示最少连接者先处理

(4)source,表示根据请求源IP

(5)uri,表示根据请求的URI,做cdn需使用;

(6)url param,表示根据请求的UR1参数balance url param'requires an URI parameter name

(7)hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

(8)rdp-cookie(name),表示根据cookie(name)来锁定并哈希每一次TCp请求。

四、HAProxy的主要特性

  1. 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
  2. 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
  3. 支持多达8种负载均衡算法
  4. 支持session会话保持,Cookie的引导;·支持通过获取指定的ur1来检测后端服务器的状态;
  5. 支持虚机主机功能,从而实现web负载均衡更加灵活;
  6. 支持连接拒绝、全透明代理等独特的功能;
  7. 拥有强大的ACL支持,用于访问控制;
  8. 支持TCP协议的负载均衡转发;
  9. 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成

五、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模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。

六、配置文件详解

haproxy.cfg为haproxy的配置文件

global  #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
  log /dev/log   local0 info  #修改
        log /dev/log   local0 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倍

        defaults    #配置默认参数,这些参数可以被用到Listen,frontend,backend组件     
        log     global   #引入global定义的日志格式
        mode    http   #模式为http(7层代理http,4层代理tcp)
        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    #负载均衡调度算法使用轮询算法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表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒,表示连续三次检测不到心跳频率则认为该节点失效

若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。

七、部署负载均衡web群集

主机操作系统IP地址
haproxy服务器centos7192.168.109.131
nginx服务器1centos7192.168.109.134
nginx服务器2centos7192.168.109.135
客户端Windows7192.168.109.200

关闭所有机子防火墙,将包传入haproxy服务器/opt下

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

haproxy-1.5.19.tar.gz

#所需软件包
链接:https://pan.baidu.com/s/1TMPMVWCrvsyh6p6zAn1AGA 
提取码:hde6 

7.1 nginx节点服务器(两台相同)

#yum安装 nginx
vim /etc/yum.repos.d/nginx.repo
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

yum install nginx -y 

systemctl start nginx
systemctl enable nginx

#写入不同的网页内容以便测试的时候区分服务器
#服务器1
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# echo "<h1>nginx test1</h1>" >index.html 

#服务器2
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# echo "<h1>nginx test2</h1>" >index.html 

 

 

 

7.2 haproxy服务器配置

[root@localhost haproxy-1.5.19]# ls
CHANGELOG     doc       haproxy                  LICENSE   ROADMAP  tests
contrib       ebtree    haproxy-systemd-wrapper  Makefile  src      VERDATE
CONTRIBUTING  examples  include                  README    SUBVERS  VERSION
[root@localhost haproxy-1.5.19]# cd examples/
[root@localhost examples]# mkdir /etc/haproxy
[root@localhost examples]# cp haproxy.cfg /etc/haproxy/
[root@localhost examples]# cd /etc/haproxy/
[root@localhost haproxy]# ls
haproxy.cfg
[root@localhost haproxy]# vim haproxy.cfg 
#修改后的文件
# this config needs haproxy-1.1.28 or haproxy-1.2.1

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

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

listen  nginx_cluster  0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.109.134:80 check inter 2000  fall 3
        server  inst2 192.168.109.135:80 check inter 2000  fall 3

 

 7.3 添加haproxy系统服务

#将haproxy.init 启动文件拷贝到/etc/init.d中并改名
[root@localhost haproxy]# cd /opt/haproxy-1.5.19/examples/
[root@localhost examples]# cp haproxy.init /etc/init.d/haproxy

#添加执行权限
[root@localhost examples]# cd /etc/init.d/
[root@localhost init.d]# ls
functions  haproxy  netconsole  network  README
[root@localhost init.d]# chmod +x haproxy

#添加到chkconfig中管理
[root@localhost init.d]# chkconfig --add /etc/init.d/haproxy 
cd
#优化路径
[root@localhost init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

#开启服务
[root@localhost init.d]# service haproxy start 

7.4 客户端测试


 八、Haproxy集群日志定义

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

vim /etc/haproxy/haproxy.cfg   #修改配置文件

global
        log /dev/log    local0 info
        log /dev/log    local0 notice
        
service haproxy start 

需要修改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的请求日志信息

 

 

 

 

总结

haproxy的使用还是比较简单的,比lvs的配置简单很多

有问题欢迎留言 

;