varnish介紹 varnish varnish的特點 varnish的工作原理 varnish的優缺點 varnish設計原則 存儲對象 對象生命周期 varnish的應用程式 varnish安裝 varnish程式架構 varnish的程式環境 ...
varnish介紹
varnish
官方網站
https://varnish-cache.org/
http://book.varnish-software.com/4.0/
Varnish是反向HTTP代理,有時被稱為gaHTTP加速器或Web加速器,反向代理是作為普通伺服器向客戶端顯示的代理伺服器。
varnish(高速緩存)存儲器中的文件或文件片段,用於減少將來的等效請求時的響應時間和網路帶寬消耗。
varnish設計用於現代硬體,現代操作系統和現代工作負載。
Varnish採用全新的軟體體繫結構,和現在的硬體體系配合比較緊密。
Varnish不僅僅是用緩存內容來加速你伺服器的反向HTTP代理,根據安裝情況,varnish也可以用作:
web應用防火牆,DDoS攻擊防禦者,熱鏈保護器,負載平衡器,整合點,單點登錄網關,認證授權策略機制,快速修複不穩定的後端和HTTP路由器。
varnish是靈活的,因為可以在其Varnish配置語言(VCL)中編寫自己的緩存策略,VCL是基於C的域特定語言,配置完成VCL後,將VCL轉換為C代碼併進行編譯,因此Varnish可以快速執行。
varnish的特點
Varnish基於記憶體緩存,重啟後數據將消失
利用虛擬記憶體方式,io性能好
支持設置0~60秒內的精確緩存時間
VCL配置管理比較靈活
32位機器上緩存文件大小為最大2G
具有強大的管理功能,例如top,stat,admin,list等
狀態機設計巧妙,結構清晰
利用二叉堆管理緩存文件,達到積極刪除目的
varnish的工作原理
Varnish 與一般伺服器軟體類似,分為master 進程和child 進程。
master進程讀入存儲配置文件,調用合適的存儲類型,然後創建/讀入相應大小的緩存文件,接著master 初始化管理該存儲空間的結構體,然後fork 並監控child 進程。child進程在主線程的初始化的過程中,將前面打開的存儲文件整個mmap 到記憶體中,此時創建並初始化空閑結構體,掛到存儲管理結構體,以待分配。
child進程分配若幹線程進行工作,主要包括一些管理線程和很多worker 線程。
varnish的某個負責接收新HTTP 連接線程開始等待用戶,如果有新的HTTP連接過來,它總負責接收,然後喚醒某個等待中的線程,並把具體的處理過程交給它。
Worker線程讀入HTTP 請求的URI,查找已有的object,如果命中則直接返回並回覆用戶,如果沒有命中,則需要將所請求的內容,從後端伺服器中取過來,存到緩存中,然後再回覆。
分配緩存的過程:
它根據所讀到object 的大小,創建相應大小的緩存文件。
為了讀寫方便,程式會把每個object的大小變為最接近其大小的記憶體頁面倍數。
然後從現有的空閑存儲結構體中查找,找到最合適的大小的空閑存儲塊,分配給它。
如果空閑塊沒有用完,就把多餘的記憶體另外組成一個空閑存儲塊,掛到管理結構體上。
如果緩存已滿,就根據LRU 機制,把最舊的object 釋放掉。
釋放緩存的過程:
有一個超時線程,檢測緩存中所有object 的生存期,如果超初設定的TTL(Time To Live)沒有被訪問,就刪除之,並且釋放相應的結構體及存儲記憶體。
註意釋放時會檢查該存儲記憶體塊前面或後面的空閑記憶體塊,如果前面或後面的空閑記憶體和該釋放記憶體是連續的,就將它們合併成更大一塊記憶體。
整個文件緩存的管理,沒有考慮文件與記憶體的關係,實際上是將所有的object 都考慮是在記憶體中,如果系統記憶體不足,系統會自動將其換到swap 空間,而不需要varnish 程式去控制。
varnish的優缺點
varnish的優點
Varnish採用了“Visual Page Cache”技術,所有緩存的數據都直接從記憶體讀取。
Varnish穩定性比Squid高,宕機率很低。
通過Varnish管理埠,可以使用正則表達式快速、批量地清除部分緩存。
Varnish可以支持更多的併發連接。
varnish的缺點
Varnish在高併發狀態下,CPU、I/O和記憶體等資源的開銷高於Squid。
Varnish的進程一旦掛起、崩潰或者重啟,緩存的數據都會從記憶體中釋放出來,此時的所有請求都會被髮送到後端應用伺服器上,在高併發的情況下,就會給後端伺服器造成很大壓力。
varnish設計原則
varnish設計目的:
解決實際問題
運行於現代硬體(64位多核架構)
與內核協同工作,而不是針對內核
將Varnish配置語言VCL翻譯成C語言
可通過varnish模塊VMODs擴展
通過其面向工作區的共用記憶體模型減少鎖定爭用
varnish的重點始終是性能和靈活性。
Varnish使用面向工作區的記憶體模型,而不是在運行時分配確切的空間空間。
varnish不管理其分配的記憶體,但它將此任務委托給操作系統,因為內核通常可以比用戶空間程式更好地執行此任務。
事件過濾器和通知設施,例如epoll和kqueue是操作系統的高級特性,這些特性是為像varnish這樣的高性能的伺服器設計的,通過使用這些特性,varnish可以移動大量的複雜信息到操作系統的內核中,這樣會更好地決定那些線程會被執行。
Varnish使用Varnish配置語言VCL,允許準確地指定如何使用和組合Varnish的功能。
VCL被翻譯成C編程語言代碼,該代碼使用標準C編譯器進行編譯,然後在運行時直接動態鏈接到Varnish中。
當你需要的功能在VCL中沒有提供時,你可以在資料庫中找到個ip地址,以便於你可以寫原始C編碼在自己的VCL上。
那個地址是線上的,但不鼓勵使用,相比於線上的C,建議把你的C編碼放入varnish的VMOD模塊中。
VMOD通常以VCL和C編程語言編碼,實際上,VMOD是一個共用庫,具有可以從VCL代碼調用的函數。
varnish共用存儲日誌(VSL)允許Varnish讓其他應用程式解析數據並提取有用的信息,這個過程幾乎無需花費時間。
存儲對象
對象:HTTP響應消息的本地存儲
varnish的對象存儲在記憶體中,並通過hash key進行定址
可以控制hashing
多個對象可以具有共同的hash
對象是本地存儲的響應信息且被定義在協議中,這些信息被映射為hash值並存儲在記憶體中,涉及到的相關對象被存儲hash樹中。
Varnish的一個相當獨特的功能是它允許你控制散列演算法的輸入。
預設情況下,hash key是由HTTP主機頭和URL製成,且非常重要。
但是,你也可以通過使用其他東西來創建hash key,例如,你可以使用Cookie或客戶端請求的用戶代理來創建hash key。
HTTP指定可以根據客戶端的偏好從相同的URL提供多個對象,例如,gzip格式的內容只發送到指示gzip支持的客戶端。
varnish在一個hash key下存儲單個壓縮對象。
根據客戶端請求,Varnish會檢查Accept-Encoding頭域。
如果客戶端不接受gzip對象,Varnish會即時解壓縮對象並將其發送給客戶端。
對象生命周期
圖中顯示了緩存對象的生命周期。
緩存對象具有原始時間戳t_origin和三個持續時間屬性:1)TTL,2)grace和3)keep。
t_origin是在後端創建對象的時間。
一個對象生活在緩存中,直到經過之後TTL + grace + keep,該對象被Varnish守護進程刪除。
VCL - vcl_backend_fetch和 VCL - vcl_backend_response有選擇的解釋了varnish是如何處理後端的響應以及這些時間屬性是如何影響後續行動的。
varnish的應用程式
varnish應用程式組成:
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/sbin/varnishd
。。。。
varnissh最重要的部分是守護進程(後臺服務)varnishd。
核心進程varnish的接收來自客戶端的HTTP請求,並將請求發送到後端backend,緩存返回的緩存的結果並回覆客戶端請求。
varnishtest是用於測試您的Varnish安裝的腳本驅動程式, varnishtest非常強大,因為它允許創建客戶端模型,從模型或真實的後端中獲取內容,與實際的Varnish配置交互,並說明預期的行為。
varnishadm控制正在運行的Varnish實例,該 varnishadm 實用程式建立在的命令行界面(CLI)連接的varnishd上,此實用程式是唯一可能影響運行的Varnish實例的實用程式,可以使用varnishadm開始和停止varnishd,更改配置參數,重新載入Varnish配置語言(VCL),查看最新的參數文檔等。
varnish日誌varnishlog提供大量信息,因此通常需要對其進行過濾。例如,“只顯示與X匹配的”。
varnishstat用於訪問全局計數器,它提供總體統計信息,例如請求總數,對象數量等, varnishstat在將其varnishlog用於分析您的varnish安裝時特別有用。
varnish安裝
varnish官方站點: http://www.varnish-cache.org/
直接下載安裝包進行安裝
採用epel源安裝
yum install varnish
rpm -ql varnish
/etc/logrotate.d/varnish
/etc/varnish
/etc/varnish/default.vcl
/etc/varnish/varnish.params
/run/varnish.pid
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib/systemd/system/varnish.service
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
/usr/sbin/varnish_reload_vcl
/usr/sbin/varnishd
/usr/share/doc/varnish-4.0.4
/var/lib/varnish
/var/log/varnish
varnish程式架構
Manager進程
Cacher進程,包含多種類型的線程:
accept, worker, expiry, ...
shared memory log:
統計數據:計數器;
日誌區域:日誌記錄;
varnishlog, varnishncsa, varnishstat...
配置介面:VCL(Varnish Configuration Language)
vcl complier --> c complier --> shared object
varnish的程式環境
varnish環境配置,配置varnish服務進程的工作特性,例如監聽的地址和埠,緩存機制:
/etc/varnish/varnish.params
VCL配置文件,配置各Child/Cache線程的緩存策略:
/etc/varnish/default.vcl
主程式:
/usr/sbin/varnishd
CLI interface:
/usr/bin/varnishadm
Shared Memory Log交互工具:
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
測試工具程式:
/usr/bin/varnishtest
VCL配置文件重載程式:
/usr/sbin/varnish_reload_vcl
Systemd Unit File:
/usr/lib/systemd/system/varnish.service:varnish服務
/usr/lib/systemd/system/varnishlog.service:varnish日誌服務
/usr/lib/systemd/system/varnishncsa.service :varnish日誌持久的服務