天天看點

高性能緩存加速器varnish(概念篇)

高性能緩存加速器varnish(概念篇)

一、varnish簡介

varnish是一款高性能的開源HTTP加速器,現在很多門戶網站已經部署了varnish,并且反應都很好,甚至反應比squid還穩定,且效率更高,資源暫用更少。

作者Poul-Henning Kamp是FreeBSD的核心開發者之一。Varnish采用全新的軟體體系架構,和現在的硬體送出配合緊密。在1975年時,儲存媒介隻有兩種:記憶體與硬碟。但現在計算 機系統的記憶體除了主存外,還包括了cpu内的L1、L2,甚至有L3快取。硬碟上也有自己的快取裝置,是以squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但作業系統可以得知這些情況,是以這部份的工作應該交給作業系統處理,這就是 Varnish cache設計架構。

挪威最大的線上報紙 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原來的12台squid,性能居然比以前更好,這是Varnish最成功的應用案例。

二、varnish的特點

Varnish是一個輕量級的Cache和反向代理軟體。先進的設計理念和成熟的設計架構是Varnish的主要特點。現在的Varnish總共代碼量不大,雖然功能在不斷改進,但是還需要繼續豐富和加強。下面是Varnish的一些特點:

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

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

3. 支援設定0~60秒的精确緩存時間

4. VCL配置管理比較靈活

5. 32位機器上緩存檔案大小最大為2G

6. 具有強大的管理功能,例如top、stat、admin、list等

7. 狀态機設定巧妙,結構清晰

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

三、varnish和squid的對比

Squid是一個高性能的代理緩存伺服器,它和varnish之間有諸多的異同點,如下:

1、相同點:

1) 都是一個反向代理伺服器

2) 都是開源軟體

2、不同點,也是Varnish的優點:

1) Varnish的穩定性很高,兩者在完成相同負荷的工作時,Squid伺服器發生故障的幾率要高于Varnish,因為使用Squid要經常重新開機。

2) Varnish通路速度更快,Varnish采用了“Visual Page Cache”技術,所有緩存資料都直接從記憶體讀取,而squid是從硬碟讀取,因而Varnish在通路速度方面會更快。

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

4) Varnish可以通過管理端口,使用正規表達式批量的清除部分緩存,而Squid是做不到的。

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

四、Varnish的不足和解決方案

1、varnish的不足

與傳統的Squid相比,Varnish也是有缺點的,如下:

1) varnish程序一旦挂起、崩潰或者重新開機,緩存資料都會從記憶體中完全釋放,此時所有請求都會發送到後端伺服器,在高并發情況下,會給後端伺服器造成很大壓力。

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

2、解決方案

綜上所述在通路量很大的情況下推薦使用varnish的記憶體緩存方式啟動,而且後面需要跟多台squid伺服器。主要為了防止前面的varnish服務、伺服器被重新開機的情況下,前期肯定會有很多的穿透這樣squid可以擔當第二層cache,而且也彌補了varnish緩存在記憶體中重新開機都會釋放的問題。這樣的問題可以在負載均衡上做url哈希,讓單個url請求固定請求到一台varnish伺服器上,可以解決該問題。

五、varnish的工作流程

varnish啟動有2個程序,master(management)程序和child(worker)程序。master讀入存儲配置指令,進行初始化,然後fork,監控child。child則配置設定線程進行cache工作,child還會做管理線程和生成很多worker線程。

child程序主線程初始化過程中,将存儲大檔案整個加載到記憶體中,如果該檔案超出系統的虛拟記憶體,則會減少原來配置mmap大小,然後繼續加載,這時候建立并初始化空閑存儲結構體,放在存儲管理的struct中,等待配置設定。

接着varnish某個負責接口新http連接配接的線程開始等待使用者,如果有新的http連接配接,但是這個線程隻負責接收,然後喚醒等待線程池中的work線程,進行請求處理。

worker線程讀入uri後,将會查找已有的object,命中直接傳回,沒有命中,則會從後端伺服器中取出來,放到緩存中。

繼續閱讀