- 分布式系統(tǒng)架構(gòu):技術(shù)棧詳解與快速進(jìn)階
- 張程
- 710字
- 2020-08-13 13:45:38
第5章
分布式架構(gòu)Varnish
Varnish是一款高性能且開源的反向代理服務(wù)器和HTTP加速器,主要通過緩存來實(shí)現(xiàn)Web訪問加速。它基于內(nèi)存進(jìn)行緩存,支持精確緩存時效,性能高效。其VCL配置管理比較靈活,支持后端服務(wù)器負(fù)載和健康檢查,內(nèi)部實(shí)現(xiàn)了負(fù)載均衡輪詢調(diào)用服務(wù)器。
本章重點(diǎn)內(nèi)容如下:
- Varnish工作原理
- Varnish源碼編譯安裝
- Varnish配置
- Varnish核心指令
- Varnish緩存
- Varnish處理策略
- Varnish健康檢查
- Varnish優(yōu)化
- Varnish高可用
5.1 Varnish工作原理
Varnish主要有兩個進(jìn)程,管理進(jìn)程(Management)和子進(jìn)程(Child)。其中,管理進(jìn)程主要負(fù)責(zé)配置變更、編譯VCL、監(jiān)控運(yùn)行、初始化、定期檢查子進(jìn)程(子進(jìn)程宕機(jī)會重新開啟);子進(jìn)程包括Worker線程、Acceptor線程、Expiry線程,內(nèi)部使用workspace工作區(qū)來減少多個線程間對內(nèi)存的競爭。
Varnish工作模型圖如圖5-1所示。

圖5-1 Varnish工作模型圖
如圖5-1所示,Varnish的工作流程如下。
1)Varnish的某個負(fù)責(zé)接收新HTTP連接的線程開始等待用戶,如果有新的HTTP連接過來,它會負(fù)責(zé)接收,然后叫醒某個等待中的線程,并把具體的處理過程交給它。Worker線程讀入HTTP請求的URI,查找已有的object。如果命中則直接返回并回復(fù)用戶;如果沒有命中,則需要從后端服務(wù)器中讀取所請求的內(nèi)容并存到緩存中,然后再回復(fù)。
2)分配緩存的過程:Varnish緩存對象時,默認(rèn)會忽略體積過大的對象,因此會事先讀取對象(object)的大小,經(jīng)過默認(rèn)配置的驗(yàn)證和篩選,保證其自身緩存策略的高效性。
為了讀寫高效性,會將篩選后合適的對象(object)壓縮,壓縮過程中會從現(xiàn)有的空閑存儲結(jié)構(gòu)體中查找,找到最合適大小的空閑存儲塊并將object分配給它。如果空閑塊沒有用完,就用多余的內(nèi)存另外組成一個空閑存儲塊,掛到管理結(jié)構(gòu)體上。如果緩存已滿,就根據(jù)LRU機(jī)制,把最舊的object釋放掉。
3)釋放緩存的過程:有一個超時線程,檢測緩存中所有object的生存期,如果超出設(shè)定的TTL(Time To Live)還沒有被訪問,就刪除該object,并且釋放相應(yīng)的結(jié)構(gòu)體及存儲內(nèi)存。注意釋放時會檢查該存儲內(nèi)存塊前后空閑內(nèi)存塊,如果前后空閑內(nèi)存和該釋放內(nèi)存是連續(xù)的,就將它們合并成一塊更大的內(nèi)存。
4)整個文件緩存的管理,沒有考慮文件與內(nèi)存的關(guān)系,實(shí)際上認(rèn)為所有的object都在內(nèi)存中,如果內(nèi)存不足,系統(tǒng)會自動將其換到swap空間,而不需要Varnish程序去控制。
5)日志:為了與系統(tǒng)的其他部分進(jìn)行交互,Child進(jìn)程使用了可以通過文件系統(tǒng)接口進(jìn)行訪問的共享內(nèi)存日志(shared memory log),因此,如果某線程需要記錄信息,其僅需要持有一個鎖,而后向共享內(nèi)存中的某內(nèi)存區(qū)域?qū)懭霐?shù)據(jù),再釋放持有的鎖即可。為了減少競爭,每個worker線程都使用了日志數(shù)據(jù)緩存。
6)共享內(nèi)存日志大小一般為90MB,其分為兩部分,前一部分為計數(shù)器,后一部分為客戶端請求的數(shù)據(jù)。Varnish提供了多個不同的工具,如varnishlog、varnishncsa、varnishstat等,用以來分析共享內(nèi)存日志中的信息并以指定的方式進(jìn)行顯示。
Varnish的優(yōu)勢如下:
- Varnish支持更多的并發(fā)連接,因?yàn)閂arnish的TCP連接比squid快;
- Varnish訪問速度快,因?yàn)槠洳捎昧薞isual Page Cache技術(shù),直接從內(nèi)存中讀取數(shù)據(jù);
- Varnish通過管理端口,使用正則表達(dá)式批量清除部分緩存;
- Varnish量級輕且開源。
Varnish的缺點(diǎn)如下:
- 進(jìn)程一旦掛掉或重啟,緩存的數(shù)據(jù)將從內(nèi)存中完全釋放;
- 用多臺Varnish實(shí)現(xiàn)負(fù)載均衡時,每次請求都會落到不同的Varnish服務(wù)器中,可能會造成URL請求穿透到后端。
5.2 Varnish源碼編譯安裝
以Centos平臺編譯環(huán)境為例,安裝Make并編譯Varnish以及相關(guān)依賴插件的方法如代碼清單5-1所示。
代碼清單5-1 編譯Varnish以及依賴插件
#需要安裝編譯gcc,已安裝忽略 yum -y install gcc automake autoconf libtool make yum install gcc gcc-c++ #安裝pcre 正規(guī)表達(dá)式,已安裝忽略 wget http:// www.programming.cn/pcre/pcre-8.36.tar.gz tar -zxvf pcre-8.36.tar.gz cd pcre-8.36 ./configure --prefix=/usr/local/pcre/ make make install #安裝libedit-dev, 已安裝忽略 yum install libedit-dev* #安裝Varnish wget -c http:// repo.varnish-cache.org/source/varnish-3.0.1.tar.gz tar xzvf varnish-3.0.1.tar.gz cd varnish-3.0.1 ./configure --prefix=/usr/local/varnish PKG_CONFIG_PATH=/usr/lib/pkgconfig make make install
在Varnish的configure命令中,--prefix=path定義一個目錄,也就是Varnish的安裝目錄,用于存放服務(wù)器上的文件。默認(rèn)使用/usr/local/ varnish。
安裝成功后 /usr/local/varnish目錄如下:
bin etc include lib sbin share var
設(shè)置軟連接ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/,ln -s /usr/local/varnish/bin/* /usr/local/bin/,目的是讓里面的內(nèi)容暴露到外層,方便查看。
通過/usr/sbin -V查看varnish版本號,復(fù)制核心配置文件(default.vcl)到外層,如:cp /usr/local/varnish/share/doc/varnish/example.vcl /usr/local/varnish/default.vcl
啟動varnish的方法如下:
進(jìn)入cd /usr/sbin/ 運(yùn)行./varnished -f /usr/local/varnish/default.vcl -s malloc,32M -T 192.168.10.101:2000 -a 0.0.0.0:2222
其中,-s malloc表示存儲類型和容量,-T 192.168.10.101:2000表示指定管理IP和端口,-a 0.0.0.0:2222表示對外界提供Web服務(wù)的IP和端口。
關(guān)閉varnish的方法如下:
進(jìn)入cd /usr/sbin/ 運(yùn)行pkill varnished
通過Varnish代理運(yùn)行的方法如下:
外部地址端口(http://192.168.10.101:2222/zachary/demo/showtime)被Varnish代理成內(nèi)部地址端口(http://192.168.10.101:9021/zachary/demo/showtime),并可直接訪問Tomcat頁面。
Varnish提供了基于端口的管理方式,用戶可以通過telnet方式登錄到管理端口,對Varnish子進(jìn)程進(jìn)行啟動、關(guān)閉、查看狀態(tài)和清除緩存等操作,如代碼清單5-2所示。
代碼清單5-2 Varnish后臺管理
[root@varnish ~]#telnet 192.168.10.101 2000 Trying 192.168.10.101... Connected to localhost.localdomain (192.168.10.101). Escape character is '^]'. 200 154 ----------------------------- Varnish HTTP accelerator CLI. ----------------------------- Type 'help' for command list. Type 'quit' to close CLI session. #輸入"help"即可得到如下幫助信息 help 200 377 help [command] ping [timestamp] auth response quit banner status #顯示服務(wù)運(yùn)行狀態(tài) start #啟動Varnish的子服務(wù) stop #關(guān)閉Varnish的子服務(wù) stats #顯示服務(wù)的全部狀態(tài) #操作VCL配置文件的相關(guān)操作,如果要修改VCL文件 vcl.load <configname> <filename> vcl.inline <configname> <quoted_VCLstring> vcl.use <configname> #載入指定的配置文件 vcl.discard <configname> #丟棄指定的VCL配置文件 vcl.list #顯示當(dāng)前載入的VCL配置文件信息 vcl.show <configname> #可以顯示某個VCL文件的內(nèi)容 param.show [-l] [<param>] #用于顯示程序的運(yùn)行參數(shù) param.set <param> <value> #用于動態(tài)更改某個運(yùn)行參數(shù) purge.url <regexp> #用來清除指定規(guī)則的URL緩存 purge <field> <operator> <arg> purge.list #列出執(zhí)行過的規(guī)則
- Web前端開發(fā)簡明教程(HTML+CSS+JavaScript+jQuery)
- 網(wǎng)絡(luò)化聯(lián)合仿真的時間同步
- TMS320C55x DSP原理及應(yīng)用(第3版)
- 網(wǎng)絡(luò)工程設(shè)計與系統(tǒng)集成(第2版)
- ARM嵌入式體系結(jié)構(gòu)與接口技術(shù)(Cortex-A8版)
- 新型網(wǎng)絡(luò)體系結(jié)構(gòu)
- 計算思維的結(jié)構(gòu)
- 大學(xué)計算機(jī)基礎(chǔ)(第6版)
- TMS 320 F28x源碼解讀
- 計算機(jī)體系結(jié)構(gòu)基礎(chǔ)(第3版)
- GPU高性能運(yùn)算之CUDA
- 兼容ARM9的軟核處理器設(shè)計:基于FPGA
- 大模型時代的基礎(chǔ)架構(gòu):大模型算力中心建設(shè)指南
- 嵌入式系統(tǒng)開發(fā)基礎(chǔ)與實(shí)踐教程
- 計算機(jī)組成原理(基于x86-64架構(gòu))