天天看點

Varnish反向代理緩存伺服器緩存及加速

緩存及加速

高性能緩存伺服器

1.1 Varnish概述

一款高性能、開源的反向代理伺服器和緩存伺服器(一台varnish可以抵6台Squid)Varnish使用記憶體做為緩存裝置(純記憶體緩存伺服器方案),相對于Squid(采用硬碟緩存),擁有更快的緩存速度(varnish記憶體管理完全交給核心,但當緩存内容超過門檻值時,核心會自動将一部分緩存存入swap中,讓出記憶體)

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.Varnish中的VCL

VCL(Varnish Configuration Language)是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選項指定
後端存儲的類型包括:           

 file:使用特定的檔案存儲全部的緩存資料,并通過作業系統的mmap()系統函數調用将整個緩存檔案映射至記憶體區域(如果條件允許);

 malloc:使用malloc()函數調用在varnish啟動時向作業系統申請指定大小的記憶體空間以存儲緩存對象

 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用于設定緩存空間配置設定機關,預設機關是位元組,所有其它的大小都會被圓整

5.Varnish 的特點

 基于記憶體進行緩存,重新開機後資料将消失

 利用虛拟記憶體方式,I/O 性能好

 支援設定 0~60 秒精确緩存時間

 VCL 配置管理比較靈活

 32 位機器上緩存檔案大小為最大 2GB

 具有強大的管理功能

 狀态機設計巧妙,結構清晰

 利用二叉堆管理緩存檔案,可達到積極删除目的

6.Varnish與其餘主流軟體對比

Varnish反向代理緩存伺服器緩存及加速
Varnish反向代理緩存伺服器緩存及加速

7.Varnish與Squid對比

優點

 Varnish穩定性高,當Squid和Varnish同時完成相同負荷工作時,Squid發生故障的幾率高于Varnish,因為使用Squid要經常重新開機

 Varnish通路速度快,Varnish采用Visual Page Cache技術,所有緩存資料都直接從記憶體中讀取,而Squid從硬碟中讀取

 Varnish支援更多的并發連接配接,因為Varnish的TCP連接配接釋放要比Squid快,是以在高并發情況下可以支援更多的TCP連接配接

 Varnish可以通過管理端口,使用正規表達式批量的清除部分緩存

 Squid屬于單程序使用單核CPU,但Varnish通過fork形式打開多程序來處理,是以可以合理的使用所有核來處理相應的請求

缺點

 高并發下,Varnish消耗更多的CPU、I/O和記憶體資源

 Varnish程序一旦挂起、崩潰或重新開機,緩存的資料會從記憶體中釋放,此時所有的請求都會轉發到後端伺服器上,給後端伺服器造成很大壓力

 Varnish使用中如果單個url的請求通過HA/F5(負載均衡)每次請求到不同的Varnish伺服器中,被請求的Varnish伺服器都會被穿透到後端,而且同樣的請求會在多台伺服器上緩存,造成Varnish緩存的資源浪費,也造成性能下降

 Varnish不支援正向代理緩存

綜上所述在通路量很大的情況下推薦使用varnish的記憶體緩存方式啟動,而且後面需要跟多台squid伺服器。主要為了防止前面的varnish服務、伺服器被重新開機的情況下,前期肯定會有很多的穿透這樣squid可以擔當第二層CACHE,而且也彌補了varnish緩存在記憶體中重新開機都會釋放的問題

資源浪費的問題可以在負載均衡上做url哈希,讓單個url請求固定請求到一台varnish伺服器上,可以解決該問題

8. Varnish工作原理

Varnish反向代理緩存伺服器緩存及加速

 Receive狀态:請求處理入口狀态,根據VCL規則判斷該請求應該Pass或Pipe,還是進入Lookup(本地查詢)

 Lookup狀态:進入此狀态後,會在hash表中查找資料,若找到則進入Hit狀态,否則進入Miss狀态

 Fetch狀态:在Fetch狀态下,對請求進行後端擷取、發送請求、獲得資料,并進行本地存儲

 Deliver狀态:将擷取到的資料發送給用戶端,然後完成本次請求

 Pipe狀态:不通過varnish,開通“管道”,直接有後端真實的web 節點回複用戶端請求

9.案例:部署Varnish負載均衡高可用群集

Varnish反向代理緩存伺服器緩存及加速
Varnish反向代理緩存伺服器緩存及加速

10.環境準備(Varnish)

1、搭建環境

1)配置varnish的内網IP vim /etc/sysconfig/network-scripts/ifcfg-eth0

Varnish反向代理緩存伺服器緩存及加速

2)配置varnish的橋接IP vim /etc/sysconfig/network-scripts/ifcfg-eth1

Varnish反向代理緩存伺服器緩存及加速

3)關閉防火牆 /etc/init.d/iptables stop&& chkconfig --level 35 iptables off

4)關閉selinux vim /etc/sysconfig/selinux

Varnish反向代理緩存伺服器緩存及加速

5)重新開機 reboot

2、安裝Varnish

1)安裝varnish依賴開發環境 yum –y install install libtool ncurses-devel pcre-devel libxslt groff pkgconfig gcc gcc-c++ libedit-devel-2.11-4.20080712cvs.1.el6.x86_64 python-imaging-1.1.6-19.el6.x86_64 python-docutils-0.6-1.el6.noarch

Varnish反向代理緩存伺服器緩存及加速

3、安裝varnish

1)上傳varnish包并解壓到/usr/src/下 tar -zxvf varnish-4.0.1.tgz -C /usr/src/

Varnish反向代理緩存伺服器緩存及加速

2)先運作腳本autogen.sh會自動設定libtool變量等資訊 source autogen.sh

Varnish反向代理緩存伺服器緩存及加速

3)編譯varnish ./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings

Varnish反向代理緩存伺服器緩存及加速

選項解釋:

--enable-debugging-symbols:開啟調試,調試一些bug資訊的标志,預設為“NO”

--enable-developer-warnings:啟用提示警告,預設為“NO”

4)安裝varnish make && make install

Varnish反向代理緩存伺服器緩存及加速

5)将varnish指令加入全局環境變量

echo“PATH=$PATH:/usr/local/varnish/bin/:/usr/local/varnish/sbin/”>>/etc/profil

Varnish反向代理緩存伺服器緩存及加速

6)立即生效全局變量 source /etc/profile

Varnish反向代理緩存伺服器緩存及加速

4、配置Varnish

1)拷貝預設的varnish配置檔案到varnish目錄下

cp /usr/local/varnish/share/doc/varnish/example.vcl /usr/local/varnish/default.vcl

Varnish反向代理緩存伺服器緩存及加速

2)編輯varnish配置檔案 vim /usr/local/varnish/default.vcl

Varnish反向代理緩存伺服器緩存及加速
Varnish反向代理緩存伺服器緩存及加速

釋:

import directors; //加載directors子產品,提供負載均衡

backend web1 { //定義後端伺服器的辨別名稱

.host = "192.168.1.100"; //定義後端伺服器的IP

.port = "80"; //定義後端伺服器監聽端口

.probe = { //開啟健康檢查

.url = "/"; //檢查請求的URL(請求伺服器的網頁根目錄)

.interval = 5s; //查詢的間隔時長(每隔幾秒檢測一次)

.timeout = 1s; //逾時時間,即等待後端1s都無響應即為故障

.window = 5; //判斷健康狀态時,依最近多少次的檢測作為依據

.threshold = 3; //.window指定次數中,3次成功,才代表後端健康

}

sub vcl_init { //VCL初始化VMODs子產品,定義director

new bar = directors.round_robin(); //定義排程算法,該處為權重輪詢

bar.add_backend(web1); //添加辨別名稱為web1的加入director

bar.add_backend(web2); //添加辨別名稱為web2的加入director

sub vcl_recv {

set req.backend_hint = bar.backend(); //将所有的流量轉發給dictctors

3)檢測VCL配置是否有誤,如輸出一系列的内置配置,即無問題(目前無問題)

varnishd -C -f /usr/local/varnish/default.vcl

Varnish反向代理緩存伺服器緩存及加速

4)啟動varnish并監聽目前服務80端口

varnishd -f /usr/local/varnish/default.vcl -a 0.0.0.0:80

5)檢視監聽的varnish服務 netstat -utpln | grep varnish

Varnish反向代理緩存伺服器緩存及加速

6)動态輸出varnish的緩存及用戶端通路完整情況(通路時出現日志) varnishlog(指令)

varnish 指令參數

 -f:指定varnish伺服器的配置檔案

 -aaddress:port:表示varnish對httpd的監聽位址及端口

 -Taddress:port:設定varnish的 telnet管理位址及端口

 -baddress:port:表示後端伺服器的位址及端口

 -d:表示使用debug調試模式

 -Pfile:varnish程序PID檔案存放路徑

 -s:varnish緩存檔案位置與大小(-s file,檔案路徑,大小)

 -w:最小,最大線程和逾時時間(例:-w 1200,5 1200 10)

5、配置伺服器web1

1)配置IP位址 vim /etc/sysconfig/network-scripts/ifcfg-eth0

Varnish反向代理緩存伺服器緩存及加速

2)yum安裝httpd(apache) yum -y install httpd

Varnish反向代理緩存伺服器緩存及加速

3)編輯測試網頁 echo "This is Web1">/var/www/html/index.html

Varnish反向代理緩存伺服器緩存及加速

4)啟動httpd服務 /etc/init.d/httpd start

Varnish反向代理緩存伺服器緩存及加速

5)設定httpd服務35級别開機自啟 chkconfig --level 35 httpd on

Varnish反向代理緩存伺服器緩存及加速

6)關閉防火牆 /etc/init.d/iptables stop && chkconfig --level 35 iptables off

Varnish反向代理緩存伺服器緩存及加速

7)臨時允許所有Selinux操作 setenforce 0

Varnish反向代理緩存伺服器緩存及加速

6、配置伺服器web2

7、測試

8、測試高可用