介绍

  

keepalived

  
  keepalived是一个使用C语言编写的路由软件,设计目的是为Linux系统和基于Linux的虚拟架构提供简单而强大的负载均衡和高可用设施。负载均衡依赖于广泛使用的LIinux虚拟服务器(IPVS)内核模块,提供四层的负载均衡;keepalived实现了一组检查程序,可以根据其运行状态动态的自适应地维护和管理负载均衡服务器池。另一方面,VRRP(虚拟路由冗余协议)实现了高可用性协议。
  keepalived常用来检测服务的状态,实现多种服务的高可用性:如果有一台web服务器宕机,或者出现故障,无法正常对外提供服务,keepalived将会检测到该故障,并且将故障的服务器从系统中去除,同时使用其他的服务器代替该服务器的工作,当服务器被人工修复之后,keepalived会自动将其加入集群。
    

haproxy

  
  HAProxy也是使用C语言开发的基于TCP和HTTP的应用程序代理软件。HAProxy适合于负载较大的web站点,这些站点通常会需求会话保持机制和七层的报文请求处理,HAProxy则是同时兼顾了这两项功能。HAProxy可以支持很高的并发连接处理,配置简单,结构清晰。还可以保护web站点不会直接暴露在互联网上。
  HAProxy是基于事件驱动,单一进程的模型,能够支持非常大的并发连接数。现在众多站点都在使用HAProxy,例如: GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti等。
  

varnish

  
  varnish是一款高性能的开源HTTP缓存加速器,同时还提供反向代理功能。varnish是基于内存缓存的,内存读写效率远远高于硬盘,重启后数据会丢失;支持精确的缓存时间设定;VCL的配置和管理都比较灵活;管理功能强大。
    

varnish处理请求过程

  
1.varnish在获取客户端请求之后,由vcl_recv状态引擎进行处理,无法识别的请求会通过pipe提交给vcl_pipe状态引擎,需要查找缓存的请求用过lookup参数交给vcl_hash状态引擎处理,无需缓存的数据则是通过pass交给vcl_pass状态引擎。
2.vcl_hash状态引擎在接收到请求后会从缓存中查找数据,查询结果会返回hit缓存命中或者是miss缓存未命中。
3.vcl_hit状态引擎将命中的缓存数据通过参数deliver交给vcl_deliver引擎,待数据处理完成之后最终将数据返回给客户端。
4.vcl_miss引擎将未命中的结果通过参数fetch交给vcl_fetch,vcl_fetch会从数据库中查找数据。
5.vcl_fetch将从数据库中找到的结果,返回给vcl_deliver引擎。
6.vcl_deliver状态引擎将结果返回给master进程,进而返回给客户端。
  

实验构建

  

设计架构

  
  前端代理层使用HAProxy进行代理,同时使用keepalived实现代理层的高可用;之后的缓存层,使用varnish进行缓存页面,这里可以使用多台varnish,在HAProxy中配置基于uri的调度的一致性哈希算法;后端web层,采用了nginx+php-fpm的设计,nginx相对httpd更加轻量,同硬件配置下可以提供更多的并发请求处理;数据库采用mysql;站点文件则是放置于NFS服务器上,通过nfs挂载到众多web服务器上。
  
设计图如下
  
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第1张图片
  

设计环境介绍

  

部署软件 系统环境
192.168.99.130 HAProxy+keepalived CentOS7.4
192.168.99.131 HAProxy+keepalived CentOS7.4
192.168.99.132 Varnish CentOS7.4
192.168.99.133 Nginx+PHP-FPM CentOS7.4
192.168.99.134 Nginx+PHP-FPM CentOS7.4
192.168.99.135 NFS CentOS7.4
192.168.99.136 Mariadb-server CentOS7.4

  

实验搭建

  

一.mysql与NFS的配置

  
1.在192.168.99.136上安装数据库软件

yum install mariadb-server -y
systemctl start mariadb

2.创建供wordpress站点使用的数据库和用户

#登陆数据库,初始可以直接使用mysql命令登陆,设置密码后要使用mysql -u(用户名) -p(密码) -h(数据库所在机器的ip)一般在本机登陆不使用-h
mysql

#创建数据库wp
MariaDB [(none)]> create database wp;

#授权用户和可访问的ip段
MariaDB [(none)]> grant all on wp.* to wp_admin@'192.168.99.%' identified by 'centos';

# 刷新授权信息
MariaDB [(none)]> flush privileges;

3.在192.168.99.135上部署nfs服务

yum instlal nfs-utils -y

4.创建共享目录,修改配置文件

mkdir /share

#修改配置文件

vim /etc/exports
/share 192.168.99.0/24(rw,async,no_root_squash)

#解压wordpress并修改配置,创建检查页
tar xvf wordpress-4.9.4-zh_CN.tar.gz

#重命名示例配置文件
mv wordpress/wp-config.sample.php  wordpress/wp-config.php

#编辑配置文件
vim wordpress/wp-config.php

#在share目录下创建一个隐藏的php信息页,方便varnish检查服务是否允许正常
vim /share/.check.php

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第2张图片
5.启动nfs服务,并查看共享目录

 systemctl start nfs

 #查看对应主机的共享目录
 showmount -e 192.168.99.135

#检查无误后nfs配置结束

  

二.web站点搭建

  
在192.168.99.133和192.168.99.134上部署nginx和php-fpm,由于2台机器部署完全相同,所以我这里仅仅展示其中一台的部署过程。

1.安装nginx,php-fpm和nfs-utils(挂载目录使用)

yum install nginx php-fpm nfs-utils -y

2.修改nginx配置文件,由于nginx和php未分离,所以php的配置文件基本无需修改。

#修改nginx默认配置文件。
vim /etc/nginx/nginx.conf

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第3张图片
创建自己的配置文件

#创建站点根目录方便稍后挂载
mkdir /web

#编辑自定义配置文件
vim /etc/nginx/conf.d/vhost.conf 

server {
#设置默认访问站点
       listen 80 default_server;
       server_name www.douma.com;
             #web站点根目录
       root /web;
       index index.php index.html;
             #配置php转发规则
       location ~* \.php$ {
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_index index.php;
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME /web$fastcgi_script_name;
        }
       location / {
        }
}

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第4张图片
3.挂载nfs共享文件

mount -t nfs 192.168.99.135:/share /web

4.启动nginx和php-fpm服务

systemctl start nginx php-fpm

5.检查是否能够正常访问
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第5张图片
6.配置完成,另一台依次配置即可
  

三.varnish配置

  
1.安装varnish程序

yum install varnish -y

2.修改默认端口

vim /etc/varnish/varnish.params 

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第6张图片
3.添加默认配置

vim /etc/varnish/default.vcl 
vcl 4.0;
#导入调度器模块
import directors;    # load the directors
#配置健康状态检查信息
probe phpcheck {
        .url = "/.check.php";
        .timeout = 3s;
        .interval = 2s;
        .window = 3;
        .threshold = 2;
}
#设置后端主机信息
backend default1 {
        .host = "192.168.99.133";
        .port = "80";
        .probe = phpcheck;
}
backend default2 {
        .host = "192.168.99.134";
        .port = "80";
        .probe = phpcheck;
}
#配置代理后端服务器的调度方法,这里使用了round_robin轮询
sub vcl_init {
        new phpweb = directors.round_robin();
        phpweb.add_backend(default1);
        phpweb.add_backend(default2);
}

sub vcl_recv {
        if (req.url ~ "^/$") {
                unset req.http.cookie;
        }
}
#强制取消匹配资源的cookie信息并设置缓存时间方便缓存
sub vcl_backend_response {
        if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$") {
                unset beresp.http.Set-Cookie;
                set beresp.ttl = 3600s;
        }
}
#显示是否能够命中缓存
sub vcl_deliver {
        if (obj.hits>0) {
                set resp.http.X-Cache = "HIT via" + " " + server.ip;
        } else {
                set resp.http.X-Cache = "MISS from " + server.ip;
        }
}

keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第7张图片
4.启动varnish

#varnish的数据全保存在内存中,一旦重启服务,缓存会全部丢失,所以尽量不要重服务,可以采用其他防范清理不用的缓存。
systemctl start varnish

5.验证访问
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第8张图片
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第9张图片

  

四.keepalived高可用HAProxy

  
1.安装HAProxy和keepalived

#psmisc是为了使用killall监控haproxy进程状态
yum install keepalived haproxy psmisc -y

2.编辑haproxy的配置文件

global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

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

frontend  nginx
          bind :80
          default_backend             varnish
#配置监控页面和对应的访问账号密码
listen stats
        bind :9091 
        stats enable
        stats auth admin:admin
        stats admin if TRUE
#配置基于uri的一致性哈希调度算法,由于机器有限,仅做了一台varnish,构建varnish集群的时候,采用uri的一致性哈希有助于使得不同的varnish机器可以均衡的负担站点的热区数据而不造成大量重复缓存。
backend varnish
        balance     uri
        hash-type consistent
        server  nginx1 192.168.99.132:80 check

3.启动HAProxy服务

systemctl start haproxy

#另一台主机同样配置

4验证
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第10张图片
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第11张图片
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第12张图片
5.配置keepalived

vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

        global_defs {
        notification_email {
                root@localhost
        }
        notification_email_from keepalivedlocalhost
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id HAProxy
        vrrp_skip_check_adv_addr
        vrrp_mcast_group4 224.0.99.66
        }
#检测haproxy状态,haproxy停止后会降低权重,ip游离
        vrrp_script chk_haproxy {
                script "killall -0 haproxy && exit 0 || exit 1"
                interval 1
                weight -5
                fall 2
                rise 1
        }
#定义具体实例
        vrrp_instance VI_1 {
            state MASTER #在从节点要设置为BACKUP
            interface ens33
            virtual_router_id 66
            priority 100 #从节点权重要低一点,方便ip游离
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass douma123
            }
            virtual_ipaddress {
                192.168.99.200/24 dev ens33 label ens33:1
            }

            track_script {
                chk_haproxy
            }
       #配置警信息记录keepalived的状态转换
            notify_master "/etc/keepalived/notice.sh master"
            notify_backup "/etc/keepalived/notice.sh backup"
            notify_fault "/etc/keepalived/notice.sh fault"
        }
#notice.sh实例
        #!/bin/bash

        notify() {
                echo "haproxy1 is $1" >>  /root/haproxy.log
                echo `date +%F-%T` >> /root/haproxy.log
                echo >> /root/haproxy.log
                }

        case $1 in
                master)
                        notify master
                ;;
                backup)
                        notify backup
                ;;
                fault)
                        notify fault
                ;;
                *)
                        echo "Usage: $(basename $0) {master|backup|fault}"
                        exit 1
                ;;
        esac

下面放备用节点的配置

! Configuration File for keepalived

        global_defs {
        notification_email {
                root@localhost
        }
        notification_email_from keepalivedlocalhost
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id HAProxy
        vrrp_skip_check_adv_addr
        vrrp_mcast_group4 224.0.99.66
        }

        vrrp_script chk_haproxy {
                script "killall -0 haproxy && exit 0 || exit 1"
                interval 1
                weight -5
                fall 2
                rise 1
        }

        vrrp_instance VI_1 {
            state BACKUP
            interface ens33
            virtual_router_id 66
            priority 98
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass douma123
            }
            virtual_ipaddress {
                192.168.99.200/24 dev ens33 label ens33:1
            }

            track_script {
                chk_haproxy
            }
            notify_master "/etc/keepalived/notice.sh master"
            notify_backup "/etc/keepalived/notice.sh backup"
            notify_fault "/etc/keepalived/notice.sh fault"
        }

6.启动keepalived

        systemctcl start keepalived

7.在主节点上关闭haproxy查看ip游离状态
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第13张图片
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第14张图片
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第15张图片
  

简单性能测试

  

环境:

  
1核cpu 512M内存(虚拟机性能渣简单测测)
  
测试命令
  

#依赖于httpd-tools工具包
ab -c100 -n2000 http://192.168.99.133/.check.php

  

直接访问nginx+php-fpm的测试

  
  多次测试后,取了较为稳定的结果
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第16张图片
  

直接访问varnish服务器的测试

  
  多次测试后,取了较为稳定的结果
  
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第17张图片
  

总结

  
  使用了varnish缓存可以明显看出有很大的提升,因此针对不常变化的静态资源使用缓存可以明显提高用户的访问速度。同时也可以大大减轻后端web服务器的压力。

ansible剧本

  随着部署机器的数量越来越多,单纯的手工配置将会花费大量的时间,因此使用自动化运维工具变得越来越迫切,这里提供了一个简单配置本实验的剧本,作为新手不太会写,只是提个思路
keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现_第18张图片
共享地址
https://pan.baidu.com/s/1tfNdVQWhrkxM-7rLtM6_Bw