HAProxy实战(一)

实验目的

  • 测试基于haproxy的反代和负载均衡配置

  • 测试keepalived高可用haproxy的效果

实验要点

(1) 动静分离discuzx,动静都要基于负载均衡实现;
(2) 进一步测试在haproxy和后端主机之间添加varnish缓存;
(3) 给出拓扑设计;
(4) haproxy的设定要求:

(a) 启动stats;
(b) 自定义403、502和503的错误页;
(c) 各组后端主机选择合适的调度方法;
(d) 记录好日志;
(e) 使用keepalived高可用haproxy;

拓扑结构

HAProxy实战(一)

拓扑图的简要说明

  • node2和node5上同时运行keepalived和haproxy,做高可用,VIP为172.16.47.100

  • 在node3和node4上,模拟了2台基于IP的虚拟主机,以减少实验中机器的数量

  • 在node3上,运行nginx的同时,还运行了nfs服务,共享目录;在node4上把该共享目录挂载到本地,用于httpd服务存放静态内容;node3上的nginx将该目录作为其网页文件根路径,从而实现了静态内容的共享

  • haproxy主机负责接受用户请求,当用户请求的是图片资源时,调度至nginx服务器,否则调度请求至httpd服务器

实验配置

根据实验拓扑,在node3上部署nginx服务,nfs服务

[root@node3 ~]# rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm  #安装nginx
[root@node3 ~]# yum install nfs-utils -y #安装nfs
[root@node3 ~]# mkdir /testdir/nfs -pv  #创建nfs服务器的导出目录
[root@node3 ~]# vim /etc/exports
[root@node3 ~]# cat /etc/exports    #授权node4上的2个ip可以访问
/testdir/nfs    172.16.47.104(rw,no_root_squash)    172.16.47.204(rw,no_root_squash)
[root@node3 ~]# systemctl start rpcbind 
[root@node3 ~]# systemctl start nfs #启动nsf服务,因为nfs服务依赖于rpc服务,因此要先启动rpc

ssl -tnl可以看到111端口(rpc)和2049(nfs)都已经起来

HAProxy实战(一)

修改nginx的配置文件,添加两个基于IP的虚拟主机,以模拟一组静态服务器组,将其网页根文件路径设置为nfs服务器的导出目录。

[root@node3 /etc/nginx/conf.d]# egrep -v "#|^$" default.conf
server {
    listen      172.16.47.103:80;
    server_name  www.33love.me;
    location / {
        root   /testdir/nfs;
        index  index.html index.htm;
    rewrite /attachment/(.*)$ /$1;  #因为在前端用户访问某附件资源时,其访问路径是http://172.16.47.100/bbs/data/attachment/XX,而nginx本地只有attachment目录下的相关资源,因此要对url进行重写
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen    172.16.47.203:80;
    server_name    www.33love.com;
    root    /testdir/nfs;
    index index.html;
    rewrite    /attachment/(.*)$ /$1;
}
[root@node3 /etc/nginx/conf.d]#

提供测试主页,启动nginx服务,测试nginx服务是否正常

HAProxy实战(一)

在node4上部署配置amp环境

yum install httpd php php-mysql mariadb-server -y,启动mariadb,创建bbs库,授权用户访问,部署用于安装Discuz论坛所需的数据库环境

HAProxy实战(一)

解压Discuzx至httpd工作目录/var/www/html/下,改名upload为bbs,解压目录下的data/attachment/目录为用户上传附件的目录,将node3上的共享目录/testdir/nfs挂载到该目录下。这样的话,就需要先将该目录下的文件先备份处理,待挂载后,再移进来。

注意:得先在node3上创建一个于node4上的apache用户相同ID号的用户,并且让该用户对nfs导出的目录有写权限。

HAProxy实战(一)

HAProxy实战(一)

HAProxy实战(一)

HAProxy实战(一)

HAProxy实战(一)

再来配置httpd服务器,创建两个基于IP的虚拟主机,模拟动态服务器组

HAProxy实战(一)

两个IP访问都没问题,开始安装

HAProxy实战(一)

HAProxy实战(一)

在node2上安装部署haproxy和keepalived

yum install haproxy keepalived -y #安装相应软件

配置keepalived高可用haproxy,node2为备节点
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Lurker
   vrrp_mcast_group4 224.0.100.33
}

vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1  #每隔一秒执行一次上面的检测
        weight -5   #权重减5,而主的上面我配置的是权重减10
        rise 1
        fall 2
}

vrrp_instance VI_1 {
    state BACKUP    #备
    interface eno16777736
    virtual_router_id 14
    priority 95 #优先级
    advert_int 1    #vrrp通告的时间间隔
    authentication {
        auth_type PASS
        auth_pass 3333
    }

        track_script {
                chk_haproxy
        }

   virtual_ipaddress {
        172.16.47.100/16 dev eno16777736
    }
        track_interface {
                eno16777736
        }
}

HAProxy的配置
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    errorfile 403 /tmp/403.html #定义错误页面
    errorfile 502 /tmp/502.html
    errorfile 503 /tmp/503.html

frontend  bbs *:80  #注意备份节点上的监听地址不能写出VIP,因为它是Backup状态时,是没有VIP的,如果写出VIP,这时会报错的
    acl fujian path_sub -i /attachment   #定义acl,当访问路径有attachment时,匹配
    use_backend nginxgroup if fujian
    default_backend httpdgroup

backend nginxgroup  #定义处理静态内容的nginx服务器组
    balance roundrobin
    server nginx103 172.16.47.103:80 check maxconn 1000
    server nginx203 172.16.47.203:80 check maxconn 2000

backend httpdgroup  #定义处理动态内容的httpd服务器组
    balance uri
    option httpchk /index.html
    hash-type consistent
    server httpd104 172.16.47.104:80 check maxconn 300
    server httpd204 172.16.47.204:80 check maxconn 500

listen statspage    #自定义状态页面
    bind *:3333
    stats enable
    stats uri /myadmin?stats
    stats realm Lurker\ HAProxy \stats \Page
    stats auth admin:admin@123
    stats admin if TRUE

配置rsyslog
开启TCP或UDP
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
加上一句定义loacl2的facility日志文件路径
local12.*                                               /varlog/haproxy.log

node5上的配置也是类似,只不过配置keepalived时要配置成主节点。

重启rsyslog,启动keepalived,haproxy,测试访问。

HAProxy实战(一)

HAProxy实战(一)

停掉主节点node5上的haproxy,可以看到VIP,已经到备节点node2上,页面也仍可以正常访问

HAProxy实战(一)

HAProxy实战(一)

至此,keepalived高可用haproxy成功。不过在这里的时候遇到一个坑,记录一下。

在配置好keepalived高可用haproxy后,把node5(主)和node3(备)上的haproxy和keepalived都起起来,这时VIP在node5上面,能正常访问页面,这没问题;把node5上的Haproxy停掉之后,它的优先级减了10,成了90,,这也没问题,但是,node3的优先级按正常来说应该是95,这时node3优先级比node5高,应该成为主,VIP应该在node3上,但是实际上却没有。

在node2上抓包tcpdump -i eno16777736 -nn host 224.0.100.33

可以看到,仍是node5(172.16.47.105)发的vrrp报文,并且优先级变成了90。

HAProxy实战(一)

到这里我们来分析一下:node5的优先级降低,都变成了90,而node2却还没有变成主,难道是node2的优先级更低?停掉node5上的keepalived让其优先级变为0,来看看node2的优先级。

HAProxy实战(一)

node2的优先级不是应该是95吗,怎么变成90了?于是想到检查haproxy健康状态的配置段:

vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1  #每隔一秒执行一次上面的检测
        weight -5   #权重减5,而主的上面我配置的是权重减10
        rise 1
        fall 2
}

killall -0 haproxy是检查haproxy进程是否存在,存在返回0。所以检测的逻辑是:每秒钟执行一次script “killall -0 haproxy”,如果返回码为0,则不执行下面的weight -5,否则执行。自己手动执行一下killall -0 haproxy,发现killall命令竟然不存在。

HAProxy实战(一)

killall命令不存在,那么killall命令肯定执行不成功,返回非0值了。于是就明白为什么node2权重会异常的减5了。安装上killall所需的包,问题就解决了。

HAProxy实战(一)

统计页面如下:

HAProxy实战(一)

现在来验证动静分离是否成功:查看已经上传的图片是由谁处理的。

HAProxy实战(一)

可以看到,是由nignx处理的,再来看看其他资源

HAProxy实战(一)

可以看到,是由apache处理的。这说明,我们在haproxy上定义的acl生效了,当匹配到/attachment时,请求就被调度至nginx,其他的请求全都送往httpd服务器组,查看我们定义的haproxy的日志,可以看到nginxgroup和httpdgroup都处理过请求。

HAProxy实战(一)

node4上停掉httpd服务器,systemctl stop httpd.service,我们自定义的错误页面也出来了

HAProxy实战(一)

至此,discuz论坛的动静分离也已经实现。

原创文章,作者:Lurker,如若转载,请注明出处:http://www.178linux.com/68260

(0)
上一篇 2017-02-12 22:26
下一篇 2017-02-13 11:37

相关推荐

  • Tomcat基于MSM+Memcached实现Session共享

    前言 在Tomcat集群中,当一个节点出现故障,其他节点该如何接管故障节点的Session信息呢?本文带来的解决方案是基于MSM+Memcached实现Session共享。 相关介绍 MSM MSM–Memcached Session Manager是一个高可用的Tomcat Session共享解决方案,除了可以从本机内存快速读取Session信…

    Linux干货 2015-07-03
  • Python函数式编程指南:目录和参考

    目录: 概述 这一篇简要地描述了函数式编程和一些相关的概念。 函数 这一篇展示了关于函数可能不常用到的部分特征并尝试引导诸位使用函数式的思维解决问题,并介绍了诸多有用的内建函数。 迭代器 这一篇介绍了迭代器以及Python对迭代器的语法级的支持,还包括了内置模块itertools的介绍。 生成器 这一篇介绍了自定义的迭代器——生成器,并展示了生成器的用途和使…

    Linux干货 2015-03-11
  • rpm实现LAMP

    rpm实现LAMP部署 LAMP概述 LAMP指的Linux(操作系统)、ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母,一般用来建立web应用平台。常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同…

    Linux干货 2016-11-02
  • 第十九周作业

    1、描述Tomcat的架构; 核心架构图: 架构简介: Server是管理Service接口的,是Tomcat的一个顶级容器。管理着多个Service; Service 是服务,管理着一个Container和多个Connector,Service的存在依赖于Server; Container : 一个或者多个Container 可以对应一个Connector…

    2017-06-23
  • Linux中的 德·摩根定律

    Linux中的 德·摩根定律 §·德·摩根定律介绍 ※概念 在命题逻辑和逻辑代数中,德·摩根定律(或称德·摩根定理)是关于命题逻辑规律的一对法则。 奥古斯塔斯·德·摩根首先发现了在命题逻辑中存在着下面这些关系: 非(P 且 Q) = (非 P) 或 (非 Q) 非(P 或 Q) = (非 P) 且 (非 Q) 德·摩根定律在数理…

    Linux干货 2016-08-15
  • centos启动模式更改

    临时更改   用单用户的方法 系统开机 然后在等待界面是按esc 然后会进入这个界面,根据下面的提示进入 按a 会进入下面这个界面 在最后一行输数字代表第几模式   文件更改   centos6   系统启动时会初始化init init 的配置文件是/etc/inittab文件 用vim /etc/inittab进入查…

    2017-07-22