版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、簡介Varnish 是一款高性能且開源的反向代理服務(wù)器和 HTTP 加速器,其采用全新的軟件體系機構(gòu),和現(xiàn)在的硬件體系緊密配合,與傳統(tǒng)的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優(yōu)點;目前最新版本是4.0.0,而3.x的版本也是可以生產(chǎn)環(huán)境下使用的穩(wěn)定版本,但yum源中的2.x版本過于陳舊,不建議使用;Varnish與Squid的對比相同點· 都是一個反向代理服務(wù)器;· 都是開源軟件;Varnish的優(yōu)勢· Varnish的穩(wěn)定性很高,兩者在完成相同負荷的工作時,Squid服務(wù)器發(fā)生故障的幾率要高于Varnish,因為使用Squ
2、id要經(jīng)常重啟;· Varnish訪問速度更快,因為采用了“Visual Page Cache”技術(shù),所有緩存數(shù)據(jù)都直接從內(nèi)存讀取,而squid是從硬盤讀取,因而Varnish在訪問速度方面會更快;· Varnish可以支持更多的并發(fā)連接,因為Varnish的TCP連接釋放要比Squid快,因而在高并發(fā)連接情況下可以支持更多TCP連接;· Varnish可以通過管理端口,使用正則表達式批量的清除部分緩存,而Squid是做不到的;· squid屬于是單進程使用單核CPU,但Varnish是通過fork形式打開多進程來做處理,所以可以合理的使用所有核來處理相
3、應(yīng)的請求;Varnish的劣勢· varnish進程一旦Hang、Crash或者重啟,緩存數(shù)據(jù)都會從內(nèi)存中完全釋放,此時所有請求都會發(fā)送到后端服務(wù)器,在高并發(fā)情況下,會給后端服務(wù)器造成很大壓力;· 在varnish使用中如果單個url的請求通過HA/F5等負載均衡,則每次請求落在不同的varnish服務(wù)器中,造成請求都會被穿透到后端;而且同樣的請求在多臺服務(wù)器上緩存,也會造成varnish的緩存的資源浪費,造成性能下降;Varnish劣勢的解決方案· 針 對劣勢一:在訪問量很大的情況下推薦使用varnish的內(nèi)存緩存方式啟動,而且后面需要跟多臺squid服務(wù)器。主
4、要為了防止前面的varnish服 務(wù)、服務(wù)器被重啟的情況下,大量請求穿透varnish,這樣squid可以就擔(dān)當(dāng)?shù)诙覥ACHE,而且也彌補了varnish緩存在內(nèi)存中重啟都會釋 放的問題;· 針對劣勢二:可以在負載均衡上做url哈希,讓單個url請求固定請求到一臺varnish服務(wù)器上;對比Varnish 3.x的主要改進· 完全支持流對象;· 可后臺獲取失效的對象,即Client/backend分離;· 新的vanishlog查詢語言,允許對請求進行自動分組;· 復(fù)雜的請求時間戳和字節(jié)計數(shù);· 安全方面的提升;涉及VCL語法的改變
5、點· vcl配置文件需明確指定版本:即在vcl文件的第一行寫上 vcl 4.0;· vcl_fetch函數(shù)被vcl_backend_response代替,且req.*不再適用vcl_backend_response;· 后端源服務(wù)器組director成為varnish模塊,需import directors后再在vcl_init子例程中定義;· 自定義的子例程(即一個sub)不能以vcl_開頭,調(diào)用使用call sub_name;· error()函數(shù)被synth()替代;· return(lookup)被return(hash)替代
6、;· 使用beresp.uncacheable創(chuàng)建hit_for_pss對象;· 變量req.backend.healty被std.healthy(req.backend)替代;· 變量req.backend被req.backend_hint替代;· 關(guān)鍵字remove被unset替代;詳見: /docs/4.0/whats-new/index.html#whats-new-index架構(gòu)及文件緩存的工作流程· Varnish 分為 master 進程和 child 進程;
7、83; Master 進程讀入存儲配置文件,調(diào)用合適的存儲類型,然后創(chuàng)建 / 讀入相應(yīng)大小的緩存文件,接著 master 初始化管理該存儲空間的結(jié)構(gòu)體,然后 fork 并監(jiān)控 child 進程;· Child 進程在主線程的初始化的過程中,將前面打開的存儲文件整個 mmap 到內(nèi)存中,此時創(chuàng)建并初始化空閑結(jié)構(gòu)體,掛到存儲管理結(jié)構(gòu)體,以待分配;· 對外管理接口分為3種,分別是命令行接口、Telnet接口和Web接口;· 同時在運行過程中修改的配置,可以由VCL編譯器編譯成C語言,并組織成共享對象(Shared Object)交由Child進程加載使用;Child 進
8、程分配若干線程進行工作,主要包括一些管理線程和很多 worker 線程,可分為:· Accept線程:接受請求,將請求掛在overflow隊列上;· Work線程:有多個,負責(zé)從overflow隊列上摘除請求,對請求進行處理,直到完成,然后處理下一個請求;· Epoll線程:一個請求處理稱為一個session,在session周期內(nèi),處理完請求后,會交給Epoll處理,監(jiān)聽是否還有事件發(fā)生;· Expire線程:對于緩存的object,根據(jù)過期時間,組織成二叉堆,該線程周期檢查該堆的根,處理過期的文件,對過期的數(shù)據(jù)進行刪除或重取操作;HTTP請求基本處理
9、流程Varnish 處理 HTTP 請求的過程如下1. Receive 狀態(tài)(vcl_recv):也就是請求處理的入口狀態(tài),根據(jù) VCL 規(guī)則判斷該請求應(yīng)該 pass(vcl_pass)或是 pipe(vcl_pipe),還是進入 lookup(本地查詢);2. Lookup 狀態(tài):進入該狀態(tài)后,會在 hash 表中查找數(shù)據(jù),若找到,則進入 hit(vcl_hit)狀態(tài),否則進入 miss(vcl_miss)狀態(tài);3. Pass(vcl_pass)狀態(tài):在此狀態(tài)下,會直接進入后端請求,即進入 fetch(vcl_fetch)狀態(tài);4. Fetch(vcl_fetch)狀態(tài):在 fetch 狀態(tài)
10、下,對請求進行后端獲取,發(fā)送請求,獲得數(shù)據(jù),并根據(jù)設(shè)置進行本地存儲;5. Deliver(vcl_deliver)狀態(tài):將獲取到的數(shù)據(jù)發(fā)給客戶端,然后完成本次請求;注:Varnish4中在vcl_fetch部分略有出入,已獨立為vcl_backend_fetch和vcl_backend_response2個函數(shù);內(nèi)置函數(shù)(也叫子例程)· vcl_recv:用于接收和處理請求;當(dāng)請求到達并成功接收后被調(diào)用,通過判斷請求的數(shù)據(jù)來決定如何處理請求;· vcl_pipe:此函數(shù)在進入pipe模式時被調(diào)用,用于將請求直接傳遞至后端主機,并將后端響應(yīng)原樣返回客戶端;· vcl
11、_pass:此函數(shù)在進入pass模式時被調(diào)用,用于將請求直接傳遞至后端主機,但后端主機的響應(yīng)并不緩存直接返回客戶端;· vcl_hit:在執(zhí)行 lookup 指令后,在緩存中找到請求的內(nèi)容后將自動調(diào)用該函數(shù);· vcl_miss:在執(zhí)行 lookup 指令后,在緩存中沒有找到請求的內(nèi)容時自動調(diào)用該方法,此函數(shù)可用于判斷是否需要從后端服務(wù)器獲取內(nèi)容;· vcl_hash:在vcl_recv調(diào)用后為請求創(chuàng)建一個hash值時,調(diào)用此函數(shù);此hash值將作為varnish中搜索緩存對象的key;· vcl_purge:pruge操作執(zhí)行后調(diào)用此函數(shù),可用于構(gòu)建一
12、個響應(yīng);· vcl_deliver:將在緩存中找到請求的內(nèi)容發(fā)送給客戶端前調(diào)用此方法;· vcl_backend_fetch:向后端主機發(fā)送請求前,調(diào)用此函數(shù),可修改發(fā)往后端的請求;· vcl_backend_response:獲得后端主機的響應(yīng)后,可調(diào)用此函數(shù);· vcl_backend_error:當(dāng)從后端主機獲取源文件失敗時,調(diào)用此函數(shù);· vcl_init:VCL加載時調(diào)用此函數(shù),經(jīng)常用于初始化varnish模塊(VMODs)· vcl_fini:當(dāng)所有請求都離開當(dāng)前VCL,且當(dāng)前VCL被棄用時,調(diào)用此函數(shù),經(jīng)常用于清理var
13、nish模塊;VCL中內(nèi)置公共變量變量(也叫object)適用范圍注:某些地方略有出入,詳細可參考官方文檔;變量類型詳解· req:The request object,請求到達時可用的變量· bereq:The backend request object,向后端主機請求時可用的變量· beresp:The backend response object,從后端主機獲取內(nèi)容時可用的變量· resp:The HTTP response object,對客戶端響應(yīng)時可用的變量· obj:存儲在內(nèi)存中時對象屬性相關(guān)的可用的變量具體變量詳見:
14、0;/docs/4.0/reference/vcl.html#reference-vcl優(yōu)雅模式(Garce mode)Varnish中的請求合并當(dāng)幾個客戶端請求同一個頁面的時候,varnish只發(fā)送一個請求到后端服務(wù)器,然后讓其他幾個請求掛起并等待返回結(jié)果;獲得結(jié)果后,其它請求再復(fù)制后端的結(jié)果發(fā)送給客戶端;但如果同時有數(shù)以千計的請求,那么這個等待隊列將變得龐大,這將導(dǎo)致2類潛在問題:· 驚群問題(thundering herd problem),即突然釋放大量的線程去復(fù)制后端返回的結(jié)果,將導(dǎo)致負載急速上升;· 沒有用
15、戶喜歡等待;故為了解決這類問題,可以配置varnish在緩存對象因超時失效后再保留一段時間,以給那些等待的請求返回過去的文件內(nèi)容(stale content),配置案例如下:sub vcl_recv if (! req.backend.healthy) set req.grace = 5m; else set req.grace = 15s;sub vcl_fetch set beresp.grace = 30m;# 以上配置表示varnish將會將失效的緩存對象再多保留30分鐘,此值等于最大的req.grace值即可;# 而根據(jù)后端主機的健康狀況,varnish可向前端請求分別提供5分鐘內(nèi)或
16、15秒內(nèi)的過期內(nèi)容安裝配置# 安裝包下載地址:/redhat/varnish-4.0/el6/yum localinstall -nogpgcheck varnish-4.0.0-1.el6.x86_64.rpm varnish-libs-4.0.0-1.el6.x86_64.rpm varnish-docs-4.0.0-1.el6.x86_64.rpmvi /etc/sysconfig/varnish # 編輯配置文件,修改如下項VARNISH_STORAGE_SIZE=100M # 此值根據(jù)自身情況調(diào)整,測試環(huán)境可調(diào)低此值VARNIS
17、H_STORAGE="malloc,$VARNISH_STORAGE_SIZE" # Varnish 4中默認使用malloc(即內(nèi)存)作為緩存對象存儲方式;service varnish start # 啟動varnish,默認外部請求的監(jiān)聽端口6081,管理端口6082,后端主機:80=varnishadm -S /etc/varnish/secret -T :6082 # 登錄管理命令行varnish> vcl.list # 列出所有的配置varnish> vcl.load test1 test.vcl # 加載編譯新配
18、置,test1是配置名,test.vcl是配置文件varnish> vcl.use test1 # 使用配置,需指定配置名,當(dāng)前使用的配置以最后一次vcl.use為準varnish> vcl.show test1 # 顯示配置內(nèi)容,需指定配置名實例解析# This is an example VCL file for Varnish.# It does not do anything by default, delegating control to the# builtin VCL. The builtin VCL is called when there is no expli
19、cit# return statement.# See the VCL chapters in the Users Guide at /docs/# and /trac/wiki/VCLExamples for more examples.# Marker to tell the VCL compiler that this VCL has been adapted to the# new 4.0 format.vcl 4.0;import directors;probe backend_he
20、althcheck # 創(chuàng)建健康監(jiān)測 .url = /health.html; .window = 5; .threshold = 2; .interval = 3s;backend web1 # 創(chuàng)建后端主機 .host = "" .port = "80" .probe = backend_healthcheck;backend web2 .host = "" .port = "80" .probe = backend_healthcheck;backend img1 .host = "" .
21、port = "80" .probe = backend_healthcheck;backend img2 .host = "" .port = "80" .probe = backend_healthcheck;vcl_init # 創(chuàng)建后端主機組,即directors new web_cluster = directors.random(); web_cluster.add_backend(web1); web_cluster.add_backend(web2); new img_cluster = directors.rando
22、m(); img_cluster.add_backend(img1); img_cluster.add_backend(img2);acl purgers # 定義可訪問來源IP "" ""/24;sub vcl_recv if (req.request = "GET" && req.http.cookie) # 帶cookie首部的GET請求也緩存 return(hash); if (req.url "test.html") # test.html文件禁止緩
23、存 return(pass); if (req.request = "PURGE") # PURGE請求的處理 if (!client.ip purgers) return(synth(405,"Method not allowed"); return(hash); if (req.http.X-Forward-For) # 為發(fā)往后端主機的請求添加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; if (req.http.host "(?i)(www.)?$") # 根據(jù)不同的訪問域名,分發(fā)至不同的后端主機組 set req.http.host = "" set req.backend_hint = web_cluster.backend(); elsif (req.http.host "(?i)$") set req.backend_hint = img_cluster
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一體化物業(yè)管理與維護服務(wù)協(xié)議范本版A版
- 二零二五年度鮮活農(nóng)產(chǎn)品運輸合同協(xié)議及保鮮技術(shù)要求3篇
- 2025年度智能制造廠房租賃居間服務(wù)協(xié)議4篇
- 2024版有關(guān)服務(wù)的合同匯編
- 專業(yè)技術(shù)資訊檢索服務(wù)協(xié)議范本一
- 2025年度廠房建設(shè)項目工程監(jiān)理合同范本4篇
- 2025年度茶葉產(chǎn)品追溯系統(tǒng)建設(shè)合同4篇
- 專用飲用水品質(zhì)保障合同范本2024版B版
- 2025年度常年法律顧問專項服務(wù)合同7篇
- 2025年度體育健身中心場地租賃及會員服務(wù)合同4篇
- 《流感科普宣教》課件
- 離職分析報告
- 春節(jié)家庭用電安全提示
- 醫(yī)療糾紛預(yù)防和處理條例通用課件
- 廚邦醬油推廣方案
- 乳腺癌診療指南(2024年版)
- 高三數(shù)學(xué)寒假作業(yè)1
- 保險產(chǎn)品創(chuàng)新與市場定位培訓(xùn)課件
- (完整文本版)體檢報告單模版
- 1例左舌鱗癌手術(shù)患者的圍手術(shù)期護理體會
- 鋼結(jié)構(gòu)牛腿計算
評論
0/150
提交評論