使用 Haproxy 搭建Web群集

本章主要学习:

  • 熟悉 Haproxy 功能以常用群集配置调度算法
  • 学会Haproxy 常用配置
  • 学会 Haproxy 参数优化

简介

        在前面已经学习了使用Nginx,LVS 做负载均衡群集,他们都具有各自的特点,本章将要介绍另一款比较流行的群集调度工具 Haproxy 首先介绍负载均衡常用调度算法,然后介绍 Haproxy 搭建 Web 群集的方法,最后 介绍 Haproxy 的参数优化和日志配置

1.1 案例分析

1.案例概述

        Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如 LVS 和 Nginx 相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的 upsteam 模块支持群集功能,但是对群集节点健康检查功能不强,性能没用 Haproxy 号。Haproxy 官方网站事 http://www.haproxy.org/

        本案例介绍使用 Haproxy 及 Nginx 搭建一套 Web群集

2.案例前置知识点

1)HTTP请求

        通过URL 访问网站的协议是http 协议,此类请求一般称为http请求。http请求的方式分为 GET 方式和 POST方式。当使用浏览器访问某一个URL,会更具请求 URL放回状态码,通常的状态码为 2xx,3xx(如 200,301)如果出现异常放回 4xx,5xx(如 400,500)

        例如访问http://www.text.com/a.php?id=123,就是一个GET请求,如果访问正常,会从服务器的日志中获取200状态码。假如此类请求使用POST方式,那么传递给a.php 的id参数依旧是123,但是服务器的URL 将不会显示后面的 id=123字样,因此表单类或这有用户名,密码等内容提交时建议使用POST方式,不管使用哪种方式,最终 a.php 获取的值是一样的。

2)负载均衡常用调度算法

LVS,Haproxy,Nginx 最常用的调度算法有三种,如下所述:

  1. RR(Round Robin)RR算法是最简单最常用的一种算法,即轮询调度,例如,有三个节点A,B,C,第一个用户访问会被指派到节点A,第二个用户会被指派到节点B,第三个用户访问会被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果,此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求
  2. LC(Least Connections)。LC 算法即最小连接数算法,根据后端的节点连接数大小动态分配前端请求。例如,有三个节点 A、B、C,各节点的连接数分别为 A∶4、B∶5、C∶ 6,此时如果有第一个用户连接请求,会被指派到 A 上,连接数变为 A∶5、B∶5、C∶6;第二个用户请求会继续分配到 A 上,连接数变为 A∶6、B∶5、C∶6;再有新的请求会分配给 B,每次将新的请求指派给连接数最小的客户端。由于实际情况下 A、B、C 的连接数会动态释放,很难会出现一样连接数的情况,因此此算法相比较 rr 算法有很大改进,是目前用到比较多第 3 页 共 10 页 的一种算法
  3. SH(Source Hashing)。SH 即基于来源访问调度算法,此算法用于一些有 Session 会话记录在服务器端的场景,可以基于来源的 IP、Cookie 等做群集调度。例如,使用基于源 IP 的群集调度算法,有三个节点 A、B、C,第一个用户第一次访问被指派到了 A,第二个用户第一次访问被指派到了 B,当第一个用户第二次访问时会被继续指派到 A,第二个用户第二次访问时依旧会被指派到 B,只要负载均衡调度器不重启,第一个用户访问都会被指派到 A,第二个用户访问都会被指派到 B,实现群集的调度。此调度算法好处是实现会话保持,但某些 IP 访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

3.常见的Web群集调度器

        目前常见的Web群集调度器分为软件和硬件,软件通常使用开源的 LVS,Haproxy,Nginx,硬件一般使用比较多的是F5,也很多使用国内的一些产品,如梭子鱼,绿盟等

使用 Haproxy 搭建Web群集_第1张图片

案例环境
使用 Haproxy 搭建Web群集_第2张图片 

1.2 案例实施

1.编译安装Nginx服务器

1)搭建 Nginx1,使用nginx-1.22.1.tar.gz 安装包进行编译安装
wget http://nginx.org/download/nginx-1.22.1.tar.gz    //拉取软件包
[root@node01 ~]# yum -y install pcre-devel zlib-devel
[root@node01 ~]# useradd -M -s /sbin/nologin nginx
[root@node01 ~]# tar zxvf nginx-1.22.1.tar.gz
[root@node01 ~]# cd nginx-1.22.1/
[root@node01 nginx-1.22.1]# 
[root@node01 nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@node01 nginx-1.22.1]# make && make install

安装完后的默认信息如下

  • 默认安装目录:/usr/local/nginx
  • 默认日志:/usr/local/nginx/logs/
  • 默认监听:80
  • 默认Web 目录:/usr/local/nginx/html
[root@node01 ~]# cd /usr/local/nginx/html/
[root@node01 html]# echo "Server 192.168.182.101" > test.html
[root@node01 html]# /usr/local/nginx/sbin/nginx
[root@node01 html]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10632/nginx: master 
[root@node01 html]# systemctl stop firewalld

        为了实验方便,网站没用配置域名,直接实验IP地址。在客户端访问 http://192.168.182.101/test.html 测试 如图

使用 Haproxy 搭建Web群集_第3张图片

2)搭建Nginx2

        编译安装的步骤与Nginx1 相同,不同之处在于建立测试页面

[root@node02 nginx-1.22.1]# cd /usr/local/nginx/html/
[root@node02 html]# echo "Server 192.168.182.102" >  test.html
[root@node02 html]# /usr/local/nginx/sbin/nginx 
[root@node02 html]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10604/nginx: master 
[root@node02 html]# systemctl stop firewalld

安装完成后,在客户端访问 http://192.168.182.102/test.html 测试如图

使用 Haproxy 搭建Web群集_第4张图片

2.编译安装 Haproxy

使用 haproxy-1.5.19.tar.gz 安装包进行编译安装

[root@Haproxy ~]# yum -y install pcre-devel bzip2-devel
[root@Haproxy ~]# tar zxvf haproxy-1.5.19.tar.gz 
[root@Haproxy ~]# cd haproxy-1.5.19/
[root@Haproxy haproxy-1.5.19]# make TARGET=linux26    //64位系统
[root@Haproxy haproxy-1.5.19]# make install

 

3.Haproxy 服务器配置

1)建立Haproxy 的配置文件
[root@Haproxy ~]# mkdir /etc/haproxy    //创建配置文件目录
[root@Haproxy ~]# cp /root/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/        //将 haproxy.cfg 文件复制到配置文件目录
2)Haproxy 配置项介绍

        Haproxy 配置文件通常分为三个部分,即 glodal,default和 listen,global 位全局配置,default 位默认配置,listen 为应用组件配置

global 配置项通常有下面配置参数,以示例参数说明如下

global
        log 127.0.0.1   local0    //配置日志记录,local0为日志设备,默认存放到系统日志
        log 127.0.0.1   local1 notice    //notice 为日志级别,通常有24个级别
        #log loghost    local0 info    
        maxconn 4096        //用户最大连接数
        chroot /usr/share/haproxy
        uid 99    //用户uid
        gid 99    //用户gid

        default 配置项默认参数,一般会被应用组件继承,如果在应用组件中没用特别声明,将安装默认配置参数设置

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  appli4-backup 0.0.0.0:10004    //定义一个appli4-backup 的应用
        option  httpchk /index.html    //检查服务器的 index.html 文件
        option  persist    //强制将请求连接发送到已经 down 掉的服务器
        balance roundrobin    //负载均衡调度算法使用轮询算法
        server  inst1 192.168.114.56:80 check inter 2000 fall 3    //定义在线节点
        server  inst2 192.168.114.56:81 check inter 2000 fall 3 backup    //定义备份节点
3)根据目前的群集设计,将haproxy.cfg 配置文件的内容修改如下
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
     #   chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000


listen  webcluster 0.0.0.0:80
        option  httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.182.101:80 check inter 2000 fall 3
        server  inst2 192.168.182.102:80 check inter 2000 fall 3

4.创建自启动脚本

[root@Haproxy haproxy]# cp ~/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@Haproxy haproxy]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@Haproxy haproxy]# chmod +x /etc/init.d/haproxy 
[root@Haproxy haproxy]# chkconfig --add /etc/init.d/haproxy 
[root@Haproxy haproxy]# /etc/init.d/haproxy start
Starting haproxy (via systemctl):                          [  确定  ]
[root@Haproxy haproxy]# systemctl stop firewalld

5.测试Web群集

        通过上面的步骤,已经搭建完成Haproxy 的 Web群集,接下来需要验证群集是否工作正常,一个群集一般需要具备两个特性,第一个是高性能,第二个时高可用

1)测试高性能

在客户端使用浏览器打开 http://192.168.182.100/test.html,浏览器显示信息如图

        再次打开 一个新的浏览器页面访问 http://192.168.182.100/text.html ,浏览器显示信息如图

使用 Haproxy 搭建Web群集_第5张图片

可以看到群集的负载均衡已经生效,已经满足了群集的高性能要求

2)测试高可用

        现在将 192.168.182.101 的Nginx 服务停用,在客户端浏览器打开 http://192.168.182.100/test.html,浏览器显示信息任然如图所示

[root@node01 html]# killall nginx
[root@node01 html]# netstat -anpt | grep nginx

使用 Haproxy 搭建Web群集_第6张图片

        从中可以看出,当一台节点故障,不会影响群集的使用,这样就满足了群集的高可用性,也可以将192.168.182.101的Nginx 服务恢复,再将192.168.182.102 的Nginx 服务停用,测试高可用性

6.Haproxy 的日志

        Haproxy 的日志默认输出到系统的 syslog 中,查看起来不是非常方便,为了更好的管理 Haproxy 的日志,我们再生产环境中一般单独定义出来,定义的方法如下

1)修改Haproxy 配置文件中关于日志配置项的选项,将原有的日志配置更改为以下配置
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
      # chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        #debug
        #quiet
       log /dev/log local0 info    //增加内容
       log /dev/log local0 notice    //增加内容

        这两行配置放到 Haproxy 的 global 配置项中,主要是将 Haproxy 的 info 及 notice 日志分别接入到不同的日志文件中

        重启 Haproxy,完成Haproxy 配置

[root@Haproxy ~]# /etc/init.d/haproxy restart
Restarting haproxy (via systemctl):                        [  确定  ]
[root@Haproxy ~]#
2)修改 rsyslog 配置

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

[root@Haproxy ~]# touch /etc/rsyslog.d/haproxy.conf
[root@Haproxy ~]# vim /etc/rsyslog.d/haproxy.conf 
[root@Haproxy ~]# cat /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
& ~ 
[root@Haproxy ~]# 

        这部分配置是将Haproxy 的 info 日志记录到/var/log/haproxy-info.log 下,将 notice 日志记录到 /var/log/haproxy/haproxy-notice.log 下,其中 & 表示当日志写入日志文件后,rsyslog 停止处理这个信息。这里配置的语法是使用 rainerscript 脚本语言写的

        保持配置文件并重启 rsyslog 服务,完成rsyslog 配置

[root@Haproxy ~]# systemctl restart rsyslog.service
3)测试日志信息

        在客户端访问 http://192.168.182.100/test.html 后,可以使用 tail -f /var/log/haproxy/haproxy-notice.log 即时查看Haproxy 的访问请求日志信息

[root@Haproxy ~]# tail -f /var/log/haproxy/haproxy-info.log
Jan 16 11:53:21 Haproxy haproxy[11192]: 192.168.182.1:65351 [16/Jan/2024:11:53:21.606] webcluster webcluster/inst1 2/0/0/0/2 200 259 - - ---- 1/1/0/1/0 0/0 "GET /test.html HTTP/1.1"
Jan 16 11:53:21 Haproxy haproxy[11192]: 192.168.182.1:65351 [16/Jan/2024:11:53:21.609] webcluster webcluster/inst2 209/0/0/0/209 200 259 - - ---- 2/2/0/1/0 0/0 "GET /test.html HTTP/1.1"

7. Haproxy 的参数优化

        关于Haproxy 的参数优化,以下列举了几个关键的参数,并对各参数的生产环境的优化建议做了说明

使用 Haproxy 搭建Web群集_第7张图片

你可能感兴趣的:(前端)