文/趙永明
搭建緩存服務(wù)器解流量問題(下)
文/趙永明
第三次配置,實現(xiàn)集群化。全hash的集群是為解決超大規(guī)模的CDN設(shè)計的,因此只有在必要的情況下才需要啟用全Cluster集群模式,普通情況下采用Cluster集群模式來提高管理效率。
在搭建集群前,首先需要確認每個節(jié)點環(huán)境相同。
1.安裝的系統(tǒng)是相同的:
發(fā)行版本相同,如都是CentOS 5.5;
內(nèi)核版本相同,如都是2.6.18-194.17.1.el5;
ARCH相同,如都是x86_64。
2.使用的TS版本是相同的,如用同一個rpm包安裝。
3.各個系統(tǒng)的硬件是相同的,避免因為單個機器的資源不均衡造成服務(wù)質(zhì)量問題。
4.使用同一個交換機或在同一個交換網(wǎng)絡(luò)中。
為完成完全hash集群化,需要在各個機器上執(zhí)行:
1.配置所有的機器使用同一個Cluster集群名字MyCluster:

2.配置啟用全cluster集群模式:

3.然后重啟服務(wù):

TS服務(wù)重啟后,服務(wù)器將會在幾秒內(nèi)加入到整個集群中,可以使用 traffic_line -r proxy.process.cluster. nodes 命令來查詢集群的機器書目。同時可以查看配置文件cluster.config,文件中列有各個機器的IP地址和端口的列表。
集群模式啟動后,traffic_line -x命令將可以影響所有的機器,在一個機器上修改的全局配置,執(zhí)行traffic_line -x后會在集群內(nèi)全部生效。
TS的日常管理中,有很多與其他系統(tǒng)不同的地方,首先我們需要了解一個正常TS系統(tǒng)的表現(xiàn)情況。
在TS的正常情況下,會有3個程序運行:

其中,traffic_cop是以root用戶運行,但是traffic_manager與traffic_server是以nobody用戶運行。
在正常的運行系統(tǒng)中,TS需要監(jiān)聽很多端口,下面是一個實際機器的例子:

其中的各個端口與對應關(guān)系如表1所表示。
TS運行中的日志會存儲在/usr/local/var/log/trafficserver的目錄中,其中traffic.out涉及到關(guān)鍵部分服務(wù)相關(guān)的錯誤信息,是服務(wù)器問題調(diào)試的關(guān)鍵日志文件。
TS的配置文件放在/usr/local/etc/trafficserver中,其中幾個關(guān)鍵的配置文件經(jīng)常會被用到,我們在前面的配置中也有涉及。
1. records.config:主要記錄所有的系統(tǒng)配置參數(shù),前面traffic_line -s所操作的所有參數(shù),都存儲在這里。格式為:

例如:

records.config修改后,需要使用traffic_line -x使其生效。
2. storage.config:配置TS使用的磁盤、或目錄。
格式為:

或:

從上一節(jié)的配置中,我們看到了好幾種日常操作相關(guān)的命令。TS提供了多種日常管理工具,下面簡單介紹TS的主要命令的功能和主要使用方法。
TS的可執(zhí)行程序包含三個主程序和五個工具,以及一個init腳本。
三個主程序:
1. traffic_cop:
負責啟動和管理traffic_manager進程的所謂“警察”程序,確保traffic_manager正確執(zhí)行工作。
2. traffic_manager:
負責啟動和管理traffic_manager進程的所謂“主管”程序,主要功能有啟動并監(jiān)控或重啟traffic_server進程、處理工具系統(tǒng)提交的管理指令。
3. traffic_server:
TS對用戶服務(wù)的主程序,主要負責監(jiān)聽服務(wù)端口、完成用戶請求、完成Cluster資源和任務(wù)調(diào)度、執(zhí)行manager程序的控制指令。
五個工具:
1. traffic_line
設(shè)置、查詢系統(tǒng)配置參數(shù);
查詢系統(tǒng)中的統(tǒng)計數(shù)據(jù);
重啟、重置服務(wù)器或集群所有機器等。
如啟用debug模式,可以使用如下命令:

2. traffic_logcat
用來將TS記錄的二進制的squid日志轉(zhuǎn)換為可讀形式。
3. traffic_logstats
顯示TS的訪問統(tǒng)計詳細數(shù)據(jù)。
4. traffic_shell
一個類似交換機配置界面的命令行管理工具。
5. traffic_sac
一個獨立的工具驗證工具。
在日常管理中,最常見的操作是配置相關(guān)參數(shù),TS提供了很多修改系統(tǒng)參數(shù)方法,我們選擇常用的方法予以介紹,如假設(shè)我們需要修改 TS 到源服務(wù)的 tcp 長連接在沒有傳輸?shù)那闆r下的超時是20 秒,相關(guān)參數(shù)是records. config中的proxy.config.http. keep_alive_no_activity_timeout_out
我們可以采用下述的任何方法完成這個任務(wù):
1. 執(zhí)行traffic_line -s proxy.config.http. keep_alive_no_activity_timeout_out -v 20
2. 修改 records 文件下的 CONFIG proxy.config.http. keep_alive_no_activity_timeout_out INT 30 行
改 30 為 20 ,保存后用 traffic_line -x 生效
3. 執(zhí)行 traffic_shell,進如 enable 模式,執(zhí)行 config: http inactive-timeout-out 20
4.將操作保存為批處理文件,執(zhí)行 traffic_shell 批處理文件。
其他日常經(jīng)常需使用的TS操作命令還有以下幾個:
1.啟動/停止/重啟動ts:trafficserver {start|stop|restart}
2. 清空cache: traffic_server -Cclear ( 該命令在TS停止時執(zhí)行 )
3. 查看cache是否清空: traffic_line -r proxy.process. cache.bytes_used
4. 查看配置的cache大小: traffic_line -r proxy.process. cache.bytes_total
5. 查看集群中的節(jié)點數(shù): traffic_line -r proxy.process. cluster.nodes
TS的日志統(tǒng)計系統(tǒng)功能強大,其中最有特色的功能由traffic_logstats命令提供,這個命令能夠統(tǒng)計所有的訪問情況,并根據(jù)各種情況進行合并統(tǒng)計,可以分別對提供服務(wù)的域名(以remap文件中的源服務(wù)器為統(tǒng)計目標)統(tǒng)計如下計數(shù):
按照域名分別統(tǒng)計;
請求結(jié)果;
返回碼;
回源統(tǒng)計;
HTTP Methods;
Content Types;

表1 各個端口與對應關(guān)系
響應時間;
狀態(tài)統(tǒng)計與監(jiān)控。
統(tǒng)計以上所有的流量相關(guān)數(shù)據(jù)的請求數(shù)、字節(jié)數(shù)絕對值和百分比,以及命中率的最小值、最大值、平均值、標準差值。在生產(chǎn)運行中,具有非常實用的參考價值。
為提高效率,TS的請求日志訪問默認采用squid binary格式,由于二進制無法直接cat等,因此需要使用traffic_logcat才可以顯示出結(jié)果。TS有專用的配置來控制請求日志的格式、大小、保存數(shù)量等。
proxy.config.log2.logging_enabled:控制是否啟用log2格式(即目前TS使用的格式)的日志。
proxy.config.log2.xml_logs_config:是否使用XML格式的日志格式控制系統(tǒng),XML格式的日志管理系統(tǒng)允許就日志的記錄方式進行高度自由定制,其中squid格式的日志即為log2+xml定義出的。

分別控制是否啟用squid各個格式的日志,*_is_ascii控制是否采用文本模式存儲日志,ascii方式會增大日志文件,同時會影響性能,因此TS默認采用二進制方式存儲。
TS支持郵件報警接口,詳情參考records.config:CONFIG proxy.config.alarm*
其他TS很有趣的功能還有待大家開發(fā)。
緩存內(nèi)容后臺自動更新機制;
長連接與read while writing功能;
多端口多SSL證書機制;
透明代理功能;
Cluster CDN實施;
使用 trafficserver構(gòu)建cluster平臺;
提高可管理性、運維效率;
流量管理;
Cluster Proxy實施;
7層路由;
連接管理;
SLA管理。
TS是由Inktomi的科學家們在2000之前完成了絕大部分的設(shè)計與開發(fā)。其中的很多都是赫赫有名的業(yè)內(nèi)專家:
Dirk Grunwald: 現(xiàn)為知名教授,當年為TS寫底層代碼。
Brian Totty : 著有《HTTP: The Definitive Guide》一書。
John Plevyak:至今仍在開發(fā)TS,負責TS的多個核心模塊。
目前在Leif Hedstro帶領(lǐng)下,世界各地有30多個active的開發(fā)者和貢獻者,負責核心代碼的開發(fā)。我們的4人小團隊是國內(nèi)系統(tǒng)研究代碼、翻譯文檔的團隊,并已經(jīng)把多個代碼提交到官方代碼中。
TS是一個由C++語言從底層構(gòu)建出的一個完整的proxy系統(tǒng),實現(xiàn)了一套獨特的事務(wù)處理機制和過程控制機制,對學習如何用C++構(gòu)建一個大型系統(tǒng)具有非常好的參考價值。目前的TS開發(fā)正在一個逐步加速的過程中,很多增強功能、性能改進、代碼優(yōu)化都在進行中,我們非常期望更多的C++開發(fā)者和TS用戶參與到TS的開發(fā)建設(shè)中來。
(作者單位為淘寶網(wǎng))
后記:
本文從初學者的角度介紹了TS的特性和使用方法,是CDN管理員了解和使用TS的第一扇窗。TS是一個非常好的企業(yè)級proxy系統(tǒng),利于企業(yè)化大規(guī)模運維,它具有優(yōu)秀的設(shè)計,方便二次開發(fā)等后續(xù)擴展。
1. 如何啟用debug模式?
修改records.config的如下3行,啟用TS的debug模式調(diào)試模塊:
CONFIG proxy.config.diags.debug.enabled INT 0
CONFIG proxy.config.diags.debug.tags STRING cache.*|cluster.*|chan.*
如改為:
CONFIG proxy.config.diags.debug.enabled INT 1
CONFIG proxy.config.diags.debug.tags STRING dns.*
即可調(diào)試DNS相關(guān)模塊的情況。
debug.tags到底包含有多少模塊?它包括很多模塊,在TS的源代碼目錄里執(zhí)行: grep -ioR 'Debug([a-zA-Z_-"]*,' * | awk -F ( ' {print $2}' | sed 's/[",]//g' | sort -u 可以看到,debug.tags支持正則表述。
Debug信息會打入日志目錄的traffic.out文件中。
2. 如何確定文件是被TS緩存?
分析TS的返回頭密碼:
TS返回給用戶的header中,含有如:Via: HTTP/1.1 localhost.localdomain (ApacheTrafficServer/ 2.1.3-unstable [cHs f ])的內(nèi)容,其中方括號中的部分內(nèi)容是TS的cache狀態(tài)密碼。
A. 詳細參考http://trafficserver.apache.org/ docs/v2/admin/trouble.htm#interpret_via_header
B. 返回via密碼中含有cH即為緩存命中。
分析squid.blog中TCP_HIT與TCP_MISS
網(wǎng)絡(luò)分析:
A. 使用兩臺機子ts1和ts2。在ts1上配置apache,并在/var/www.html/上編輯得到文件如b.html,test.jpg等。之后使用tcpdump監(jiān)聽ts1 80端口的tcp通訊。在ts2配置ts,清空cache并以反向代理模式啟動ts,配置remap. config文件,添加規(guī)則“map ts1_url ts1_url”(ts1_url代表ts1提供的外部訪問的鏈接)。
B. 配置客戶端,編輯hosts文件,添加一條記錄使得對ts1的訪問轉(zhuǎn)向ts2,并保證瀏覽器不使用緩存。
C. 使用客戶端瀏覽器訪問ts1上的文件b. html兩次,通過wireshark分析tcpdump從ts1上抓的包。如果ts2只從ts1上取了一次b.html,則說明文件被ts2緩存。