1. 程式人生 > >keepalived高可用haproxy+varnish+lnmp實現站點搭建與ansible實現

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

export cto director 重啟 out image 大量 events pass

介紹

??

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服務器上。
??
設計圖如下
??
技術分享圖片
??

設計環境介紹

??

部署軟件 系統環境
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
<?php
phpinfo();
?>

技術分享圖片
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

技術分享圖片
創建自己的配置文件

#創建站點根目錄方便稍後掛載
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 / {
        }
}

技術分享圖片
3.掛載nfs共享文件

mount -t nfs 192.168.99.135:/share /web

4.啟動nginx和php-fpm服務

systemctl start nginx php-fpm

5.檢查是否能夠正常訪問
技術分享圖片
6.配置完成,另一臺依次配置即可
??

三.varnish配置

??
1.安裝varnish程序

yum install varnish -y

2.修改默認端口

vim /etc/varnish/varnish.params 

技術分享圖片
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;
        }
}

技術分享圖片
4.啟動varnish

#varnish的數據全保存在內存中,一旦重啟服務,緩存會全部丟失,所以盡量不要重服務,可以采用其他防範清理不用的緩存。
systemctl start varnish

5.驗證訪問
技術分享圖片
技術分享圖片

??

四.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驗證
技術分享圖片
技術分享圖片
技術分享圖片
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遊離狀態
技術分享圖片
技術分享圖片
技術分享圖片
??

簡單性能測試

??

環境:

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

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

??

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

??
??多次測試後,取了較為穩定的結果
技術分享圖片
??

直接訪問varnish服務器的測試

??
??多次測試後,取了較為穩定的結果
??
技術分享圖片
??

總結

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

ansible劇本

??隨著部署機器的數量越來越多,單純的手工配置將會花費大量的時間,因此使用自動化運維工具變得越來越迫切,這裏提供了一個簡單配置本實驗的劇本,作為新手不太會寫,只是提個思路
技術分享圖片
共享地址
https://pan.baidu.com/s/1tfNdVQWhrkxM-7rLtM6_Bw

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