項目實戰5—企業級緩存系統varnish應用與實戰

来源:http://www.cnblogs.com/along21/archive/2017/12/06/7911628.html
-Advertisement-
Play Games

企業級緩存系統varnish應用與實戰 環境背景:隨著公司業務快速發展,公司的電子商務平臺已經聚集了很多的忠實粉絲,公司也拿到了投資,這時老闆想通過一場類似雙十一的活動,進行一場大的促銷,屆時會有非常多的粉絲訪問網站,你的總監與市場部門開完會後,確定活動期間會有平常10倍以上的訪問請求,總監要求大幅 ...


 

企業級緩存系統varnish應用與實戰

  環境背景:隨著公司業務快速發展,公司的電子商務平臺已經聚集了很多的忠實粉絲,公司也拿到了投資,這時老闆想通過一場類似雙十一的活動,進行一場大的促銷,屆時會有非常多的粉絲訪問網站,你的總監與市場部門開完會後,確定活動期間會有平常10倍以上的訪問請求,總監要求大幅增加網站容量,除了去擴容伺服器之外,還有沒有其他辦法呢?

總項目流程圖,詳見 http://www.cnblogs.com/along21/p/8000812.html

實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構

原理:

緩存,又稱加速器,用於加速運行速度較快的設備與較慢設備之間的通信。基於程式的運行具有局部性特征其能實現加速的功能

 

1、環境準備

 

機器名稱

IP配置

服務角色

備註

haproxy-server-master

VIP:172.17.100.100

DIP:172.17.1.6

負載均衡器

主伺服器

配置keepalived

haproxy-server-backup

VIP:172.17.100.100

DIP:172.17.11.11

負載伺服器

從伺服器

配置keepalived

varnish

RIP:192.168.30.2

緩存伺服器

開啟代理功能

rs01

RIP:192.168.30.107

後端伺服器

開啟lnmp的web

rs02

RIP:192.168.30.7

後端伺服器

開啟lnmp的web

2、在兩個 haproxy上設置

全局段和預設段不用修改,就不寫了

vim /etc/haproxy/haproxy.cfg

vim /etc/haproxy/haproxy.cfg
① frontend 前端設置
frontend  web
        bind :80
        default_backend         varnish-server

② backend 後端設置
backend varnish-server
        balance     roundrobin
        server varnishsrv 192.168.30.105:6081 check inter 3000 rise 3 fall 3

③ 可以加個web狀態監測頁面,可要可不要
listen admin
bind  :9527
stats enable
stats hide-version
stats uri /haproxy?admin
stats realm  HAProxy\ Statistics
stats auth along:along
stats refresh 20s
stats admin if TRUE

3、設置keepalived

(1)在主haproxy-master

① 全局段,主要是設置發郵件的
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id keepalived_haproxy
}
② 編輯一個健康監測腳本,每2秒監測一次haproxy進程
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 2
        fall 2
        rise 2
        weight -4
}
③ 定義主從和VIP
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 191
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass along
    }
    virtual_ipaddress {
        172.17.100.100
    }
track_script {     //調用上邊的腳本
chk_haproxy
}
}

 

(2)在從haproxy-backup 上,和主差不多,只需修改主從和優先順序

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 191
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass along
    }
    virtual_ipaddress {
        172.17.100.100
    }
}

4、設置varnish

(1)設置配置,管理Management進程的配置文件,配置進程的

vim /etc/varnish/varnish.params 修改埠和緩存類型及緩存大小

VARNISH_ADMIN_LISTEN_PORT=6082

VARNISH_STORAGE="file,/data/cache,1G"

 

(2)設置總配置文件,配置緩存系統的

vim /etc/varnish/default.vcl

(a)第一段

① 設置一個健康監測
vcl 4.0;   //指定版本
import directors;   //載入後端的輪詢模塊
probe backend_healthcheck {   //設置名為backend_healthcheck的健康監測
    .url = "/index.html";
    .window = 5;      #視窗
    .threshold = 2;   #門檻
    .interval = 3s;
    .timeout  = 1s;
}

② 設置後端server
backend web1 { 
    .host = "192.168.30.107";
    .port = "80";
    .probe = backend_healthcheck;
}
backend web2 {
    .host = "192.168.30.7";
    .port = "80";
    .probe = backend_healthcheck;
}

③ 配置後端集群事件
sub vcl_init {
    new web_cluster = directors.round_robin();   //把web1和web2 配置為輪詢集群,取名為web_cluste
    web_cluster.add_backend(web1);
    web_cluster.add_backend(web2);
}
acl purgers {    # 定義可訪問來源IP,許可權控制
        "127.0.0.1";
        "172.17.0.0"/16;
}

(b)第二段,定義引擎

① 定義vcl_recv 引擎,不認識的頭部請求直接扔後端的pass
sub vcl_recv {
    if (req.method == "GET" && req.http.cookie) {
        return(hash);    //處理完recv 引擎,給下一個hash引擎處理
}
   if (req.method != "GET" &&
   req.method != "HEAD" &&
   req.method != "PUT" &&
   req.method != "POST" &&
   req.method != "TRACE" &&
   req.method != "OPTIONS" &&
   req.method != "PURGE" &&
   req.method != "DELETE") {
    return (pipe);   //除了上邊的請求頭部,通過通道直接扔後端的pass
   }
② 定義index.php通過特殊通道給後端的server,不經過緩存
    if (req.url ~ "index.php") {
        return(pass);
    }
③ 定義刪除緩存的方法
    if (req.method == "PURGE") {     # PURGE請求的處理的頭部,清緩存
        if (client.ip ~ purgers) {
          return(purge);
        }
    }
④ 為發往後端主機的請求添加X-Forward-For首部
    if (req.http.X-Forward-For) {    # 為發往後端主機的請求添加X-Forward-For首部
        set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
    } else {
        set req.http.X-Forward-For = client.ip;
    }
        return(hash);
}

⑤ 定義vcl_hash 引擎,後沒有定義hit和Miss的路徑,所以走預設路徑
sub vcl_hash {
     hash_data(req.url);
}

⑥ 定義要緩存的文件時長
sub vcl_backend_response {     # 自定義緩存文件的緩存時長,即TTL值
    if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
        set beresp.ttl = 30d;
    }
    if (bereq.url ~ "\.(html|css|js)$") {
        set beresp.ttl = 7d;
    }
    if (beresp.http.Set-Cookie) { # 定義帶Set-Cookie首部的後端響應不緩存,直接返回給客戶端
    set beresp.grace = 30m;  
        return(deliver);
    }
}

⑦ 定義deliver 引擎
sub vcl_deliver {
    if (obj.hits > 0) {    # 為響應添加X-Cache首部,顯示緩存是否命中
        set resp.http.X-Cache = "HIT from " + server.ip;
    } else {
        set resp.http.X-Cache = "MISS";
    }
        unset resp.http.X-Powered-By;   //取消顯示php框架版本的header頭
        unset resp.http.Via;   //取消顯示varnish的header頭
}

5、開啟服務的順序

① 先開啟後端server事先搭建好的lnmp web服務

systemctl start nginx

systemctl start php-fpm

systemctl start mariadb

 

② 再開啟varnish緩存伺服器

service varnish start

 

③ 開啟主從的keepalived,提供VIP

service keepalived start

 

④ 開啟haproxy服務

service haproxy start

 

6、測試

(1)配置完成後,client訪問,http://172.17.100.100/ ,成功訪問web

 

(2)訪問http://172.17.100.100:9527/haproxy?admin ,haproxy的web監測頁面,正常

 

(3)當主haproxy 宕機時,VIP自動漂移到從上,且服務正常使用

在主haproxy 上,server stop haproxy,VIP會漂到從上

(4)varnish 緩存伺服器上,確實生成了緩存文件

F12打開網頁的調試頁面,查看確實緩存了

 

(5)測試清緩存的功能,PURGE 發送頭部信息

 

(6)後端有一臺server 宕機,服務照常使用

systemctl stop nginx

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前段時間在玩dos命令行的時候,用copy con創建了txt文件後想對其進行編輯,然後我又不想用記事本,所以去網上找命令行中對文本文件進行編輯的命令(純屬想裝B),結果看到了edit命令。 一敲,就出現瞭如下所示問題 告訴我edit不是內部或外部命令,也不是可運行的程式。然後我就懵了,度娘騙我? ...
  • 1.從官網下載source insight4.0版本(不用下載,在後面已經把所有需要的文件都準備好了); 2.安裝source insightt4.0; 3.使用下載好的sourceinsight4.exe替換安裝在program file(x86)目錄下的sourceinsight4.exe; 4 ...
  • Rsync的文件同步實現 一、rsync 簡介 Rsync(remote synchronize)是一個遠程數據同步工具,簡要的概括就是主機於主機之間的文件目錄數據的一個同步。 它的特性如下: 可以鏡像保存整個目錄樹和文件系統。 可以很容易做到保持原來文件的許可權、時間、軟硬鏈接等等。 無須特殊許可權即 ...
  • 腳本書寫規範、shell腳本的執行方式、Shell中的變數說明、變數子串、shell中的數學運算 ...
  • 本節學習目的 1)分析printk()函數 2)使用prink()調試驅動 1.在驅動調試中,使用printk(),是最簡單,最方便的辦法 當uboot的命令行里的“console=tty1”時,表示printk()輸出在開發板的LCD屏上 當uboot的命令行里的“console=ttySA0,1 ...
  • 安裝環境: linux版本: ubuntu-16.04.3-desktop-amd64 mysql版本:mysql-boost-5.7.20.tar.gz 下載地址:https://dev.mysql.com/downloads/mysql/ mysql安裝前的準備工作: 1,安裝cmake工具 s ...
  • Linux重要目錄,以思維導圖Xmind方式展現,附帶Xmind文件下載地址。 ...
  • @echo off&color 3a&set c=0123456789abcdefghijklmnopqrstuvwxyz title 批量替換文件(文件夾)名 echo. echo 此批處理可批量替換本文件所在文件夾下所有文件的文件名。 echo.echo.&set /p strtemp1= 請輸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...