CDN基礎(chǔ)
基本常識(shí)網(wǎng)絡(luò)緩存技術(shù),其目的就是減少網(wǎng)絡(luò)中冗余數(shù)據(jù)的重復(fù)傳輸,使之最小化,將廣域傳輸轉(zhuǎn)為本地或就近訪問。互聯(lián)網(wǎng)上傳遞的內(nèi)容,大部分為重復(fù)的Web/FTP 數(shù)據(jù),Cache 服務(wù)器及應(yīng)用Caching
基本常識(shí)
網(wǎng)絡(luò)緩存技術(shù),其目的就是減少網(wǎng)絡(luò)中冗余數(shù)據(jù)的重復(fù)傳輸,使之最小化,將廣域傳輸轉(zhuǎn)為本地或就近訪問?;ヂ?lián)網(wǎng)上傳遞的內(nèi)容,大部分為重復(fù)的Web/FTP 數(shù)據(jù),Cache 服務(wù)器及應(yīng)用Caching 技術(shù)的網(wǎng)絡(luò)設(shè)備,可大大優(yōu)化數(shù)據(jù)鏈路性能,消除數(shù)據(jù)峰值訪問造成的結(jié)點(diǎn)設(shè)備阻塞。
cache 服務(wù)器具有緩存功能,所以大部分網(wǎng)頁對象(Webpageobject ),如html 、htm 、php 等頁面文件,gif 、tif 、 png、bmp 等圖片文件,以及其他格式的文件,在有效期(TTL )內(nèi),對于重復(fù)的訪問,不必從原始網(wǎng)站重新傳送文件實(shí)體,只需通過簡單的認(rèn)證
(FreshnessValidation )-傳送幾十字節(jié)的Header ,即可將本地的副本直接傳送給訪問者。由于緩存服務(wù)器通常部署在靠近用戶端,所以能獲得近似局域網(wǎng)的響應(yīng)速度,并有效減少廣域帶寬的消耗。
高速緩存服務(wù)器(CacheServer )是軟硬件高度集成的專業(yè)功能服務(wù)器,主要做高速緩存加速服務(wù),一般部署在網(wǎng)絡(luò)邊緣。根據(jù)加速對象不同,分為客戶端加速和服務(wù)器加速,客戶端加速Cache 部署在網(wǎng)絡(luò)出口處,把常訪問的內(nèi)容緩存在本地,提高響應(yīng)速度和節(jié)約帶寬;服務(wù)器加速,Cache 部署在服務(wù)器前端,作為Web 服務(wù)器的前置機(jī),提高Web 服務(wù)器的性能,加速訪問速度。
如果多臺(tái)Cache 加速服務(wù)器且分布在不同地域,需要通過有效地機(jī)制管理Cache 網(wǎng)絡(luò),引導(dǎo)用戶就近訪問,全局負(fù)載均衡流量,這就是CDN 內(nèi)容傳輸網(wǎng)絡(luò)的基本思想。
CDN 的全稱是ContentDeliveryNetwork ,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其目的是通過在現(xiàn)有的Internet 中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)”邊緣”,使用戶可以就近取得所需的內(nèi)容,解決Internet 網(wǎng)絡(luò)擁塞狀況,提高用戶訪問網(wǎng)站的響應(yīng)速度。從技術(shù)上全面解決由于網(wǎng)絡(luò)帶寬小、用戶訪問量大、網(wǎng)點(diǎn)分布不均等原因,解決用戶訪問網(wǎng)站的響應(yīng)速度慢的根本原因。
,CDN 工作原理
用戶訪問未使用CDN 緩存網(wǎng)站的過程為:
1) 、用戶向?yàn)g覽器提供要訪問的域名
2) 、瀏覽器調(diào)用域名解析函數(shù)庫對域名進(jìn)行解析,以得到此域名對應(yīng)的IP 地址
3) 、瀏覽器使用所得到的IP 地址,向域名的服務(wù)主機(jī)發(fā)出數(shù)據(jù)訪問請求
4) 、瀏覽器根據(jù)域名主機(jī)返回的數(shù)據(jù)顯示網(wǎng)頁的內(nèi)容
,用戶訪問使用CDN 緩存網(wǎng)站的訪問過程:
1) 、用戶向?yàn)g覽器提供要訪問的域名
2) 、瀏覽器調(diào)用域名解析庫對域名進(jìn)行解析,由于CDN 對域名解析過程進(jìn)行了調(diào)整,所以解析函數(shù)庫一般得到的是該域名對應(yīng)的CNAME 記錄,為了得到實(shí)際 IP地址,瀏覽器需要再次對獲得的CNAME 域名進(jìn)行解析以得到實(shí)際的IP 地址;在此過程中使用全局負(fù)載均衡DNS 解析,如根據(jù)地理位置信息解析對應(yīng)的 IP地址,使得用戶能就近訪問
3) 、此次解析得到CDN 緩存服務(wù)器的IP 地址,瀏覽器在得到實(shí)際的IP 地址以后,向緩存服務(wù)器發(fā)出訪問請求
4) 、緩存服務(wù)器根據(jù)瀏覽器提供的要訪問的域名,通過Cache 內(nèi)部專用DNS 解析(一般通過host 文件解析)得到此域名的實(shí)際IP 地址,再由緩存服務(wù)器向此實(shí)際IP 地址提交訪問請求;
5) 、緩存服務(wù)器從實(shí)際IP 地址得得到內(nèi)容以后,先在本地進(jìn)行保存,用做緩存,然后把獲取的數(shù)據(jù)返回給客戶端,完成數(shù)據(jù)服務(wù)過程;
6) 、客戶端得到由緩存服務(wù)器返回的數(shù)據(jù)以后顯示出來并完成整個(gè)瀏覽的數(shù)據(jù)請求過程。
F5產(chǎn)品資料
在3DNS 的每個(gè)WideIP 中,可以選擇三種算法,這三種算法按照預(yù)定的優(yōu)先級進(jìn)行排列。 在通常情況下,選擇RTT 動(dòng)態(tài)計(jì)算方法作為系統(tǒng)的優(yōu)選算法,即所有的LocalDNS 請求均被3DNS 計(jì)算其就近性,以保證絕大部分用戶訪問的最優(yōu)化性。而Topology 算法則作為RTT 動(dòng)
,態(tài)計(jì)算的補(bǔ)充算法,在RTT 計(jì)算方式?jīng)]有結(jié)果的時(shí)候,將用戶請求定義到其本網(wǎng)的線路上。 GlobalAvailability 算法作為系統(tǒng)的默認(rèn)算法,將所有無法計(jì)算結(jié)果并且不在Topology 范圍之內(nèi)的LocalDNS 請求,定義到系統(tǒng)的默認(rèn)線路上。
RTT 算法運(yùn)行機(jī)制:
通過3DNS 的RTT 就近性算法會(huì)自動(dòng)運(yùn)算生成一個(gè)ldns 就近分布表,通過這個(gè)動(dòng)態(tài)的表,每個(gè)客戶上來都會(huì)提供一個(gè)最快速的鏈路進(jìn)行訪問,由于站點(diǎn)有 ISP1和ISP2的兩條廣域網(wǎng)線路。在3DNS 上會(huì)針對站點(diǎn)服務(wù)器(以www.f5.com.cn 為例) 解析ISP1和ISP2的兩個(gè)不同的公網(wǎng)地址。
對應(yīng)于www.f5.com.cn 域名,在3DNS 上配置wideip :www.f5.com.cn ,對應(yīng)兩個(gè)
VirtualServer :VS1:202.106.83.177,VS2:219.17.66.100。分別屬于ISP1和ISP2兩條線路分配的 IP地址段。在3DNS 內(nèi)部,同時(shí)定義兩個(gè)DataCenter 分別與ISP1和ISP2相對應(yīng)。
(1)首先向其所在運(yùn)營商的LocalDNS 發(fā)起www.f5.com.cn 域名的DNS 請求。步驟2
(2)運(yùn)營商的LocalDNS 服務(wù)器通過遞歸算法查找到工行的主、輔DNS 服務(wù)器。步驟3和4。
(3)接受到請求的3DNS 首先查詢在本地是否有該LocalDNS 的就近性表項(xiàng),如果存在,則直接給LocalDNS 返回速度最快的服務(wù)器地址。如果不存在,則通知另外一臺(tái)3DNS 發(fā)起對該LocalDNS 的查詢。步驟5。
(4)兩臺(tái)3DNS 分別對LocalDNS 進(jìn)行Probe 。例如ISP1側(cè)3DNS 查詢該LocalDNS 的RTT 時(shí)間為150ms ,而ISP2側(cè) 3DNS查詢同一LocalDNS 的RTT 時(shí)間為300ms ,則此時(shí)在兩臺(tái)3DNS 內(nèi)都形成了該LocalDNS 的對應(yīng)就近性表記錄。
(5)接受到LocalDNS 請求得3DNS 根據(jù)系統(tǒng)的就近性表返回相應(yīng)的DataCenter 內(nèi)的WEB 服務(wù)器地址。步驟6。
(6)在用戶LocalDNS 獲得地址后,將該地址返回給用戶。步驟7
(7)用戶向www.f5.com.cn 網(wǎng)站發(fā)起訪問。步驟8。
通過以上流程可以看出,通過動(dòng)態(tài)計(jì)算方式,可以最為準(zhǔn)確的估算出用戶LocalDNS 與兩條線路之間的速度。通過3DNS 之間的信息交互,在兩臺(tái)3DNS 上形成就近性表,并根據(jù)該表返回用戶的最佳訪問地址。
DNS_Dot:向localDNS 發(fā)起一個(gè)包含”.”的測試, 也就是向目標(biāo)LocalDNS 請求root 清單,該解析一般默認(rèn)配置的DNS 服務(wù)器均提供支持。
DNS_REV:向localDNS 發(fā)起LocalDNS 本機(jī)IP 的PTR 請求
UDP:發(fā)起一個(gè)UDP 的包, 看是否回應(yīng)
TCP:發(fā)起一個(gè)TCP 的包看是否回應(yīng)
ICMP:發(fā)起一個(gè)ICMP 的ping 包, 看是否回應(yīng)
在以上各檢測方式中,無論目標(biāo)系統(tǒng)返回那種類型的數(shù)據(jù)包,3DNS 均可認(rèn)為是有效數(shù)據(jù)包而記錄數(shù)據(jù)包往返時(shí)間,最終形成就近性表。
,公司CDN 架構(gòu)
由一臺(tái)全局負(fù)載均衡器F5和分布在全國8個(gè)節(jié)點(diǎn)的CacheServer 組成,提供頁面訪問加速與下載加速功能。
序號(hào) 名稱 功能 機(jī)房
1 F5 負(fù)載均衡器 北京電信通
2 CDN-BZ CACHESERVER 山東網(wǎng)通
3 CDN-CS CACHESERVER 江蘇電信
4 CDN-CX CACHESERVER 云南電信
5 CDN-CZ CACHESERVER 河北網(wǎng)通
6 CDN-HZ CACHESERVER 浙江電信
7 CDN-NC CACHESERVER 四川電信
8 CDN-NN CACHESERVER 廣西電信
9 CDN-SY CACHESERVER 遼寧網(wǎng)通
Squid 安裝配置
squid 對硬件要求不算高。內(nèi)存是最重要的資源。內(nèi)存短缺會(huì)嚴(yán)重影響性能。磁盤空間也是另一個(gè)重要因素。更多的磁盤空間意味著更多的緩存目標(biāo)和更高的命中率??焖俚拇疟P和驅(qū)動(dòng)器也是有利的。當(dāng)然快速的CPU 也是好的,但它并不是提高性能的關(guān)鍵因素。
squid 對每個(gè)緩存響應(yīng)使用少數(shù)內(nèi)存,因此在磁盤空間和內(nèi)存要求之間有一定聯(lián)系?;疽?guī)則是,每G 磁盤空間需要32M 內(nèi)存。這樣,512M 內(nèi)存的系統(tǒng),能支持16G 的磁盤緩存。內(nèi)存需求依賴于如下事實(shí):緩存目標(biāo)大小,CPU 體系(32位或64位),同時(shí)在線的用戶數(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
重新啟動(dòng)后,使用# ulimit ?a 檢查一下open files是否與所設(shè)置對應(yīng)。
2、目錄劃分
/usr/local/squid 指定安裝目錄
/var/squid/var/logs 日志目錄
/cache緩存目錄,單獨(dú)一塊硬盤
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技術(shù),提升存儲(chǔ)性能,aufs 模塊使用18個(gè)線程來執(zhí)行磁盤I/O操作
?enable-kill-parent-hack
?disable-icmp squid能利用ICMP 消息來確定回環(huán)時(shí)間尺寸
?disable-arp-acl ARP訪問控制列表
?disable-delay-pools 延時(shí)池是squid 用于傳輸形狀或帶寬限制的技術(shù)。
?disable-mem-gen-trace
?disable-ident-lookups ident是一個(gè)簡單的協(xié)議,允許服務(wù)器利用客戶端的特殊TCP 連接來發(fā)現(xiàn)用戶名。
?disable-useragent-log 可選的useragent.log 包含來自客戶端請求的User-Agent 頭部值。
4、/usr/local/squid/etc/squid.conf
visible_hostname JL-CC01 # 服務(wù)器輸出的機(jī)器名
cache_effective_user squid # 運(yùn)行squid 服務(wù)的用戶
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
#定義目的(原始)主機(jī)表,存儲(chǔ)IP 地址
acl dstnetwork dst ‘/usr/local/squid/etc/src_ip’
#定義目的域名表,存儲(chǔ)域名
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
,# 只允許本地強(qiáng)制刪除緩存對象
acl purgemethod method PURGE
# 允許本地管理緩存端口
acl manager proto cache_object
always_direct allow dstdm # 請求轉(zhuǎn)發(fā)到目的主機(jī)
never_direct allow !dstdm # 無效請求不轉(zhuǎn)發(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
# 緩存目錄,存儲(chǔ)機(jī)制默認(rèn)是ufs ,這里是aufs ,目錄在/cache,一級目錄16個(gè),二級目錄256,20G 空間使用,建議將一塊硬盤空間單獨(dú)用做緩存,保留10空間存放swap.state 文件和臨時(shí)文件。
access_log /var/squid/var/logs/access.log squid
# 訪問日志存儲(chǔ)在/var/squid/var/logs/
cache_log /var/squid/var/logs/cache.log
# cache.log包含多種消息,例如配置信息、性能警告、以及嚴(yán)重錯(cuò)誤
cache_store_log /var/squid/var/logs/store.log
# 存儲(chǔ)或刪除cache 目標(biāo)的日志,位置在/var/squid/var/logs/
logfile_rotate 1
cache_mem 512 MB # squid使用內(nèi)存大小,建議為系統(tǒng)內(nèi)存的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 # 緩存磁盤空間使用基準(zhǔn),低于80不會(huì)刪除緩存對象
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ū)分大小寫,最小存活時(shí)間1440,最大存活時(shí)間21600,最后修改系數(shù)比例90,reload-into-ims 檢查LM-factor 百分比之前先檢查min 值。
注:最低和最高時(shí)間限制之間的響應(yīng), 遵循最后修改系數(shù) (LM-factor)算法。squid 計(jì)算響應(yīng)的年齡和最后修改系數(shù),然后將它作為百分比值進(jìn)行比較。
基于LM-factor 計(jì)算過期時(shí)間
squid 緩存某個(gè)目標(biāo)3個(gè)小時(shí)(基于Date 和Last-Modified 頭部)。LM-factor 的值是50,響應(yīng)在接下來的1.5個(gè)小時(shí)里是存活的,在這之后,目標(biāo)會(huì)過期并被當(dāng)作過時(shí)處理。假如用戶在存活期間請求cache 目標(biāo),squid 返回沒有確認(rèn)的cache 命中。若在過時(shí)期間發(fā)生請求,squid 轉(zhuǎn)發(fā)確認(rèn)請求到原始服務(wù)器。
squid 的refresh_pattern算法的簡單描述:
假如響應(yīng)年齡超過refresh_pattern的max 值,該響應(yīng)過期;
假如LM-factor 少于refresh_pattern百分比值,該響應(yīng)存活;
假如響應(yīng)年齡少于refresh_pattern的min 值,該響應(yīng)存活;
其他情況下,響應(yīng)過期。
5、squid 常用命令
# /usr/local/squid/sbin/squid ?z
初始化cache 目錄,建立新的CACHE 目錄后需要執(zhí)行,另外需要squid 用戶對此目錄擁有權(quán)限。
# /usr/local/squid/sbin/squid -k parse
在啟動(dòng)squid 之前,你應(yīng)該謹(jǐn)慎的驗(yàn)證配置文件。
# /usr/local/squid/sbin/squid ?Ds
啟動(dòng)squid 。禁止初始化DNS 測試。正常情況下,squid 直到驗(yàn)證它的DNS 可用才能啟動(dòng)。將日志記錄到syslog 進(jìn)程
# /usr/local/squid/sbin/squid -k shutdown
停止squid 。
# /usr/local/squid/sbin/squid -k rotate
滾動(dòng)日志。
# 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小時(shí)回滾日志一次
0 */12 * * * /usr/sbin/ntpdate 210.72.145.44 && clock ?w # 每12小時(shí)校正時(shí)鐘一次
6、業(yè)務(wù)系統(tǒng)問題解決
問題:緩存不同步
現(xiàn)象:不同地區(qū)顯示頁面不一致
解決:在8臺(tái)cache 服務(wù)器手工刷新緩存,由業(yè)務(wù)部門提供有問題的URL 鏈接。