1、varnish系統架構
varnish主要運作兩個程序:Management程序和Child程序(也叫Cache程序)。
Management程序主要實作應用新的配置、編譯VCL、監控varnish、初始化varnish以及提供一個指令行接口等。Management程序會每隔幾秒鐘探測一下Child程序以判斷其是否正常運作,如果在指定的時長内未得到Child程序的回應,Management将會重新開機此Child程序。
Child程序包含多種類型的線程,常見的如:
Acceptor線程:接收新的連接配接請求并響應;
Worker線程:child程序會為每個會話啟動一個worker線程,是以,在高并發的場景中可能會出現數百個worker線程甚至更多;
Expiry線程:從緩存中清理過期内容;
Varnish依賴“工作區(workspace)”以降低線程在申請或修改記憶體時出現競争的可能性。在varnish内部有多種不同的工作區,其中最關鍵的當屬用于管理會話資料的session工作區。
2、varnish日志
為了與系統的其它部分進行互動,Child程序使用了可以通過檔案系統接口進行通路的共享記憶體日志(shared memory log),是以,如果某線程需要記錄資訊,其僅需要持有一個鎖,而後向共享記憶體中的某記憶體區域寫入資料,再釋放持有的鎖即可。而為了減少競争,每個worker線程都使用了日志資料緩存。
共享記憶體日志大小一般為90M,其分為兩部分,前一部分為計數器,後半部分為用戶端請求的資料。varnish提供了多個不同的工具如varnishlog、varnishncsa或varnishstat等來分析共享記憶體日志中的資訊并能夠以指定的方式進行顯示。
3、VCL
Varnish Configuration Language (VCL)是varnish配置緩存政策的工具,它是一種基于“域”(domain specific)的簡單程式設計語言,它支援有限的算術運算和邏輯運算操作、允許使用正規表達式進行字元串比對、允許使用者使用set自定義變量、支援if判斷語句,也有内置的函數和變量等。使用VCL編寫的緩存政策通常儲存至.vcl檔案中,其需要編譯成二進制的格式後才能由varnish調用。事實上,整個緩存政策就是由幾個特定的子例程如vcl_recv、vcl_fetch等組成,它們分别在不同的位置(或時間)執行,如果沒有事先為某個位置自定義子例程,varnish将會執行預設的定義。
VCL政策在啟用前,會由management程序将其轉換為C代碼,而後再由gcc編譯器将C代碼編譯成二進制程式。編譯完成後,management負責将其連接配接至varnish執行個體,即child程序。正是由于編譯工作在child程序之外完成,它避免了裝載錯誤格式VCL的風險。是以,varnish修改配置的開銷非常小,其可以同時保有幾份尚在引用的舊版本配置,也能夠讓新的配置即刻生效。編譯後的舊版本配置通常在varnish重新開機時才會被丢棄,如果需要手動清理,則可以使用varnishadm的vcl.discard指令完成。
4、varnish的後端存儲
varnish支援多種不同類型的後端存儲,這可以在varnishd啟動時使用-s選項指定。後端存儲的類型包括:
(1)file:使用特定的檔案存儲全部的緩存資料,并通過作業系統的mmap()系統調用将整個緩存檔案映射至記憶體區域(如果條件允許);
(2)malloc:使用malloc()庫調用在varnish啟動時向作業系統申請指定大小的記憶體空間以存儲緩存對象;
(3)persistent(experimental):與file的功能相同,但可以持久存儲資料(即重新開機varnish資料時不會被清除);
varnish無法追蹤某緩存對象是否存入了緩存檔案,進而也就無從得知磁盤上的緩存檔案是否可用,是以,file存儲方法在varnish停止或重新開機時會清除資料。而persistent方法的出現對此有了一個彌補,但persistent仍處于測試階段,例如目前尚無法有效處理要緩存對象總體大小超出緩存空間的情況,是以,其僅适用于有着巨大緩存空間的場景。
選擇使用合适的存儲方式有助于提升系統性,從經驗的角度來看,建議在記憶體空間足以存儲所有的緩存對象時使用malloc的方法,反之,file存儲将有着更好的性能的表現。然而,需要注意的是,varnishd實際上使用的空間比使用-s選項指定的緩存空間更大,一般說來,其需要為每個緩存對象多使用差不多1K左右的存儲空間,這意味着,對于100萬個緩存對象的場景來說,其使用的緩存空間将超出指定大小1G左右。另外,為了儲存資料結構等,varnish自身也會占去不小的記憶體空間。
為varnishd指定使用的緩存類型時,-s選項可接受的參數格式如下:
malloc[,size] 或
file[,path[,size[,granularity]]] 或
persistent,path,size {experimental}
file中的granularity用于設定緩存空間配置設定機關,預設機關是位元組,所有其它的大小都會被圓整。
環境:
centos7.2
varnish server: 192.168.250.128
web server: 192.168.250.131
一、安裝varnish(版本5.1.2-1.el7)
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish5/script.rpm.sh | bash #######varnish 倉庫
yum install jemalloc varnish -y
systemctl restart varnish
systemctl enable varnish
二、配置
yum install httpd -y
systemctl restart httpd; systemctl enable httpd
建立測試頁
for i in {1..10};do echo "page $i on web1" > /var/www//html/test$i.html;done
vim /etc/varnish/default.vcl
backend default { ### 後端主機
.host = "192.168.250.131"; ###### 後端主機位址(web server)
.port = "80"; ############ 後端主機端口
}
測試通路:
<a href="https://s1.51cto.com/wyfs02/M02/95/41/wKiom1kTLYzgKD0SAAAd1XYwwsw785.png" target="_blank"></a>
三、varnishadm 介紹
-S:指定安全認證檔案
-T :127.0.0.1:6082 指定varnish 主機與管理端口
一般使用:varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 進入控制台
ping 檢測主機存活
status 伺服器狀态資訊
vcl.list 顯示vcl 加載的檔案
200 狀态碼
active auto/warm 0 boot 已激活 自動熱加載 編号0(可以了解為版本号,配置檔案改了以後,編号也會發生改變) 啟動時加載的一個名字
例如:
vcl.load test default.vcl
200
VCL compiled.
vcl.list
active auto/warm 0 boot
available auto/warm 0 test 可用的
vcl.use test 使用這個政策
VCL 'test' now active
available auto/warm 0 boot
active auto/warm 0 test 發現這個政策已被激活使用
vcl.use boot 應用這個政策
VCL 'boot' now active
vcl.discard test 删除政策
200
vcl.list 檢視
active auto/warm 0 boot
vcl.show boot 顯示編譯前的配置資訊
param.show 運作時參數
param.set thread_pools 4 設定參數值為4,建議有幾個cpu,設定為幾個線程池數
param.show -l thread_pools 單獨檢視一個 運作參數的詳細資訊,也可以不加-l 參數
panic.show 顯示子程序挂掉後的日志資訊
panic.clear 清除日志資訊
storage.list 顯示存儲類型(記憶體,檔案,持久化)
backend.list 顯示後端主機
ban.list 顯示 緩存模式及緩存次數(可以指定删除緩存中的一些資訊)
bans (預設模式):緩存過期後自動清零
四、varnish工具介紹(都是通過共享記憶體空間狀态擷取的)
log:
varnishlog:顯示緩存在記憶體中的日志資訊。
varnishncsa:顯示類似與web伺服器中的日志資訊。
狀态:
varnishtop:排序顯示緩存時的詳細資訊
varnishstat:顯示varnish狀态
本文轉自silence部落格51CTO部落格,原文連結http://blog.51cto.com/silencezone/1874793如需轉載請自行聯系原作者
a120518129