Apache Traffic Server 簡介
一 介紹
</span></h2>
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。

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 進程。

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
http://www.apache.org/dist/trafficserver/trafficserver-2.1.1-unstable.tar.bz2
wget
http://www.apache.org/dist/trafficserver/trafficserver-2.1.1-unstable.tar.bz2.md5
md5sum -c trafficserver-2.1.1-unstable.tar.bz2.md5
tar jxvf trafficserver-2.1.1-unstable.tar.bz2
cd trafficserver-2.1.1-unstable
2. 編譯、安裝
查看 README
說明文檔,安裝編譯依賴的庫(centos 可參照 fedora 依賴的軟件包,pcre包替換為 pcre-devel 即可)
./configure --help
查看編譯的一些選項
./configure (默認安裝在 /usr/local,如需修改,使用
--prefix=PREFIX;參數中還有用戶和用戶組選項,這是 TS 進程運行的身份,默認均為 nobody,centos
可以不作修改,其他發行版可能需要修改,如 ./configure --with-group=nogroup)
make
make install 以管理員身份執行
目錄結構
默認目錄
內容
/usr/local/var/log/trafficserver
運行時創建的日志文件
/usr/local/var/trafficserver
運行時的一系列文件
/usr/local/etc/trafficserver
配置文件
/usr/local/bin
可執行文件
/usr/local/libexec/trafficserver
插件
初步配置
records.config 是 key-value 格式的配置文件,負責大部分全局的選項設置,即主配置文件。
storage.config 用于指定磁盤存儲。
remap.config
定義映射規則,用于請求的重寫(rewrite),反向代理即在此配置。
- records.config 中關鍵的配置
CONFIG
proxy.config.exec_thread.autoconfig INT 1
CONFIG proxy.config.exec_thread.autoconfig.scale FLOAT
2.0
CONFIG proxy.config.exec_thread.limit INT
2 #
經觀察是每個核創建的線程數,官方文檔中未提及
CONFIG proxy.config.cluster.ethernet_interface STRING
eth0 # 設置以太網接口
CONFIG proxy.config.http.server_port INT
8080 # 監聽端口,反向代理通常為80
LOCAL proxy.local.incoming_ip_to_bind STRING 0.0.0.0
# 綁定的 IP,可省略,默認即為 0.0.0.0
CONFIG proxy.config.http.cache.http INT 1 #
打開緩存功能
CONFIG proxy.config.cache.ram_cache.size INT
512M # RAM 緩存大小
CONFIG proxy.config.reverse_proxy.enabled INT
1 # 打開
CONFIG proxy.config.url_remap.remap_required INT 1 #
1為只反向代理,0為正向+反向代理
CONFIG proxy.config.url_remap.pristine_host_hdr INT 0
CONFIG proxy.config.ssl.enabled INT 0 #
關閉SSL
CONFIG proxy.config.ssl.server.cert.filename STRING
server.pem
CONFIG proxy.config.http.server_max_connections INT
2000 # 同源服務器的最大連接數
CONFIG proxy.config.http.keep_alive_no_activity_timeout_out
INT 60 # 當一個事務結束后同原服務器保持連接的時間
-
remap.config
配置
map http://cdn.example.com/js
http://js.example.com
#
通過 DNS
輪詢可實現負載均衡
reverse_map http://js.example.com
http://cdn.example.com/js #
reverse_map
能在源服務器 有 HTTP
重定向跳轉時,修改重定向請求,即重寫 Location
頭部內容
map http://cdn.example.com/css
http://css.example.com
reverse_map http://css.example.com
http://cdn.exampe.com/css
map http://cdn.example.com/img
http://img.example.com
reverse_map http://img.example.com http://cdn.example.com/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 未來將在很多場景中替代傳統的代理和緩存服務器而成為大家的首選。
0.1 這個參數可以作調整,并且能限制 freshness_limit 的上下限,默認最小是 1 小時,最大是 1 天
默認目錄
內容
/usr/local/var/log/trafficserver
運行時創建的日志文件
/usr/local/var/trafficserver
運行時的一系列文件
/usr/local/etc/trafficserver
配置文件
/usr/local/bin
可執行文件
/usr/local/libexec/trafficserver
插件
CONFIG proxy.config.exec_thread.autoconfig INT 1
CONFIG proxy.config.exec_thread.autoconfig.scale FLOAT 2.0
CONFIG proxy.config.exec_thread.limit INT
2
CONFIG proxy.config.cluster.ethernet_interface STRING eth0 # 設置以太網接口
CONFIG proxy.config.http.server_port INT
8080
LOCAL proxy.local.incoming_ip_to_bind STRING 0.0.0.0 # 綁定的 IP,可省略,默認即為 0.0.0.0
CONFIG proxy.config.http.cache.http INT 1 # 打開緩存功能
CONFIG proxy.config.cache.ram_cache.size INT
512M
CONFIG proxy.config.reverse_proxy.enabled INT
1
CONFIG proxy.config.url_remap.remap_required INT 1 # 1為只反向代理,0為正向+反向代理
CONFIG proxy.config.url_remap.pristine_host_hdr INT 0
CONFIG proxy.config.ssl.enabled INT 0 # 關閉SSL
CONFIG proxy.config.ssl.server.cert.filename STRING server.pem
CONFIG proxy.config.http.server_max_connections INT
2000
CONFIG proxy.config.http.keep_alive_no_activity_timeout_out INT 60 # 當一個事務結束后同原服務器保持連接的時間