squid CDN應用常識

基本常識
網絡緩存技術,其目的就是減少網絡中冗餘數據的重複傳輸,使之最小化,將廣域傳輸轉爲本地或就近訪問。互聯網上傳遞的內容,大部分爲重複的Web/FTP 數據,Cache服務器及應用Caching技術的網絡設備,可大大優化數據鏈路性能,消除數據峯值訪問造成的結點設備阻塞。

cache服務器具有緩存功能,所以大部分網頁對象(Webpageobject),如html、htm、php等頁面文件,gif、tif、 png、bmp等圖片文件,以及其他格式的文件,在有效期(TTL)內,對於重複的訪問,不必從原始網站重新傳送文件實體,只需通過簡單的認證(FreshnessValidation)-傳送幾十字節的Header,即可將本地的副本直接傳送給訪問者。由於緩存服務器通常部署在靠近用戶端,所以能獲得近似局域網的響應速度,並有效減少廣域帶寬的消耗。

高速緩存服務器(CacheServer)是軟硬件高度集成的專業功能服務器,主要做高速緩存加速服務,一般部署在網絡邊緣。根據加速對象不同,分爲客戶端加速和服務器加速,客戶端加速Cache部署在網絡出口處,把常訪問的內容緩存在本地,提高響應速度和節約帶寬;服務器加速,Cache部署在服務器前端,作爲Web服務器的前置機,提高Web服務器的性能,加速訪問速度。

如果多臺Cache加速服務器且分佈在不同地域,需要通過有效地機制管理Cache網絡,引導用戶就近訪問,全局負載均衡流量,這就是CDN內容傳輸網絡的基本思想。

CDN的全稱是ContentDeliveryNetwork,即內容分發網絡。其目的是通過在現有的Internet中增加一層新的網絡架構,將網站的內容發佈到最接近用戶的網絡”邊緣”,使用戶可以就近取得所需的內容,解決Internet網絡擁塞狀況,提高用戶訪問網站的響應速度。從技術上全面解決由於網絡帶寬小、用戶訪問量大、網點分佈不均等原因,解決用戶訪問網站的響應速度慢的根本原因。

CDN工作原理
cdn1.jpg



用戶訪問未使用CDN緩存網站的過程爲:
1)、用戶向瀏覽器提供要訪問的域名
2)、瀏覽器調用域名解析函數庫對域名進行解析,以得到此域名對應的IP地址
3)、瀏覽器使用所得到的IP地址,向域名的服務主機發出數據訪問請求
4)、瀏覽器根據域名主機返回的數據顯示網頁的內容

cdn2.jpg



用戶訪問使用CDN緩存網站的訪問過程:
1)、用戶向瀏覽器提供要訪問的域名
2)、瀏覽器調用域名解析庫對域名進行解析,由於CDN對域名解析過程進行了調整,所以解析函數庫一般得到的是該域名對應的CNAME記錄,爲了得到實際 IP地址,瀏覽器需要再次對獲得的CNAME域名進行解析以得到實際的IP地址;在此過程中使用全局負載均衡DNS解析,如根據地理位置信息解析對應的 IP地址,使得用戶能就近訪問
3)、此次解析得到CDN緩存服務器的IP地址,瀏覽器在得到實際的IP地址以後,向緩存服務器發出訪問請求
4)、緩存服務器根據瀏覽器提供的要訪問的域名,通過Cache內部專用DNS解析(一般通過host文件解析)得到此域名的實際IP地址,再由緩存服務器向此實際IP地址提交訪問請求;
5)、緩存服務器從實際IP地址得得到內容以後,先在本地進行保存,用做緩存,然後把獲取的數據返回給客戶端,完成數據服務過程;
6)、客戶端得到由緩存服務器返回的數據以後顯示出來並完成整個瀏覽的數據請求過程。

F5產品資料

在3DNS的每個WideIP中,可以選擇三種算法,這三種算法按照預定的優先級進行排列。
在通常情況下,選擇RTT動態計算方法作爲系統的優選算法,即所有的LocalDNS請求均被3DNS計算其就近性,以保證絕大部分用戶訪問的最優化性。而Topology算法則作爲RTT動態計算的補充算法,在RTT計算方式沒有結果的時候,將用戶請求定義到其本網的線路上。 GlobalAvailability算法作爲系統的默認算法,將所有無法計算結果並且不在Topology範圍之內的LocalDNS請求,定義到系統的默認線路上。

RTT算法運行機制:
通過3DNS的RTT就近性算法會自動運算生成一個ldns就近分佈表,通過這個動態的表,每個客戶上來都會提供一個最快速的鏈路進行訪問,由於站點有 ISP1和ISP2的兩條廣域網線路。在3DNS上會針對站點服務器(以www.f5.com.cn爲例)解析ISP1和ISP2的兩個不同的公網地址。

對應於www.f5.com.cn域名,在3DNS上配置wideip:www.f5.com.cn,對應兩個 VirtualServer:VS1:202.106.83.177,VS2:219.17.66.100。分別屬於ISP1和ISP2兩條線路分配的 IP地址段。在3DNS內部,同時定義兩個DataCenter分別與ISP1和ISP2相對應。

(1)首先向其所在運營商的LocalDNS發起www.f5.com.cn域名的DNS請求。步驟2
(2)運營商的LocalDNS服務器通過遞歸算法查找到工行的主、輔DNS服務器。步驟3和4。
(3)接受到請求的3DNS首先查詢在本地是否有該LocalDNS的就近性表項,如果存在,則直接給LocalDNS返回速度最快的服務器地址。如果不存在,則通知另外一臺3DNS發起對該LocalDNS的查詢。步驟5。
(4)兩臺3DNS分別對LocalDNS進行Probe。例如ISP1側3DNS查詢該LocalDNS的RTT時間爲150ms,而ISP2側 3DNS查詢同一LocalDNS的RTT時間爲300ms,則此時在兩臺3DNS內都形成了該LocalDNS的對應就近性表記錄。
(5)接受到LocalDNS請求得3DNS根據系統的就近性表返回相應的DataCenter內的WEB服務器地址。步驟6。
(6)在用戶LocalDNS獲得地址後,將該地址返回給用戶。步驟7
(7)用戶向www.f5.com.cn網站發起訪問。步驟8。
通過以上流程可以看出,通過動態計算方式,可以最爲準確的估算出用戶LocalDNS與兩條線路之間的速度。通過3DNS之間的信息交互,在兩臺3DNS上形成就近性表,並根據該表返回用戶的最佳訪問地址。
DNS_Dot:向localDNS發起一個包含”.”的測試,也就是向目標LocalDNS請求root清單,該解析一般默認配置的DNS服務器均提供支持。
DNS_REV:向localDNS發起LocalDNS本機IP的PTR請求
UDP:發起一個UDP的包,看是否迴應
TCP:發起一個TCP的包看是否迴應
ICMP:發起一個ICMP的ping包,看是否迴應
在以上各檢測方式中,無論目標系統返回那種類型的數據包,3DNS均可認爲是有效數據包而記錄數據包往返時間,最終形成就近性表。

公司CDN架構
cdn3.jpg


由一臺全局負載均衡器F5和分佈在全國8個節點的CacheServer組成,提供頁面訪問加速與下載加速功能。

序號 名稱 功能 機房
1 F5 負載均衡器 北京電信通
2 CDN-BZ CACHESERVER 山東網通
3 CDN-CS CACHESERVER 江蘇電信
4 CDN-CX CACHESERVER 雲南電信
5 CDN-CZ CACHESERVER 河北網通
6 CDN-HZ CACHESERVER 浙江電信
7 CDN-NC CACHESERVER 四川電信
8 CDN-NN CACHESERVER 廣西電信
9 CDN-SY CACHESERVER 遼寧網通

Squid安裝配置
squid對硬件要求不算高。內存是最重要的資源。內存短缺會嚴重影響性能。磁盤空間也是另一個重要因素。更多的磁盤空間意味着更多的緩存目標和更高的命中率。快速的磁盤和驅動器也是有利的。當然快速的CPU也是好的,但它並不是提高性能的關鍵因素。
squid對每個緩存響應使用少數內存,因此在磁盤空間和內存要求之間有一定聯繫。基本規則是,每G磁盤空間需要32M內存。這樣,512M內存的系統,能支持16G的磁盤緩存。內存需求依賴於如下事實:緩存目標大小,CPU體系(32位或64位),同時在線的用戶數量,使用的特殊功能。

1、更改操作系統最大打開文件數
# echo “102211″ > /proc/sys/fs/file-max
# vi /etc/sysctl.conf 加入以下一行
fs.file-max = 65535
# vi /etc/security/limits.conf 加入以下兩行
* hard nofile 65535
* soft nofile 65535
# vi /etc/rc.local 加入以下一行
ulimit -HSn 65535
重新啓動後,使用# ulimit ?a 檢查一下open files是否與所設置對應。

2、目錄劃分
/usr/local/squid 指定安裝目錄
/var/squid/var/logs 日誌目錄
/cache緩存目錄,單獨一塊硬盤

3、軟件版本與安裝
#./configure ?prefix=/usr/local/squid
?enable-async-io=20 ?enable-kill-parent-hack ?enable-poll ?enable-snmp
?disable-icmp ?disable-arp-acl ?disable-delay-pools ?disable-mem-gen-trace ?disable-ident-lookups ?disable-useragent-log

解釋
?enable-async-io=20 使用squid異步I/O技術,提升存儲性能,aufs模塊使用18個線程來執行磁盤I/O操作
?enable-kill-parent-hack
?disable-icmp squid能利用ICMP消息來確定迴環時間尺寸
?disable-arp-acl ARP訪問控制列表
?disable-delay-pools 延時池是squid用於傳輸形狀或帶寬限制的技術。
?disable-mem-gen-trace
?disable-ident-lookups ident是一個簡單的協議,允許服務器利用客戶端的特殊TCP連接來發現用戶名。
?disable-useragent-log 可選的useragent.log包含來自客戶端請求的User-Agent頭部值。

4、/usr/local/squid/etc/squid.conf
visible_hostname JL-CC01 # 服務器輸出的機器名
http_port 80 vhost
cache_effective_user squid # 運行squid服務的用戶
cache_mgr [email protected] #squid管理員郵件地址
pid_filename /usr/local/squid/var/logs/squid.pid
coredump_dir /cache
icp_port 0 #取消對代理陣列的支持
hosts_file /etc/hosts # 定義hosts文件位置
half_closed_clients off
client_lifetime 8 hours

##ACL###
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

#定義IP地址段
acl all src 0.0.0.0/0.0.0.0
acl lan src 192.168.1.0/24
acl localhost src 127.0.0.1/32

#定義目的(原始)主機表,存儲IP地址
acl dstnetwork dst ‘/usr/local/squid/etc/src_ip’

#定義目的域名錶,存儲域名
acl dstdm dstdomain ‘/usr/local/squid/etc/dstdomain’

# 定義端口
acl SSL_ports port 443 563
acl Safe_ports port 21 # ftp
acl Safe_ports port 80 81 # http
acl Safe_ports port 443 563 # https, snews
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http

#定義協議
acl http proto HTTP

# 只允許僅允許加密請求到端口443、563
acl CONNECT method CONNECT
http_access allow CONNECT SSL_ports
http_access deny CONNECT

# 只允許本地強制刪除緩存對象
acl purgemethod method PURGE
http_access allow purgemethod localhost
http_access deny Purge

# 允許本地管理緩存端口
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager

always_direct allow dstdm # 請求轉發到目的主機
never_direct allow !dstdm # 無效請求不轉發

http_access deny !http # 禁止訪問非http協議
http_access deny !safe_ports # 禁止訪問非安全端口
http_access deny !dstdm # 禁止訪問非目的主機
http_access allow dstnetwork # 允許訪問目的域
http_access allow lan # 允許局域網主機訪問
http_access deny all # 禁止所有地址訪問

client_persistent_connections off
server_persistent_connections off

logformat common %>a %ui %un [%tl] “%rm %ru HTTP/%rv” %Hs %

cache_dir aufs /cache 20480 16 256
# 緩存目錄,存儲機制默認是ufs,這裏是aufs,目錄在/cache,一級目錄16個,二級目錄256,20G空間使用,建議將一塊硬盤空間單獨用做緩存,保留10%空間存放swap.state文件和臨時文件。
access_log /var/squid/var/logs/access.log squid
# 訪問日誌存儲在/var/squid/var/logs/
cache_log /var/squid/var/logs/cache.log
# cache.log包含多種消息,例如配置信息、性能警告、以及嚴重錯誤
cache_store_log /var/squid/var/logs/store.log
# 存儲或刪除cache目標的日誌,位置在/var/squid/var/logs/
logfile_rotate 1

cache_mem 512 MB # squid使用內存大小,建議爲系統內存的1/2
maximum_object_size 100 MB # 最大緩存對象爲100M
minimum_object_size 0 KB # 最小緩存對象爲0K,意思是無限制。
maximum_object_size_in_memory 1024 KB
cache_swap_low 80 # 緩存磁盤空間使用基準,低於80%不會刪除緩存對象
cache_swap_high 90 # cache_swap_high在目前版本沒有太大作用

refresh_pattern -i \/$ 15 90% 600 reload-into-ims
refresh_pattern -i \.html$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwe$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwo$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwf$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nvi$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nmv$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwx$ 15 90% 60 reload-into-ims
refresh_pattern -i \.htm$ 15 90% 600 reload-into-ims
refresh_pattern -i \.shtml$ 15 90% 600 reload-into-ims
refresh_pattern -i \.vhtml$ 30 90% 600 reload-into-ims
refresh_pattern -i \.hml$ 15 90% 600 reload-into-ims
refresh_pattern -i \.php$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.asp$ 15 90% 600 reload-into-ims
refresh_pattern -i \.jsp$ 1440 90% 8640 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.swf$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 120 90% 600 reload-into-ims
refresh_pattern -i \.css$ 120 90% 600 reload-into-ims
refresh_pattern -i .wma 1440 90% 21600 reload-into-ims
refresh_pattern -i .zip 1440 90% 21600 reload-into-ims
refresh_pattern -i .mp3 1440 90% 21600 reload-into-ims
refresh_pattern -i .rar 1440 90% 21600 reload-into-ims
refresh_pattern -i .rm 1440 90% 21600 reload-into-ims
refresh_pattern -i \.flv$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .WMV$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .ui$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .exe$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .unix$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .suc$ 1440 90% 21600 reload-into-ims
# -i 不區分大小寫,最小存活時間1440,最大存活時間21600,最後修改係數比例90%,reload-into-ims檢查LM-factor百分比之前先檢查min值。

注:最低和最高時間限制之間的響應, 遵循最後修改係數 (LM-factor)算法。squid計算響應的年齡和最後修改係數,然後將它作爲百分比值進行比較。
基於LM-factor計算過期時間
cdn5.jpg



squid緩存某個目標3個小時(基於Date和Last-Modified頭部)。LM-factor的值是50%,響應在接下來的1.5個小時裏是存活的,在這之後,目標會過期並被當作過時處理。假如用戶在存活期間請求cache目標,squid返回沒有確認的cache命中。若在過時期間發生請求,squid轉發確認請求到原始服務器。

squid的refresh_pattern算法的簡單描述:
假如響應年齡超過refresh_pattern的max值,該響應過期;
假如LM-factor少於refresh_pattern百分比值,該響應存活;
假如響應年齡少於refresh_pattern的min值,該響應存活;
其他情況下,響應過期。

5、squid常用命令
# /usr/local/squid/sbin/squid ?z
初始化cache目錄,建立新的CACHE目錄後需要執行,另外需要squid用戶對此目錄擁有權限。

# /usr/local/squid/sbin/squid -k parse
在啓動squid之前,你應該謹慎的驗證配置文件。

# /usr/local/squid/sbin/squid ?Ds
啓動squid。禁止初始化DNS測試。正常情況下,squid直到驗證它的DNS可用才能啓動。將日誌記錄到syslog進程

# /usr/local/squid/sbin/squid -k shutdown
停止squid。

# /usr/local/squid/sbin/squid -k rotate
滾動日誌。

# vi /etc/rc.local
ulimit -HSn 102211
/usr/local/squid/sbin/squid -Ds
/usr/local/apache2/bin/apachectl -k start

# crontab ?e
0 */8 * * * /usr/local/squid/sbin/squid -k rotate # 每8小時回滾日誌一次
0 */12 * * * /usr/sbin/ntpdate 210.72.145.44 && clock ?w # 每12小時校正時鐘一次

6、業務系統問題解決
問題:緩存不同步
現象:不同地區顯示頁面不一致
解決:在8臺cache服務器手工刷新緩存,由業務部門提供有問題的URL鏈接。
# /usr/local/squid/bin/squidclient ?m purge ?u squid ?g squid http://

squidclient 常用命令
取得squid運行狀態信息: squidclient -p 80 mgr:info
取得squid內存使用情況: squidclient -p 80 mgr:mem
取得squid已經緩存的列表: squidclient -p 80 mgr:objects
取得squid的磁盤使用情況: squidclient -p 80 mgr:diskd
強制更新某個url:squidclient -p 80 -m PURGE http://www.yejr.com/static.php
更多的請查看:squidclient -h 或者 squidclient -p 80 mgr:

7、squid業務監控
目前是手工監控。主要監控服務狀態和磁盤空間、squid日誌情況。後期實現cacti對服務狀態、磁盤空間進行自動監控。
# netstat ?nlp ?t
查看80端口是否正常

# df ?h
查看磁盤空間是否正常

參考資料
squid中文權威指南 http://www.php-oa.com/books/squid/chap01.html
squid 官方站點http://www.php-oa.com/books/squid/chap01.html

原文鏈接:http://www.careerman.cn/?p=192

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章