Apache Traffic Server(ATS或TS)是壹個高性能的、模塊化的 HTTP 代理和緩存服務器。Traffic Server 最初是 Inktomi 公司的商業產品,該公司在 2003 年被 Yahoo 收購,之後 Traffic Server 壹直在 Yahoo 內部使用長達 4 年,直到 2009 年 8 月 Yahoo 向 Apache 軟件基金會(ASF)貢獻了源代碼,並於 2010 年 4 月成為了 ASF 的頂級項目(Top-Level Project)。 Apache Traffic Server 現在是壹個開源項目,開發語言為C++。
Traffic Server 的開發團隊曾經由 Chuck Neerdaels 領導,他也是 Harvest 項目的早期創始人之壹,Harvest 項目後來發展為十分流行的 Squid 項目;Leif Hedstrom 直接管理著現在的 Traffic Server 開發團隊。目前 Chuck Neerdaels 和 Leif Hedstrom都已加盟知名 CDN 服務提供商 Akamai。
HTTP 代理服務器是 HTTP 服務器的壹種實現,處於客戶端(壹般為瀏覽器)與另壹個 HTTP 服務器之間(通常指源服務器,Origin Server)。HTTP 代理通常分為正向代理、反向代理和透明代理,我們主要關註的是反向代理(Reverse Proxy,見下圖)反向代理服務器根據明確配置的映射規則來處理用戶請求。反向代理服務器通常會設置壹個較大的緩存區,服務器處理請求的同時將請求的內容緩存在服務器本地,當下次用戶請求同壹個對象時,服務器可直接從緩存區裏取出對象,而不用去源服務器去取,起到了加速的效果。另外,配置反向代理的映射規則也能實現負載均衡的功能。除了 Traffic Server,常見的開源代理服務器還有 Squid,Varnish,Nginx,HAProxy。
Apache <wbr>Traffic <wbr>Server <wbr>簡介
Traffic Server 在 Yahoo 內部使用了超過 4 年,主要用於 CDN 服務,CDN 用於分發特定的 HTTP 內容,通常是靜態的內容如圖片、JavaScript、CSS。下面是Traffic Server 在 Yahoo CDN 應用的壹些情況:
超過 4 年的使用中,緩存中沒有出現已知的數據損壞(data corruption);
作為反向代理,服務器方便部署和管理,並且大部分配置的更改可直接在線上服務器完成,而不用重啟服務;
在高並發情況下擴展良好,支持 HTTP/1.1 協議特性,如 SSL、Keep-Alive;
在世界範圍內部署了超過 100 臺服務器;
在實際CDN中,每秒處理超過 350,000 次請求,達到 30 Gbps,最大容量至少十倍於普通使用,以應對高峰時的大量請求;
在實際 CDN 中,每臺服務器有 20,000 到 30,000 的 keep-alive 並發連接,其中有 1,000 到 2,000 的連接是壹直很活躍的;
實驗環境中,單臺服務器每秒處理 105,000 次請求,請求的對象是被緩存住的小文件;
實驗環境中,請求大文件時,單臺服務器達到 3.6 Gbps(4x GigE NIC bonded)。
二 組件、機制
Traffic Server(TS) 的組成
1.Traffic Server緩存
TS 緩存包含壹個高速的對象數據庫,數據庫根據 URL 和相關頭部來索引對象,對於同壹對象可以緩存不同版本(如不同的編碼、語言)。
當緩存空間滿後,TS 會移除過期的數據。
當磁盤出錯時,TS 將不再使用該塊磁盤,轉而使用剩下的磁盤。所有磁盤都出錯時,TS 將切換至 proxy-only 模式,即只代理,不緩存。
可分區,即可以給指定的協議和源服務器劃分壹定數量的磁盤空間
2.RAM 緩存
內存緩存區儲存比較熱門的對象,在流量的高峰期時能加快處理速度和降低磁盤負載。
3.主機數據庫
儲存 DNS 信息,方便主機名到 IP 地址的快速轉換
儲存每個主機的 HTTP 版本,方便高級協議特性的使用
儲存主機的可靠性和可用性信息
4.DNS 解析器
TS 原生實現了 DNS 解析器,不依賴較慢的傳統解析庫。同時也降低了 DNS 的流量。
5.Traffic Server 進程
traffic_server 進程負責接受連接,處理協議請求,然後從緩存或源服務器獲取對象並返回
traffic_manager 進程是 TS 的命令和控制設施,負責啟動、監控和配置 traffic_server 進程,它也負責代理的端口配置、統計信息的接口、集群管理和虛擬 IP 的故障轉移。
如果 traffic_manager 檢測到 traffic_server 進程失效,它立即重啟 traffic_server 進程並且維護壹個連接隊列,保存此時到來的請求,完全重啟後這個隊列裏的連接將按順序被處理。
traffic_cop 進程監視 traffic_server 和 traffic_manager 進程,此進程周期性的查詢 traffic_server 和 traffic_manager 進程的健康狀況,如果查詢在壹定間隔時間內未返回或者返回信息不正確,traffic_cop 將重啟 traffic_manager 和 traffic_server 進程。
Apache <wbr>Traffic <wbr>Server <wbr>簡介
6.管理工具
Traffic Line 是命令行程序,可以用來快速監視 Traffic Server 的性能和網絡流量,也能配置 TS。
Traffic Shell 也是命令行工具,進入該 shell 後有自己壹套語法,可代替 Traffic Line 完成監控、配置任務。
通過 Traffic Line 和 Traffic Shell 對配置作出的修改將會自動寫入配置文件中。
Traffic Server 的底層機制
Apache Traffic Server 不同於大部分開源代理服務器,它結合了兩種技術來處理高並發:
異步事件處理(Asynchronous event processing)
多線程(Multi-threading)
Traffic Server 在多 CPU、多核的硬件上擴展良好,能充分利用所有可用的 CPU 和其他資源。
HTTP 代理緩存相關機制
1. Traffic Server 處理請求的過程
1)用戶請求壹個 web 對象,TS 收到請求
2)TS 通過對象的地址,在對象數據庫(緩存)中去定位該對象
a.如果對象在緩存中,TS 會檢查對象是否新鮮(fresh)
如果新鮮,TS 從緩存裏返回該對象給用戶,此時稱為緩存命中(cache hit)
如果不新鮮(stale),TS 會連接源服務器去驗證對象是否仍然新鮮,即重新驗證(revalidation),如果仍然新鮮,TS 立即將緩存中的副本返回給用戶
b.如果對象不在緩存中(緩存未命中,cache miss),或者緩存的副本不再有效,TS 會去源服務器獲取對象,然後同時做下面兩件事
將對象返回給用戶
將對象放到本地緩存中
2. Traffic Server 判斷 HTTP 對象是否新鮮(fresh)的過程
如果有 Expires 或者 max-age 頭部直接定義緩存的過期時間,TS將對比當前時間和過期時間去判斷對象是否新鮮
如果沒有上述頭部,TS 將檢查 Last-Modified 和 Date 頭部(其中Date是源服務器返回對象的時間,如果沒有 Last-Modified 頭部,TS 會用對象寫入緩存的時間以作代替),然後用以下公式算出新鮮的時間範圍(freshness_limit,可理解為保質期):
freshness_limit = ( Date - Last-Modified ) x 0.1
0.1 這個參數可以作調整,並且能限制 freshness_limit 的上下限,默認最小是 1 小時,最大是 1 天
如果沒有 Expires 頭部或者沒有 Last-Modified、Date 頭部,TS 將使用默認的 fressness limit
另外,TS 還會檢查 cache.config 配置文件中的 revalidate 規則,該規則可以對特定的 HTTP 對象設置特定的驗證時間(特定的域名、IP、壹定規則的 URL、特定的客戶端等等)
3. 緩存過期(stale),Traffic Server 去源服務器重新驗證對象可能的情況
仍然 fresh,TS 重置 freshness_limit,並返回對象
對象新副本可用,TS 緩存新對象,並同時返回給用戶
源服務器上的對象不再存在,TS 也不再返回該副本給用戶
源服務器沒有響應,TS 返回過期的對象並發出警告。
更詳細的說明請查看 Traffic Server 管理文檔中的 HTTP Proxy Caching 部分
三 安裝、使用
Apache Traffic Server 開源後添加了 64 位支持,也移植到了常見的 Linux 發行版、FreeBSD、OpenSolaris 和 Mac OS X,開源之前 Yahoo Traffic Server 壹直運行在 32-bit Linux 上。
(以 Apache Traffic Server 2.1.1 unstable 為例在 32-bit Linux 環境下進行安裝測試)
安裝
1. 下載、解壓
wget ing_ip_to_bind STRING 0.0.0.0 # 綁定的 IP,可省略,默認即為 0.0.0.0
CONFIG proxy.config./js # 通過 DNS 輪詢可實現負載均衡
reverse_map /js # reverse_map 能在源服務器 有 HTTP 重定向跳轉時,修改重定向請求,即重寫 Location 頭部內容
map /css
reverse_map /css
map /img
reverse_map /img
storage.config 配置
/data1 67108864 # 指定壹個或多個目錄,註明緩存大小,也可直接指定 raw 分區,詳見storage.config 中的註釋說明
更詳細的配置可參考官方管理指南 http://trafficserver.apache.org/docs/v2/admin/
服務控制
運行 /usr/local/bin/trafficserver start
結束 /usr/local/bin/trafficserver stop
重啟 /usr/local/bin/trafficserver restart
命令行工具、監控
/usr/local/bin/traffic_line 需用管理員身份執行
查看幫助 traffic_line -h
查看變量的值 traffic_line -r 變量名 (變量名見官方管理指南附錄C,含 TS 運行時統計數據)
給變量賦值 traffic_line -s 變量名 -v 值 (變量名見records.config)
不重啟TS 使配置生效 traffic_line -x
/usr/local/bin/traffic_shell 需用管理員身份執行,進入後提示符為“%”
查看幫助 man traffic_shell (由於開發者疏忽,暫不能用)
show 命令,如 %show:cache-stats 查看緩存統計,如命中情況,緩存大小;如%show:proxy-stats 查看命中率
config 命令,如 %config:logging event disable 關閉日誌;如 %config:cache clear,清除緩存,config命令作出的修改都會立即生效
/usr/local/bin/traffic_logcat 日誌查看工具
traffic_logcat -h 獲得幫助
查看二進制日誌 traffic_logcat 日誌文件名
Traffic Server 系統自身的運行日誌可在 /var/log/message 中查看(centos),用於排錯
traffic_logstats 提供了基於日誌的統計功能
四 結論
Apache Traffic Server 開源後功能在不斷被開發,性能得到很大提升,社區也在逐漸發展,但除了 Yahoo 之外還很少有其他實踐,很多功能(如集群)的文檔有待完善。Traffic Server 豐富的插件開發是其壹大亮點,模塊化的特點使其擁有很好的擴展性和靈活性,再加上它的高性能,相信 Apache Traffic Server 未來將在很多場景中替代傳統的代理和緩存服務器而成為大家的首選。