keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現

介紹

  

keepalived

  
  keepalived是一個使用C語言編寫的路由軟件,設計目的是爲Linux系統和基於Linux的虛擬架構提供簡單而強大的負載均衡和高可用設施。負載均衡依賴於普遍使用的LIinux虛擬服務器(IPVS)內核模塊,提供四層的負載均衡;keepalived實現了一組檢查程序,能夠根據其運行狀態動態的自適應地維護和管理負載均衡服務器池。另外一方面,VRRP(虛擬路由冗餘協議)實現了高可用性協議。
  keepalived經常使用來檢測服務的狀態,實現多種服務的高可用性:若是有一臺web服務器宕機,或者出現故障,沒法正常對外提供服務,keepalived將會檢測到該故障,而且將故障的服務器從系統中去除,同時使用其餘的服務器代替該服務器的工做,當服務器被人工修復以後,keepalived會自動將其加入集羣。
    php

haproxy

  
  HAProxy也是使用C語言開發的基於TCP和HTTP的應用程序代理軟件。HAProxy適合於負載較大的web站點,這些站點一般會需求會話保持機制和七層的報文請求處理,HAProxy則是同時兼顧了這兩項功能。HAProxy能夠支持很高的併發鏈接處理,配置簡單,結構清晰。還能夠保護web站點不會直接暴露在互聯網上。
  HAProxy是基於事件驅動,單一進程的模型,可以支持很是大的併發鏈接數。如今衆多站點都在使用HAProxy,例如: GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti等。
  css

varnish

  
  varnish是一款高性能的開源HTTP緩存加速器,同時還提供反向代理功能。varnish是基於內存緩存的,內存讀寫效率遠遠高於硬盤,重啓後數據會丟失;支持精確的緩存時間設定;VCL的配置和管理都比較靈活;管理功能強大。
    html

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實現
  mysql

設計環境介紹

  

部署軟件 系統環境
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上安裝數據庫軟件nginx

yum install mariadb-server -y
systemctl start mariadb

2.建立供wordpress站點使用的數據庫和用戶web

#登錄數據庫,初始能夠直接使用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服務redis

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
<?php
phpinfo();
?>

keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
5.啓動nfs服務,並查看共享目錄sql

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實現
建立本身的配置文件

#建立站點根目錄方便稍後掛載
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實現
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實現
6.配置完成,另外一臺依次配置便可
  

三.varnish配置

  
1.安裝varnish程序

yum install varnish -y

2.修改默認端口

vim /etc/varnish/varnish.params

keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
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實現
4.啓動varnish

#varnish的數據全保存在內存中,一旦重啓服務,緩存會所有丟失,因此儘可能不要重服務,能夠採用其餘防範清理不用的緩存。
systemctl start varnish

5.驗證訪問
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現

  

四.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實現
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
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實現
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
  

簡單性能測試

  

環境:

  
1核cpu 512M內存(虛擬機性能渣簡單測測)
  
測試命令
  

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

  

直接訪問nginx+php-fpm的測試

  
  屢次測試後,取了較爲穩定的結果
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
  

直接訪問varnish服務器的測試

  
  屢次測試後,取了較爲穩定的結果
  
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
  

總結

  
  使用了varnish緩存能夠明顯看出有很大的提高,所以針對不常變化的靜態資源使用緩存能夠明顯提升用戶的訪問速度。同時也能夠大大減輕後端web服務器的壓力。

ansible劇本

  隨着部署機器的數量愈來愈多,單純的手工配置將會花費大量的時間,所以使用自動化運維工具變得愈來愈迫切,這裏提供了一個簡單配置本實驗的劇本,做爲新手不太會寫,只是提個思路
keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現
共享地址
https://pan.baidu.com/s/1tfNdVQWhrkxM-7rLtM6_Bw

相關文章
相關標籤/搜索