前言
前面說到設計一個小型的C/S類型遠程終端套件以替換SSH,并且已經應用到線上。這個問題,其實不是Tsung自身的問題,是外部連接依賴問題。
Tsung在啟動分布式壓測時,主節點tsung_controller
要連接的從機必須要填寫主機名,主機名沒有內網DNS服務器支持解析的情況下(我所經歷互聯網公司很少有提供支持的),只好費勁在/etc/hosts
文件中填寫主機名稱和IP地址的映射關系,頗為麻煩,尤其是要添加一批新的壓測從機或從機變動頻率較大時。
那么如何解決這些問題呢,讓tsung在復雜的機房內網環境下,完全基于IP進行直連,這將是本文所討論的內容。
預備知識
完全限定域名
完全限定域名,縮寫為FQDN (fully qualified domain name),賽門鐵克給出的中文定義:
一種用于指定計算機在域層次結構中確切位置的明確域名。
一臺特定計算機或主機的完整 Internet 域名。FQDN 包括兩部分:主機名和域名。例如 mycomputer.mydomain.com。
一種包含主機名和域名(包括頂級域)的 URL。例如,www.symantec.com 是完全限定域名。其中 www 是主機,symantec 是二級域,.com 是頂級域。FQDN 總是以主機名開始且以頂級域名結束,因此 www.sesa.symantec.com 也是一個 FQDN。
若機器主機名為內網域名形式,并且支持DNS解析,方便其它服務器可通過該主機名直接找到對應IP地址,能夠 ping -c 3 機器域名
通,那么機器之間能夠容易找到對方。
服務器hostname的命名,若不是域名形式,簡短名稱形式,比如“yk_mobile_dianxin_001”,一般內網的DNS服務器不支持解析,機器之間需要互相在/etc/hosts文件建立彼此IP地址映射關系才能夠互相感知對方。
Erlang節點名稱的規則
因為Tsung使用Erlang編寫,Erlang關于節點啟動名稱規定,也是Tsung需要面對的問題。
Erlang節點名稱一般需要遵循兩種格式:
- 一般名稱(也稱之為短名稱)形式,不包含“.”字符,比如
erl -name tsun_node
- 完全限定域名形式
- 域名形式,比如
erl -name tsun_node.youdomain.com
- IP形式,比如
erl -name 10.10.10.103
Tsung處理方式:
- 若非特別指定,一般默認為短名稱形式
- 啟動時可以通過
-F
參數指定使用完全限定域名形式
獲得IP地址
主機名稱無論是完全限定域名形式,還是簡單的短名稱形式,當別的主機需要通過主機名訪問時,系統層面需要通過DNS系統解析成IP地址才能夠進行網絡連接。當內網DNS能夠解析出來IP來,沒有什么擔心的;(短名稱)解析不出來時,多半會通過寫入到系統的 /etc/hosts
文件中,這樣也能夠解析成功。
一般機房內網環境,主機名稱大都是短名稱形式,若需分布式,每一個主機之間都要能夠互相聯通,最經濟做法就是直接使用IP地址,可避免寫入大量映射到 hosts 文件中,也會避免一些隱患。
主節點啟動增加IP支持
默認情況下,Tsung Master主節點名稱類似于tsung_controller@主機名
:
- 節點名稱前綴默認為:
tsung_controller
(除非在tsung啟動時通過-i
指定前綴)
- 一般主機名都是字符串形式(
hostname
命令可設置主機名)
- 可將主機名稱設置為本機IP,但不符合人類認知慣性
既然Tsung主節點默認對IP節點名稱支持不夠,改造一下tsung/tsung.sh.in
腳本。
Tsung啟動時-F
參數為指定使用完全限定域名(FQDN)形式,不支持攜帶參數。若要直接傳遞IP地址,類似于:
-F Your_IP
修改tsung.sh.in
,可以傳遞IP地址,手動組裝節點名稱:
F) NAMETYPE="-name"
SERVER_IP=$OPTARG
if [ "$SERVER_IP" != "" ]; then
CONTROLLER_EXTENDS="@$SERVER_IP"
fi
;;
修改不復雜,更多細節請參考:https://github.com/weibomobile/tsung/blob/master/tsung.sh.in
啟動Tsung時,指定本地IP:
tsung -F 10.10.10.10 -f tsung.xml start
tsung_controller目前節點名稱已經變為:
-name tsung_controller@10.10.10.10
嗯,目標達成。
從節點主機增加IP配置
給出一個節點client50配置:
<client host="client50" maxusers="100000" cpu="7" weight="4">
<ip value="10.10.10.50"></ip>
<ip value="10.10.10.51"></ip>
</client>
Tsung Master想訪問client50,需要提前建立client50與IP地址的映射關系:
echo "10.10.10.50 client50" >> /etc/hosts
host
屬性默認情況下只能填寫長短名稱,無法填寫IP地址,為了兼容已有規則,修改tsung-1.0.dtd
文件為client元素新增一個hostip
屬性:
<!ATTLIST client
cpu NMTOKEN "1"
type (machine | batch) "machine"
host NMTOKEN #IMPLIED
hostip CDATA ""
batch (torque | pbs | lsf | oar) #IMPLIED
scan_intf NMTOKEN #IMPLIED
maxusers NMTOKEN "800"
use_controller_vm (true | false) "false"
weight NMTOKEN "1">
修改src/tsung_controller/ts_config.erl
文件,增加處理邏輯,只有當主節點主機名為IP時才會取hostip
作為主機名:
{ok, MasterHostname} = ts_utils:node_to_hostname(node()),
case {ts_utils:is_ip(MasterHostname), ts_utils:is_ip(Host), ts_utils:is_ip(HostIP)} of
%% must be hostname and not ip:
{false, true, _} ->
io:format(standard_error,"ERROR: client config: 'host' attribute must be a hostname, "++ "not an IP ! (was ~p)~n",[Host]),
exit({error, badhostname});
{true, true, _} ->
%% add a new client for each CPU
lists:duplicate(CPU,#client{host = Host,
weight = Weight/CPU,
maxusers = MaxUsers});
{true, _, true} ->
%% add a new client for each CPU
lists:duplicate(CPU,#client{host = HostIP,
weight = Weight/CPU,
maxusers = MaxUsers});
{_, _, _} ->
%% add a new client for each CPU
lists:duplicate(CPU,#client{host = Host,
weight = Weight/CPU,
maxusers = MaxUsers})
end
嗯,現在可以這樣配置從節點了,不用擔心Tsung啟動時是否附加-F
參數了:
<client host="client50" hostip="10.10.10.50" maxusers="100000" cpu="7" weight="4">
<ip value="10.10.10.50"></ip>
<ip value="10.10.10.51"></ip>
</client>
其實,只要你確定只使用主節點主機名為IP地址,可以直接設置host屬性值為IP值,可忽略hostip屬性,但這以犧牲兼容性為代價的。
<client host="10.10.10.50" maxusers="100000" cpu="7" weight="4">
<ip value="10.10.10.50"></ip>
<ip value="10.10.10.51"></ip>
</client>
為了減少/etc/hosts
大量映射寫入,還是推薦全部IP形式,這種形式適合Tsung分布式集群所依賴服務器的快速租賃模型。
源碼地址
針對Tsung最新代碼增加的IP直連特性所有修改,已經放在github上:
https://github.com/weibomobile/tsung 。
并且已經遞交pull request
: https://github.com/processone/tsung/pull/189 。
比較有意思的是,有這樣一條評論:
?
針對Tsung 1.6.0修改版
最近一次發行版是tsung 1.6.0,這個版本比較穩定,我實際壓測所使用的就是在此版本上增加IP直連支持(如上所述),已經被單獨放入到github上:
https://github.com/weibomobile/tsung-1.6.0
至于如何安裝,git clone
到本地,后面就是如何編譯tsung的步驟了,不再累述。
小結
若要讓IP直連特性生效,再次說明啟用步驟一下:
- tsung.xml文件配置從機hostip屬性,或host屬性,填寫正確IP
- tsung啟動時,指定本機可用IP地址:
tsung -F Your_Available_IP -f tsung.xml ... start
IP直連,再配合前面所寫SSH替換方案,可以讓Tsung分布式集群在復雜網絡機房內網環境下適應性向前邁了一大步。
2016-08-06 更新此文,增加Tsung 1.6.0修改版描述