WEB緩存系統之varnish代理以及健康狀態檢測配置

来源:https://www.cnblogs.com/qiuhom-1874/archive/2020/04/10/12673089.html
-Advertisement-
Play Games

對於varnish來講,對後端主機做健康狀態監測的原理是請求後端主機特定的資源,如果能夠在指定的超時時長內正確響應我們就認為後端主機上健康狀態的,如果不能正確的響應我們就認為該後端主機上不健康的;在varnish中對後端主機做健康狀態監測需要用.probe 來引入一段上下文配置,明確的說明怎麼對後... ...


  前文我們聊了下varnish的緩存項修剪配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12666406.html;今天我來說一下varnish作為代理伺服器反向代理多主機的配置;前邊的所有操作都是針對後端主機只有一臺的情況來說varnish的配置;在生產環境中,我們的web站點伺服器不應該只有一臺;預設情況下才安裝好varnish的主機,在default.vcl中只可以指定一臺後端主機的地址和埠;如果我們後端主機是多台的情況下,我們需要載入varnish的模塊directors;然後用backend+後端主機名稱(這個名稱是我們自定義的,只要是一合法名稱即可),來分別把每個主機的地址和埠配置好即可;

  示例:

   提示:以上每個紅框中的內容表示一臺後端server;以上配置表示定義兩台後端主機,其名稱分別為webserver1和webserver2;

  把主機定義好後,這裡還需要用在vcl_init狀態引擎中配置初始化一個組,然後把這兩台主機加到對應的組中;

  示例:

   提示:以上配置表示用directors模塊中的round_robin()方法初始化一個組對象,取名叫webserver;然後把對應兩台主機加入到這個初始化組對象中;這意味著這個組裡有兩個成員,一個是webserver1,一個是webserver2;directors.round_robin()用這個方法初始化組對象表示往後端調度的演算法是輪詢,即沒有權重;要想有權重,需要用directors.random()方法;如果需要做會話保持,需要用到directors.hash()方法;

  示例:初始化組對象用randomf方法

   提示:用random方法就在後面加權重;

  示例:初始化組對象用hash方法來保持會話

   提示:hash方法也是支持權重的;

  到此我們就把兩台後端主機加入到webserver組中了;現在我們可以編譯載入我們的配置文件,然後用varnishadm工具連接到控制管理shell中查看後端主機列表;

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29

Type 'help' for command list.
Type 'quit' to close CLI session.


varnish> vcl.list 
200        
active          0 boot


varnish> vcl.load test default.vcl
200        
VCL compiled.

varnish> vcl.list 
200        
active          0 boot
available       0 test


varnish> vcl.use test
200        
VCL 'test' now active

varnish> backend.list 
200        
Backend name                   Refs   Admin      Probe
webserver1(192.168.0.10,,80)   2      probe      Healthy (no probe)
webserver2(192.168.0.99,,80)   2      probe      Healthy (no probe)

varnish> quit
500        
Closing CLI connection
[root@test_node1-centos7 ~]# 

  提示:可以看到我們編寫的vcl把多台主機加入到webserver組的配置生效了;從上面的配置看,後端主機有兩台,一臺是webserver1,一臺是webserver2;

  測試:用curl命令訪問192.168.0.99:8000 看看是否把用戶請求分別調度到後端個server上去了?

   提示:從上面的結果看,好像沒有把用戶的請求調度到server1上去;原因是我們沒有配置說明把所有未命中緩存的請求發送到後端主機上去,它預設是把第一次匹配backend 關鍵字+名稱的配置當作預設主機;所以這裡我們怎麼訪問都調度到192.168.0.10這台主機上去;

  示例:在vcl_recv中調用我們之前定義的組,明確說明把未命中緩存的請求發送到該組上;

   提示:以上紅框中的內容表示把用戶請求發送到我們定義好的組上的主機;

  測試:

   提示:從上面的結果看,我們定義的主機上基於輪詢的方式在往後端調度;這裡測試需要把varnish上的緩存項給修剪掉,然後再次請求才可以看到把請求調度到不同主機上;

以上就是varnish代理多主機的配置方法,總結如下:

  1)首先我們要導入directors模塊;

  2)用backend關鍵字來定義後端主機,起一名稱,用花括弧引入一段上下文,裡面用.host指定後端主機的IP地址,用.port指定後端主機埠;

  3)在vcl_init狀態引擎中初始化一個組對象,然後用組對象的add_backend(server)把對應主機加入到該組;

  4)在vcl_recv狀態引擎中使用我們初始化好的組對象;用set req.backend_hint = 組對象中的backend();表示把為能命中的用戶請求發送到該組上,至於用輪詢還是加權輪詢還是hash,取決於我們初始化組對象用到的方法;

  瞭解了varnish代理多台主機的配置後,接下來我們再來說說varnish對後端主機做健康狀態監測的配置;對於varnish來講,對後端主機做健康狀態監測的原理是請求後端主機特定的資源,如果能夠在指定的超時時長內正確響應我們就認為後端主機上健康狀態的,如果不能正確的響應我們就認為該後端主機上不健康的;在varnish中對後端主機做健康狀態監測需要用.probe 來引入一段上下文配置,明確的說明怎麼對後端做健康狀態監測(或者用probe關鍵字+名稱來引入一段公有的健康狀態監測機制,後端多台主機可以用.probe +名稱引用);比如請求後端主機的那個url或者用.request來指定向後端主機發送的請求的報文;對後端主機的響應多少次我們認為是健康的,監測頻度,超時時長等等信息;

  示例:

   提示:以上紅框中的配置就表示對webserver1這台主機做健康狀態監測;其中.window表示基於最近的多少次檢查來判讀其健康狀態;.threshold表示最近.window中定義的檢查次數至少有多少次是成功的,我們就認為後端主機上健康的;.interval表示檢查的頻度,多久檢查一次;.timeout表示超長時長;綜上所述,該配置就表示對webserver1這台主機做健康狀態監測,如果每隔2秒,超時時長為1秒,請求該主機上的/index.html資源,在最近5次中有4次是成功的,我們就認為後端主機上健康的;

  當然以上是對一臺主機做健康狀態檢查的配置。如果是多台主機,監測的方式都是一樣的,我們可以把對健康狀態監測的配置單獨用probe + 名稱來定義監測機制;然後在個server中用.probe +名稱來應用我們定義的健康狀態監測的配置;

  示例:

   提示:以上配置就表示定義了一個健康狀態監測的配置其名稱為webserver_check,然後在個後端server的配置中用.probe來對webserver_check調用;意思就表示兩台主機都用同樣的監測配置;

  當然除了以上對rul請求外,我們也可使用向後端主機發送指定一的請求報文的形式來定義健康狀態監測機制;

  示例:

   提示:以上配置表示對於server1的健康狀態監測是向server1發送特定的請求首部,如果每隔2秒超時時長為1秒,在5次請求中有4次是200的響應碼,我們就認為該主機上健康的,否則不健康;對於server2主機的健康狀態監測是通過項該主機上的特定資源/index.html發起請求,如果每個2秒超時1秒的情況下,5次請求中有4次都是200的響應碼,我們就認為該主機上健康的,否則不健康;如果不指定.expected_response預設值就是200;

  測試:編譯載入default.vcl 看看我們配置的健康狀態監測是否正確

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29

Type 'help' for command list.
Type 'quit' to close CLI session.


varnish> vcl.load check_cfg default.vcl
200        
VCL compiled.

varnish> vcl.use check_cfg
200        
VCL 'check_cfg' now active

varnish> 

  提示:上面load過程沒有保存,說明我們配置後端伺服器健康狀體檢查的配置沒有問題;接下來測試把後端主機服務宕機,在管理shell中使用backend.list查看對應主機是否會變為sick?

   提示:通過上面的測試結果看,我們把後端主機192.168.0.10這台主機的httpd服務給停了,然後在看後端主機情況,立刻webserver1的狀態就變為了sick,我們接著又把服務給啟動起來,再看後端伺服器狀態,可看到當檢查到第四次是正常的響應後,狀態就變成health;說明我們配置後端主機健康狀態監測是沒有問題的;


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

-Advertisement-
Play Games
更多相關文章
  • bootstrap paginator 分頁 效果圖 1. Demo前的準備 1.1. 編程環境 VS2019 1.2. 準備 分頁插件(bootstrap paginator)下載: https://github.com/lyonlai/bootstrap paginator 下載後找到 這個為該 ...
  • 在做劍指offer的題目時,發現每次需要用到樹做為參數來測試自己寫的方法時,都很是痛苦。於是乎就萌生了寫一個利用數據生成樹的方法。簡單測試了下,沒什麼毛病。在這裡貼出來,如果以後發現有bug了會持續在後面更新,也歡迎大家指出其中的不足。 using System; using System.Coll ...
  • 進程守護工具 1.寫在前面 經常寫一些服務程式,有時要監測服務程式的運行狀態,所以就做了一個進程守護工具。 2.分析 通過Process.GetProcessesByName(ProcessName),獲得指定進程列表。 用Process.MainModule.FileName來判斷程式是否運行。 ...
  • public partial class Form1 : Form { CancellationTokenSource cts = new CancellationTokenSource(); public Form1() { InitializeComponent(); } private voi ...
  • 很多人使用力軟敏捷框架的一個困擾就是表格控制項,力軟並沒有使用常規的jqgrid,而是用了自己的一套 jfgrid。所以今天在這做個簡單的說明,如果你有什麼疑問也可以在評論區提出來,後期的文章會做說明。 首先來講下jfgrid有哪些設置屬性: url 後臺請求地址 param 後臺請求參數 rowda ...
  • 1.環境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.預設綁定 2.1.使用方法 Blazor中Razor組件通過一個名為@bind的HTML元素屬性提供數據綁定功 ...
  • 某些場景併發量太高,需要採用隊列輔助,特此備註:多線程隊列,先進先出 某些情況也會用到阻塞當前線程,等待伺服器返回或者耗時的處理,這種情況,可採用信號量輔助 1 ManualResetEvent allDone = new ManualResetEvent(false);//初始化,開啟阻塞 2 a ...
  • 原來的需求是控制項可見時有動畫,不可見的時候沒有動畫,只寫了EnterAction,沒寫ExitAction,以為空間都隱藏了,總不會再有動畫了。剛好該動畫在一個攝像頭獲取的視頻上面,動畫期間視頻有點卡,動畫隱藏了,視頻還是卡,於是弄了一下測試,發現不寫ExitAction動畫還是在動的。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...