CDN基礎
基本常識網絡緩存技術,其目的就是減少網絡中冗余數(shù)據(jù)的重復傳輸,使之最小化,將廣域傳輸轉為本地或就近訪問?;ヂ?lián)網上傳遞的內容,大部分為重復的Web/FTP 數(shù)據(jù),Cache 服務器及應用Caching
基本常識
網絡緩存技術,其目的就是減少網絡中冗余數(shù)據(jù)的重復傳輸,使之最小化,將廣域傳輸轉為本地或就近訪問。互聯(lián)網上傳遞的內容,大部分為重復的Web/FTP 數(shù)據(jù),Cache 服務器及應用Caching 技術的網絡設備,可大大優(yōu)化數(shù)據(jù)鏈路性能,消除數(shù)據(jù)峰值訪問造成的結點設備阻塞。
cache 服務器具有緩存功能,所以大部分網頁對象(Webpageobject ),如html 、htm 、php 等頁面文件,gif 、tif 、 png、bmp 等圖片文件,以及其他格式的文件,在有效期(TTL )內,對于重復的訪問,不必從原始網站重新傳送文件實體,只需通過簡單的認證
(FreshnessValidation )-傳送幾十字節(jié)的Header ,即可將本地的副本直接傳送給訪問者。由于緩存服務器通常部署在靠近用戶端,所以能獲得近似局域網的響應速度,并有效減少廣域帶寬的消耗。
高速緩存服務器(CacheServer )是軟硬件高度集成的專業(yè)功能服務器,主要做高速緩存加速服務,一般部署在網絡邊緣。根據(jù)加速對象不同,分為客戶端加速和服務器加速,客戶端加速Cache 部署在網絡出口處,把常訪問的內容緩存在本地,提高響應速度和節(jié)約帶寬;服務器加速,Cache 部署在服務器前端,作為Web 服務器的前置機,提高Web 服務器的性能,加速訪問速度。
如果多臺Cache 加速服務器且分布在不同地域,需要通過有效地機制管理Cache 網絡,引導用戶就近訪問,全局負載均衡流量,這就是CDN 內容傳輸網絡的基本思想。
CDN 的全稱是ContentDeliveryNetwork ,即內容分發(fā)網絡。其目的是通過在現(xiàn)有的Internet 中增加一層新的網絡架構,將網站的內容發(fā)布到最接近用戶的網絡”邊緣”,使用戶可以就近取得所需的內容,解決Internet 網絡擁塞狀況,提高用戶訪問網站的響應速度。從技術上全面解決由于網絡帶寬小、用戶訪問量大、網點分布不均等原因,解決用戶訪問網站的響應速度慢的根本原因。
,CDN 工作原理

用戶訪問未使用CDN 緩存網站的過程為:
1) 、用戶向瀏覽器提供要訪問的域名
2) 、瀏覽器調用域名解析函數(shù)庫對域名進行解析,以得到此域名對應的IP 地址
3) 、瀏覽器使用所得到的IP 地址,向域名的服務主機發(fā)出數(shù)據(jù)訪問請求
4) 、瀏覽器根據(jù)域名主機返回的數(shù)據(jù)顯示網頁的內容
,
用戶訪問使用CDN 緩存網站的訪問過程:
1) 、用戶向瀏覽器提供要訪問的域名
2) 、瀏覽器調用域名解析庫對域名進行解析,由于CDN 對域名解析過程進行了調整,所以解析函數(shù)庫一般得到的是該域名對應的CNAME 記錄,為了得到實際 IP地址,瀏覽器需要再次對獲得的CNAME 域名進行解析以得到實際的IP 地址;在此過程中使用全局負載均衡DNS 解析,如根據(jù)地理位置信息解析對應的 IP地址,使得用戶能就近訪問
3) 、此次解析得到CDN 緩存服務器的IP 地址,瀏覽器在得到實際的IP 地址以后,向緩存服務器發(fā)出訪問請求
4) 、緩存服務器根據(jù)瀏覽器提供的要訪問的域名,通過Cache 內部專用DNS 解析(一般通過host 文件解析)得到此域名的實際IP 地址,再由緩存服務器向此實際IP 地址提交訪問請求;
5) 、緩存服務器從實際IP 地址得得到內容以后,先在本地進行保存,用做緩存,然后把獲取的數(shù)據(jù)返回給客戶端,完成數(shù)據(jù)服務過程;
6) 、客戶端得到由緩存服務器返回的數(shù)據(jù)以后顯示出來并完成整個瀏覽的數(shù)據(jù)請求過程。
F5產品資料
在3DNS 的每個WideIP 中,可以選擇三種算法,這三種算法按照預定的優(yōu)先級進行排列。 在通常情況下,選擇RTT 動態(tài)計算方法作為系統(tǒng)的優(yōu)選算法,即所有的LocalDNS 請求均被3DNS 計算其就近性,以保證絕大部分用戶訪問的最優(yōu)化性。而Topology 算法則作為RTT 動
,態(tài)計算的補充算法,在RTT 計算方式沒有結果的時候,將用戶請求定義到其本網的線路上。 GlobalAvailability 算法作為系統(tǒng)的默認算法,將所有無法計算結果并且不在Topology 范圍之內的LocalDNS 請求,定義到系統(tǒng)的默認線路上。
RTT 算法運行機制:
通過3DNS 的RTT 就近性算法會自動運算生成一個ldns 就近分布表,通過這個動態(tài)的表,每個客戶上來都會提供一個最快速的鏈路進行訪問,由于站點有 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 發(fā)起www.f5.com.cn 域名的DNS 請求。步驟2
(2)運營商的LocalDNS 服務器通過遞歸算法查找到工行的主、輔DNS 服務器。步驟3和4。
(3)接受到請求的3DNS 首先查詢在本地是否有該LocalDNS 的就近性表項,如果存在,則直接給LocalDNS 返回速度最快的服務器地址。如果不存在,則通知另外一臺3DNS 發(fā)起對該LocalDNS 的查詢。步驟5。
(4)兩臺3DNS 分別對LocalDNS 進行Probe 。例如ISP1側3DNS 查詢該LocalDNS 的RTT 時間為150ms ,而ISP2側 3DNS查詢同一LocalDNS 的RTT 時間為300ms ,則此時在兩臺3DNS 內都形成了該LocalDNS 的對應就近性表記錄。
(5)接受到LocalDNS 請求得3DNS 根據(jù)系統(tǒng)的就近性表返回相應的DataCenter 內的WEB 服務器地址。步驟6。
(6)在用戶LocalDNS 獲得地址后,將該地址返回給用戶。步驟7
(7)用戶向www.f5.com.cn 網站發(fā)起訪問。步驟8。
通過以上流程可以看出,通過動態(tài)計算方式,可以最為準確的估算出用戶LocalDNS 與兩條線路之間的速度。通過3DNS 之間的信息交互,在兩臺3DNS 上形成就近性表,并根據(jù)該表返回用戶的最佳訪問地址。
DNS_Dot:向localDNS 發(fā)起一個包含”.”的測試, 也就是向目標LocalDNS 請求root 清單,該解析一般默認配置的DNS 服務器均提供支持。
DNS_REV:向localDNS 發(fā)起LocalDNS 本機IP 的PTR 請求
UDP:發(fā)起一個UDP 的包, 看是否回應
TCP:發(fā)起一個TCP 的包看是否回應
ICMP:發(fā)起一個ICMP 的ping 包, 看是否回應
在以上各檢測方式中,無論目標系統(tǒng)返回那種類型的數(shù)據(jù)包,3DNS 均可認為是有效數(shù)據(jù)包而記錄數(shù)據(jù)包往返時間,最終形成就近性表。
,公司CDN 架構

由一臺全局負載均衡器F5和分布在全國8個節(jié)點的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 對每個緩存響應使用少數(shù)內存,因此在磁盤空間和內存要求之間有一定聯(lián)系。基本規(guī)則是,每G 磁盤空間需要32M 內存。這樣,512M 內存的系統(tǒng),能支持16G 的磁盤緩存。內存需求依賴于如下事實:緩存目標大小,CPU 體系(32位或64位),同時在線的用戶數(shù)量,
,使用的特殊功能。
1、更改操作系統(tǒng)最大打開文件數(shù)
# 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個線程來執(zhí)行磁盤I/O操作
?enable-kill-parent-hack
?disable-icmp squid能利用ICMP 消息來確定回環(huán)時間尺寸
?disable-arp-acl ARP訪問控制列表
?disable-delay-pools 延時池是squid 用于傳輸形狀或帶寬限制的技術。
?disable-mem-gen-trace
?disable-ident-lookups ident是一個簡單的協(xié)議,允許服務器利用客戶端的特殊TCP 連接來發(fā)現(xiàn)用戶名。
?disable-useragent-log 可選的useragent.log 包含來自客戶端請求的User-Agent 頭部值。
4、/usr/local/squid/etc/squid.conf
visible_hostname JL-CC01 # 服務器輸出的機器名
cache_effective_user squid # 運行squid 服務的用戶
cache_mgr cdn@vale.com.cn #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
#定義協(xié)議
acl http proto HTTP
# 只允許僅允許加密請求到端口443、563
acl CONNECT method CONNECT
,# 只允許本地強制刪除緩存對象
acl purgemethod method PURGE
# 允許本地管理緩存端口
acl manager proto cache_object
always_direct allow dstdm # 請求轉發(fā)到目的主機
never_direct allow !dstdm # 無效請求不轉發(fā)
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使用內存大小,建議為系統(tǒng)內存的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 不區(qū)分大小寫,最小存活時間1440,最大存活時間21600,最后修改系數(shù)比例90,reload-into-ims 檢查LM-factor 百分比之前先檢查min 值。
注:最低和最高時間限制之間的響應, 遵循最后修改系數(shù) (LM-factor)算法。squid 計算響應的年齡和最后修改系數(shù),然后將它作為百分比值進行比較。
基于LM-factor 計算過期時間

squid 緩存某個目標3個小時(基于Date 和Last-Modified 頭部)。LM-factor 的值是50,響應在接下來的1.5個小時里是存活的,在這之后,目標會過期并被當作過時處理。假如用戶在存活期間請求cache 目標,squid 返回沒有確認的cache 命中。若在過時期間發(fā)生請求,squid 轉發(fā)確認請求到原始服務器。
squid 的refresh_pattern算法的簡單描述:
假如響應年齡超過refresh_pattern的max 值,該響應過期;
假如LM-factor 少于refresh_pattern百分比值,該響應存活;
假如響應年齡少于refresh_pattern的min 值,該響應存活;
其他情況下,響應過期。
5、squid 常用命令
# /usr/local/squid/sbin/squid ?z
初始化cache 目錄,建立新的CACHE 目錄后需要執(zhí)行,另外需要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、業(yè)務系統(tǒng)問題解決
問題:緩存不同步
現(xiàn)象:不同地區(qū)顯示頁面不一致
解決:在8臺cache 服務器手工刷新緩存,由業(yè)務部門提供有問題的URL 鏈接。