讀squid權威指南筆記:squid集羣(sibling模式)

配置成sibling時的工作原理.
默認的,squid首先發送大多數的請求到鄰居cache,然後再到原始服務器。當ICP查詢進來時,squid通過檢查內存索引,能告知它是否有更新的、緩存的響應。squid會計算URI的MD5 hash值,並且在索引裏查找它。假如沒有找到,squid返回ICP_MISS消息。假如找到了,squid檢查超時時間。假如目標沒有刷新,squid返回ICP_MISS。對刷新的目標,squid返回ICP_HIT。
cache選擇的順序
選擇新鮮cache目標的優先級是:
local cache
parent
sibling
direct

對ICP的理解
因爲ICP會更加快,所以這選擇ICP.
ICP是輕量級的目標定位協議,它作爲Harvest項目的一部分而被髮明。ICP客戶發送查詢消息到一個或多個ICP服務器,詢問它們是否緩存了某個 URI(ICP查詢僅包含URI,沒有另外的請求頭部。這讓它很難精確的指示cache命中)。每個服務器響應一個ICP_HIT(ICP命中),ICP_MISS(ICP丟失),或其他類型的ICP消息。ICP客戶使用ICP響應裏的信息來做轉發決定。
ICP也得承受某些設計不足帶來的責難:安全性,伸縮性,假命中,和請求方式的缺乏。該協議不包括任何安全機制。通常squid不能確認某個ICP消息是可信的;它依賴於基於地址的訪問控制來過濾掉不想要的ICP消息。
ICP的伸縮性也很差。ICP消息的數量(和帶寬)增長,與鄰居cache的數量成正比。除非使用某種隔離機制,這實際上限制了你能使用的鄰居cache的數量。我不推薦擁有超過5或6個鄰居cache。
netdb主要用於ICP查詢.netdb是設計來測量到原始服務器的遠近
有用的命令
log_icp_queries on #是否記錄指令來阻止記錄icp的日誌從這些查詢
icp_hit_stale on 
注意.它是告訴squid對任何cache住的目標,即使它是陳舊的,都返回ICP_HIT。這在父子關係的cache中很安全,但對姐妹關係的cache有問題。假如必須轉發所有的假命中,激活icp_hit_stale就會給姐妹關係cache帶來麻煩。這時ICP客戶端cache_peer的allow-miss選項就變得有用。當設置了allow-miss選項時,squid忽略它發送到姐妹cache的HTTP請求裏的only-if- cached指令。
假如激活了icp_hit_stale,必須確保miss_access不會拒絕來自姐妹cache的cache(源squid)丟失請求。
Cache摘要(Cache Digest)
Cache摘要基於由Pei Cao首先發布的一項技術,叫做摘要緩存。基本思路是用一個Bloom filter來表現cache內容。鄰居cache下載其他每個cache的Bloom filter(也即摘要)。然後,通過查詢摘要來決定某個URI是否在鄰居的cache裏。
相對於ICP,cache摘要以空間交換時間。ICP查詢浪費時間(延時),cache摘要浪費空間(內存,磁盤)。在squid中,鄰居的摘要完全存放在內存裏。在一個典型的摘要裏,每百萬目標需要大約625KB的內存。
digest_generation on #開啓.本參數指令控制squid是否產生自己的cache摘要
squid堆疊會有三個問題要注意
1.經歷錯誤的http頭,如服務不可達的中squid中的html錯誤.
2.假命中.
3.轉發循環
轉發循環的控制方法有
1.使用cache_peer_access指令來阻止這類循環。例如,假如鄰居cache的IP地址是192.168.1.1,下面的行讓squid不會產生轉發循環:
acl FromNeighbor src 192.168.1.1 
            
cache_peer_access the.neighbor.name deny FromNeighbor
2.轉發循環在HTTP攔截裏也能發生,特別是當攔截設備位於squid和原始服務器之間的路徑上時。
Squid 通過檢查Via頭部裏的主機名,來檢測轉發循環。假如2個協作cache有相同的主機名,實際上就會得到假轉發循環。在該情形下,unique_hostname指令很有用。注意,假如Via頭部被過濾掉了(例如使用headers_access指令),squid就不能檢測到轉發循環。
下面轉一個別人對這個的筆記
1) cache_peer鄰居分爲parent(父鄰居),sibling(子鄰居).parent和sibling的區別在於父鄰居能爲子cache轉發丟失的Cache,而子鄰居不可能.(是可以的,但要設置miss_access)
2) cache_peer通過cache_peer_access和cache_peer_domain來控制鄰居的訪問.二者的區別在於前者一般需要先定義一個ACL而後者都直接匹配相應的域名就可以了.
如:
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確定怎麼樣轉發(根據相應的標識driect, never_direct標識爲direct_no,always_direct標識爲direct_yes即直接轉發到原始服務器等等 direct_maybe詳情見Squid中文權威指南10.10.1),接着Squid根據Squid的設置查看鄰居的摘要是否命中(根據ICP或 HCTP的請求所發現的),若命中則立即放入轉發列表中.這一切也依靠cache_peer_access,cache_peer_domain的.同時 squid檢查netdb偵測的RTT是否最優,決定是否選擇此鄰居轉發.
5)子鄰居不轉發任何命中丟失的請求,而父鄰居可以轉發,若Squid發現父鄰居到原始服務器的RTT(往返時間)小於自已到原始服務器的RTT,將此請求轉發給此父鄰居.(RTT時間需藉助Netdb選項的檢測,對於父鄰居的選擇還有另外一些定義選項如:Weigh=N設置父鄰居的權重來給予他更高的優先級)
ICP/HCTP和Cache摘要以及CARP一樣,都是判斷請求的URI是否在鄰居中被命中。ICP是發送URL請求,Squid等待着鄰居的迴應,網絡的延遲也是很大的,而且在姐妹Cache中假命中又顯得很突出。No-Query,禁用ICP協議! Cache摘要是在鄰居中生成摘要信息,摘要往往把反應在Cache中的信息,鄰居下載每個Cache中的摘要,發送URI請求時查看URL是否在某個摘要中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章