Haproxy搭建Web群集

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

1.1 Haproxy概述

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

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

1. HTTP请求

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

        例如,访问http://www.test.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。也是很多人使用国内的一些产品,如梭子鱼、绿门等

1.2 案例环境

1. 本案例环境

本案例使用三天服务器模拟搭建一套Web群集,具体拓扑如下

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

Haproxy群集拓扑


案例环境

Haproxy搭建Web群集_第2张图片

2. 案例需求

(1)测试安装nginx、haproxy

(2)Haproxy、nginx配置

1.3 案例实施

1. 编译安装Nginx服务器

(1)搭建第一台服务器Nginx,使用软件包进行编译安装

[root@node2 ~]# yum -y install pcre-devel zlib-devel gcc++ gcc
[root@node2 ~]# useradd -M -s /sbin/nologin nginx
[root@node2 ~]# tar zxvf nginx-1.12.0.tar.gz 
[root@node2 ~]# cd nginx-1.12.0/
[root@node2 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@node2 nginx-1.12.0]# make && make install

安装完后的默认信息如下

  • 默认安装目录:/usr/local/nginx
  • 默认日志:/usr/local/nginx/logs/
  • 默认监听:80
  • 默认 Web 目录:/usr/local/nginx/html
[root@node2 ~]# cd /usr/local/nginx/html/
[root@node2 html]# echo "www.aaa.com" > index.html            //建立测试页面
[root@node2 ~]# /usr/local/nginx/sbin/nginx                //启动Nginx
[root@node2 ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13633/nginx: master 
[root@node2 ~]#

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

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

(2)搭建第二服务器Nginx,步骤与之相同就不作介绍了,不同之处在于创建测试页面不同,安装完成后在客户端访问http://192.168.161.12测试

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

2. 编译安装Haproxy

在 Haproxy 服务器使用 haproxy-1.5.19.tar.gz 安装包进行编译安装

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

3. Haproxy服务器配置

(1)建立Haproxy的配置文件

[root@node1 ~]# mkdir /etc/haproxy            //创建配置文件目录
[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/        //将配置文件复制到/etc目录下

(2)Haproxy配置项介绍

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

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

global
    log 127.0.0.1 local0                //配置日志记录,local0 为日志设备,默认存放到系统日志
    log 127.0.0.1 local1 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     //强制将请求发送到已经 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     //定义备份节点

(2)修改haproxy配置文件

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

[root@node1 ~]# 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

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  aaa 192.168.161.11:80 check inter 2000 fall 3            //Nginx服务器IP地址
        server  aaa 192.168.161.12:80 check inter 2000 fall 3

4. 创建自启动脚本

[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg 
[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@node1 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@node1 ~]# chmod +x /etc/init.d/haproxy 
[root@node1 ~]# chkconfig --add /etc/init.d/haproxy 
[root@node1 ~]# /etc/init.d/haproxy start

5. 测试Web群集

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

(1)测试高性能

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

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

再次打开一个新的浏览器页面访问http://192.168.161.10,浏览器显示信息如图(可能需要刷新一下)

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

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

(2)测试高可用

  现在将192.168.161.11的Nginx服务关闭,在客户端使用浏览器打开http://192.168.161.10,浏览器显示信息仍然是(www.bbb.com)

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

6. Haproxy的参数优化

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

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

你可能感兴趣的:(服务器,运维)