1. 程式人生 > >WEB快取系統之varnish代理以及健康狀態檢測配置

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

  前文我們聊了下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;說明我們配置後端主機健康狀態監測是沒有問題