轉(zhuǎn)載自:扶凱[http://www.php-oa.com/]
配置成sibling時的工作原理.
默認(rèn)的,squid首先發(fā)送大多數(shù)的請求到鄰居cache,然后再到原始服務(wù)器。當(dāng)ICP查詢進(jìn)來時,squid通過檢查內(nèi)存索引,能告知它是否有更新的、緩存的響應(yīng)。squid會計算URI的MD5 hash值,并且在索引里查找它。假如沒有找到,squid返回ICP_MISS消息。假如找到了,squid檢查超時時間。假如目標(biāo)沒有刷新,squid返回ICP_MISS。對刷新的目標(biāo),squid返回ICP_HIT。
cache選擇的順序
選擇新鮮cache目標(biāo)的優(yōu)先級是:
local cache
parent
sibling
direct
對ICP的理解
因為ICP會更加快,所以這選擇ICP.
ICP是輕量級的目標(biāo)定位協(xié)議,它作為Harvest項目的一部分而被發(fā)明。ICP客戶發(fā)送查詢消息到一個或多個ICP服務(wù)器,詢問它們是否緩存了某個 URI(ICP查詢僅包含URI,沒有另外的請求頭部。這讓它很難精確的指示cache命中)。每個服務(wù)器響應(yīng)一個ICP_HIT(ICP命中),ICP_MISS(ICP丟失),或其他類型的ICP消息。ICP客戶使用ICP響應(yīng)里的信息來做轉(zhuǎn)發(fā)決定。
ICP也得承受某些設(shè)計不足帶來的責(zé)難:安全性,伸縮性,假命中,和請求方式的缺乏。該協(xié)議不包括任何安全機(jī)制。通常squid不能確認(rèn)某個ICP消息是可信的;它依賴于基于地址的訪問控制來過濾掉不想要的ICP消息。
ICP的伸縮性也很差。ICP消息的數(shù)量(和帶寬)增長,與鄰居cache的數(shù)量成正比。除非使用某種隔離機(jī)制,這實際上限制了你能使用的鄰居cache的數(shù)量。我不推薦擁有超過5或6個鄰居cache。
netdb主要用于ICP查詢.netdb是設(shè)計來測量到原始服務(wù)器的遠(yuǎn)近
有用的命令
log_icp_queries on #是否記錄指令來阻止記錄icp的日志從這些查詢
icp_hit_stale on
注意.它是告訴squid對任何cache住的目標(biāo),即使它是陳舊的,都返回ICP_HIT。這在父子關(guān)系的cache中很安全,但對姐妹關(guān)系的cache有問題。假如必須轉(zhuǎn)發(fā)所有的假命中,激活icp_hit_stale就會給姐妹關(guān)系cache帶來麻煩。這時ICP客戶端cache_peer的allow-miss選項就變得有用。當(dāng)設(shè)置了allow-miss選項時,squid忽略它發(fā)送到姐妹cache的HTTP請求里的only-if- cached指令。
假如激活了icp_hit_stale,必須確保miss_access不會拒絕來自姐妹cache的cache(源squid)丟失請求。
Cache摘要(Cache Digest)
Cache摘要基于由Pei Cao首先發(fā)布的一項技術(shù),叫做摘要緩存。基本思路是用一個Bloom filter來表現(xiàn)cache內(nèi)容。鄰居cache下載其他每個cache的Bloom filter(也即摘要)。然后,通過查詢摘要來決定某個URI是否在鄰居的cache里。
相對于ICP,cache摘要以空間交換時間。ICP查詢浪費時間(延時),cache摘要浪費空間(內(nèi)存,磁盤)。在squid中,鄰居的摘要完全存放在內(nèi)存里。在一個典型的摘要里,每百萬目標(biāo)需要大約625KB的內(nèi)存。
digest_generation on #開啟.本參數(shù)指令控制squid是否產(chǎn)生自己的cache摘要
squid堆疊會有三個問題要注意
1.經(jīng)歷錯誤的http頭,如服務(wù)不可達(dá)的中squid中的html錯誤.
2.假命中.
3.轉(zhuǎn)發(fā)循環(huán)
轉(zhuǎn)發(fā)循環(huán)的控制方法有
1.使用cache_peer_access指令來阻止這類循環(huán)。例如,假如鄰居cache的IP地址是192.168.1.1,下面的行讓squid不會產(chǎn)生轉(zhuǎn)發(fā)循環(huán):
acl FromNeighbor src 192.168.1.1
cache_peer_access the.neighbor.name deny FromNeighbor
2.轉(zhuǎn)發(fā)循環(huán)在HTTP攔截里也能發(fā)生,特別是當(dāng)攔截設(shè)備位于squid和原始服務(wù)器之間的路徑上時。
Squid 通過檢查Via頭部里的主機(jī)名,來檢測轉(zhuǎn)發(fā)循環(huán)。假如2個協(xié)作cache有相同的主機(jī)名,實際上就會得到假轉(zhuǎn)發(fā)循環(huán)。在該情形下,unique_hostname指令很有用。注意,假如Via頭部被過濾掉了(例如使用headers_access指令),squid就不能檢測到轉(zhuǎn)發(fā)循環(huán)。
下面轉(zhuǎn)一個別人對這個的筆記
1) cache_peer鄰居分為parent(父鄰居),sibling(子鄰居).parent和sibling的區(qū)別在于父鄰居能為子cache轉(zhuǎn)發(fā)丟失的Cache,而子鄰居不可能.(是可以的,但要設(shè)置miss_access)
2) cache_peer通過cache_peer_access和cache_peer_domain來控制鄰居的訪問.二者的區(qū)別在于前者一般需要先定義一個ACL而后者都直接匹配相應(yīng)的域名就可以了.
如:
cache_peer 192.168.0.1 parent 3128 3130
acl AllowDomain dst www.abc.com
cache_peer_access AllowDomain 192.168.0.1
cache_peer_domain 192.168.0.1 parent .xyc.com
3) cache_peer通過never_direct,always_direct,hierarchy_stoplist等限制對鄰居的訪問.
4) squid與鄰居cache的通信一般為先為never_direct,always_direct確定怎么樣轉(zhuǎn)發(fā)(根據(jù)相應(yīng)的標(biāo)識driect, never_direct標(biāo)識為direct_no,always_direct標(biāo)識為direct_yes即直接轉(zhuǎn)發(fā)到原始服務(wù)器等等 direct_maybe詳情見Squid中文權(quán)威指南10.10.1),接著Squid根據(jù)Squid的設(shè)置查看鄰居的摘要是否命中(根據(jù)ICP或 HCTP的請求所發(fā)現(xiàn)的),若命中則立即放入轉(zhuǎn)發(fā)列表中.這一切也依靠cache_peer_access,cache_peer_domain的.同時 squid檢查netdb偵測的RTT是否最優(yōu),決定是否選擇此鄰居轉(zhuǎn)發(fā).
5)子鄰居不轉(zhuǎn)發(fā)任何命中丟失的請求,而父鄰居可以轉(zhuǎn)發(fā),若Squid發(fā)現(xiàn)父鄰居到原始服務(wù)器的RTT(往返時間)小于自已到原始服務(wù)器的RTT,將此請求轉(zhuǎn)發(fā)給此父鄰居.(RTT時間需借助Netdb選項的檢測,對于父鄰居的選擇還有另外一些定義選項如:Weigh=N設(shè)置父鄰居的權(quán)重來給予他更高的優(yōu)先級)
ICP/HCTP和Cache摘要以及CARP一樣,都是判斷請求的URI是否在鄰居中被命中。ICP是發(fā)送URL請求,Squid等待著鄰居的回應(yīng),網(wǎng)絡(luò)的延遲也是很大的,而且在姐妹Cache中假命中又顯得很突出。No-Query,禁用ICP協(xié)議! Cache摘要是在鄰居中生成摘要信息,摘要往往把反應(yīng)在Cache中的信息,鄰居下載每個Cache中的摘要,發(fā)送URI請求時查看URL是否在某個摘要中。