Haproxy搭建Web群集

一、案例分析

1.案例概述

        Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如LVS 和Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy好。

2.案例前置知识

(1)HTTP请求

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

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

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

        RR(Round Robin)。RR算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点 A、B、C,第一个用户访问会被指派到节点 A,第二个用户访问会被指派到节点 B,第三个用户访问会被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果。此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求。
        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 算法有很大改进,是目前用到比较多的一种算法。
        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。也有很多人使用国内的一些产品,如梭子鱼、绿盟等。

3.案例环境 

        本案例使用三台服务器模拟搭建一套 Web 群集,具体的拓扑如图所示。 

 

二、案例实施

1.编译安装Nginx服务器

[root@node1 ~]# yum -y install pcre-devel zlib-devel gcc*
[root@node1 ~]# useradd -M-s /sbin/nologin nginx
[root@node1 ~]# tar zxvf nginx-l.12.0.tar.gz
[root@node1 ~]# cd nginx-l.12.0
[root@node1 nginx-1.12.0]#./configure--prefix=/usr/local/nginx --user-nginx --gro
up=nginx
[root@node1 nginx-1.12.0]# make && make install
[root@node1 nginx-1.12.0]# cd /usr/local/nginx/html
[root@node1 html]# echo "test web01">index.html
[root@node1 html]# /usr/local/nginx/sbin/nginx

         node2编译安装步骤与node1相同,但测试页面要和node1有所不同。

2.编译安装Haproxy

[root@hap-node]# yum -y install pcre-devel bzip2-devel gcc*
[root@hap-node ~]# tar xf haproxy-1.5.19.tar.gz
[root@hap-node ~]# cd haproxy-1.5.19
[root@hap-node haproxy-1.5.19]# make TARGET=linux26
[root@hap-node haproxy-1.5.19]# make install

 3.Haproxy服务器配置

(1)建立Haproxy的配置文件

[root@hap-node haproxy-1.5.19]# mkdir /etc/haproxy
[root@hap-node haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/

Haproxy 配置项介绍:
        Haproxy配置文件通常分为三个部分,即 global、defaults 和 listen。global 为全局配置,defaults 为默认配置,1isten为应用组件配置。
        global配置项通常有下面配置参数,以示例参数说明如下。

global
    1og 127.0.0.1        loca10       //配置日志记录,loca10 为日志设备,默认存放到系统日志
    1og 127.0.0.1        locall notice//notice为日志级别,通常有24个级别
    maxconn 4096                      //最大连接数
    uid 99                            //用户 uid
    gid 99                            //用户 gid

        defaults 配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将按照默认配置参数设置。

defaults
    log     global        //定义日志为 global 配置中的日志定义
    mode    http          //模式为 http
    option  httplog       //采用 http 日志格式记录日志
    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                        //制将请求发送到已经 dow 掉的服务器
balance   roundrobin                     //负载均衡调度算法使用轮询算法
server    instl 192.168.114.56:80 check inter 2000 fa11 3 //定义在线节点
server    inst2 192.168.114.56:81 check inter 2000 fall 3 backup //定义备份节点

(2)修改haproxy.cfg配置文件

        根据目前的群集设计,将 haproxy.cfg 配置文件的内容修改如下。

[root@localhost haproxy-1.5.19]# vi /etc/haproxy/haproxy.cfg
 
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        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.10.102:80 check inter 2000 fall 3 weight 1
        server  inst2 192.168.10.103:80 check inter 2000 fall 3 weight 2

4.创建自启动脚本

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

5.测试Web群集

(1)测试高性能

        在客户端连续访问Haproxy服务器的IP地址,查看浏览器显示信息,若能按照设置分别显示node1和node2的测试页面,群集的负载均衡调度已经生效,已经满足了群集的高性能需求。

(2)测试高可用

        将一台node节点的Nginx服务停用,在客户端访问测试页面,浏览器仍显示信息。当一台节点故障,不会影响群集的使用,这样就满足了群集的高可用性。

6.Haproxy的日志

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

(1)修改syslog

        配置文件,将原有的配置更改为以下配置:

[root@hap-node ~]# vim /etc/rsyslog. conf

......
$ModLoad imudp                      #去掉注释,开启 UDP 日志协议转发
$UDPServerRun 514                    
......
local3.*                            /var/log/haproxy.log #最下方添加
local0.*                            /var/log/haproxy.log #最下方添加

        重启 rsyslog,完成rsyslog 配置。 

(2)测试日志信息

        在客户端访间 http://192.168.10.101后,可以使用tail -f /var/log/haproxy.log 即时査看Haproxy的访问请求日志信息。

上一篇:【论文精读】Exploring the Causality of End-to-End Autonomous Driving-背景信息


下一篇:华为HCIP Datacom H12-821 卷34