廣東電信IPTV業(yè)務(wù)近年來飛速發(fā)展,2016年用戶數(shù)約400萬,2017年 用戶數(shù)約600萬,2018年已經(jīng)超過1000萬。
隨著用戶數(shù)迅猛發(fā)展,IPTV 需要讓用戶得到更優(yōu)體驗留住用戶,讓用戶可以充分參與內(nèi)容、發(fā)現(xiàn)人,讓看電視更加有趣,更好玩。這就需要一個電視互動系統(tǒng)提供消息通道,打通用戶端和運營端,使運營人員,特別是第三方的運營人員,能即時有效地發(fā)送互動信息,呈現(xiàn)給用戶,并接收用戶的操作指令,完成互動業(yè)務(wù)。這些應(yīng)用同時面向前向用戶及后向合作伙伴。前向用戶使用IPTV的互動類消息應(yīng)用,可以從電視中獲取更多信息并積極參與電視內(nèi)容的進程,增強用戶觀看電視的樂趣。后向合作伙伴則可以通過廣告、競猜、投票等應(yīng)用接觸到前向用戶,以達增加收入、活躍用戶的目的。
廣東電信iptv互動消息平臺,就是為了支撐廣東電信IPTV互動電視業(yè)務(wù)開發(fā)的一個平臺。目前平臺使用服務(wù)器30左右,以后還會隨業(yè)務(wù)量增加而增加。需要對系統(tǒng)的服務(wù)器資源、應(yīng)用服務(wù)器關(guān)鍵參數(shù)、以及業(yè)務(wù)接口可用性等多種監(jiān)控項目進行監(jiān)控。平臺使用的服務(wù)器為廣東電信云機房提供,本來已經(jīng)有基本的監(jiān)控功能,但該功能有效展現(xiàn)的內(nèi)容不多,也不支持業(yè)務(wù)級別的監(jiān)控,無法滿足運營支撐需要。
市面上有比較成熟的監(jiān)控開源軟件,如nagios、heartbeat等。根據(jù)項目實際情況,需要的是一個簡單有效,易于維護的監(jiān)控系統(tǒng)。復(fù)雜,非java開發(fā)的監(jiān)控系統(tǒng)不利于維護。因此項目組決定自行開發(fā)一套簡單適用的監(jiān)控系統(tǒng)。
為使用最合適的技術(shù),項目對比了幾種監(jiān)控系統(tǒng):
(1)廣東電信云平臺監(jiān)控系統(tǒng)
云平臺監(jiān)控系統(tǒng)是提供給云服務(wù)器使用者自助使用。該系統(tǒng)提供cpu、內(nèi)存、網(wǎng)絡(luò)流量等基本資源指標的監(jiān)控數(shù)據(jù)。該系統(tǒng)使用SNMP技術(shù),服務(wù)器上啟動snmpd進程,向采集服務(wù)器發(fā)送數(shù)據(jù)。但是該系統(tǒng)不支持由用戶擴展監(jiān)控項目,無法對業(yè)務(wù)接口、業(yè)務(wù)信息進行監(jiān)控。除非建立自己的snmp數(shù)據(jù)采集服務(wù)器。而snmp采集的數(shù)據(jù),大多數(shù)對業(yè)務(wù)需要來說是多余的。
(2)Nagios開源監(jiān)控系統(tǒng)
Nagios是一個監(jiān)視系統(tǒng)運行狀態(tài)和網(wǎng)絡(luò)信息的監(jiān)視系統(tǒng)。Nagios能監(jiān)視所指定的本地或遠程主機以及服務(wù),同時提供異常通知功能等。 Nagios可運行在Linux/Unix平臺之上,同時提供一個可選的基于瀏覽器的WEB界面以方便系統(tǒng)管理人員查看網(wǎng)絡(luò)狀態(tài),各種系統(tǒng)問題,以及日志等等。該系統(tǒng)由nrpe客戶端插件、nagios服務(wù)器、rrdtools+pnp4nagios數(shù)據(jù)展現(xiàn)組成。項目組也使用過nagios一段時間,缺點包括,安裝需要編譯比較復(fù)雜容易出錯;運行不穩(wěn)定;數(shù)據(jù)展現(xiàn)不合要求;展示圖形不符合業(yè)務(wù)要求;不好修改。
(3)Elastic Heartbeat
這個監(jiān)控系統(tǒng)是elastic公司開發(fā),可以和elasticsearch搜索引擎,kibana數(shù)據(jù)展現(xiàn)聯(lián)合使用。但是該系統(tǒng)需要幾大組件配合使用,對硬件較高;另外有大量無用的監(jiān)控信息,格式冗長,非常消耗系統(tǒng)空間。而且elasticsearch商用并不免費。
對比之后,發(fā)現(xiàn)目前比較常用的監(jiān)控系統(tǒng)要么不滿足需求,要么過于復(fù)雜,難以修改,因此決定自行開發(fā)。
一般的監(jiān)控系統(tǒng)都是由監(jiān)視數(shù)據(jù)采集模塊、存儲模塊、展示模塊等基本模塊構(gòu)成。
采集模塊基于易于實現(xiàn)、易于修改維護的指導(dǎo)思想,監(jiān)控實時性、程序效率性要求不高,使用linux操作系統(tǒng)的前提下,客戶端監(jiān)控數(shù)據(jù)采集部分使用linux內(nèi)生解釋型的shell語言作為基礎(chǔ)實現(xiàn)語言。由一組shell程序控制。Shell語言性能不高,但是用于秒級的監(jiān)控數(shù)據(jù)收集已經(jīng)是足夠了。另外,如果該控制程序以后到達瓶頸,也可以改用效率更高的python、java等。
存儲模塊則采用kafka,可以對大量監(jiān)控數(shù)據(jù)進行快速的檢索,展現(xiàn)部分自行開發(fā)web頁,并采用百度的圖形插件。
經(jīng)過需求分析,項目組對系統(tǒng)的要求為:
(1)易于增加監(jiān)控項目。
(2)可以短信、郵件及電話告警。
(3)展示頁面易于對比各個服務(wù)器差異。
(4)實時性要求不高,滿足10秒級別即可。
(5)適用于linux平臺
主要模塊包括:
①采集模塊
②存儲模塊
③傳送模塊
④展示模塊
⑤告警模塊
(1)采集模塊:
作用:在需要監(jiān)控的服務(wù)器上,執(zhí)行一系列程序,獲取需要監(jiān)控項目的格式化數(shù)據(jù)。
實現(xiàn)技術(shù):linux shell腳本,或者python程序,或者其他可以執(zhí)行的任何程序。
圖1 監(jiān)控系統(tǒng)架構(gòu)圖
實現(xiàn)方法:控制程序根據(jù)配置文件制定的周期,循環(huán)執(zhí)行一系列監(jiān)控項目信息獲取程序,得到一組格式化的輸出數(shù)據(jù)。每個監(jiān)控程序負責(zé)輸出一個監(jiān)控項目的數(shù)據(jù)。為避免不需要的數(shù)據(jù),減少傳遞時的網(wǎng)絡(luò)流量和減少存儲空間,設(shè)計滿足要求的最小數(shù)據(jù)集合即可。包括:監(jiān)控項目名稱、服務(wù)器名、服務(wù)器ip、時間、狀態(tài)碼。 考慮到兼容性和擴展性,任何一個監(jiān)控項目,只要能夠輸出格式正確的數(shù)據(jù)信息即可,不管使用何種語言實現(xiàn)。也就是說,可以用任何一種語言編寫一個監(jiān)控程序,只要這個程序按照規(guī)定的格式輸出數(shù)據(jù),放入監(jiān)控流程,就能實現(xiàn)監(jiān)控、展示、以及告警。
舉例:例如想對cpu的運行情況進行監(jiān)控,編寫一個cpu-idle.sh的腳本,利用vmstat命令獲取cpu的idle數(shù)據(jù),格式化輸出監(jiān)控項目名稱、服務(wù)器名、ip地址、時間、監(jiān)控值。類似:cpu-idle,serverna me,192.168.0.1,2018-10-06 09:28:47,100。得到格式化數(shù)據(jù)后,輸出到日志文件,例如monitor.log,這樣就得到一個不斷增長的日志文件。
(2)存儲模塊:
作用:持久化存儲監(jiān)控數(shù)據(jù),并提供實時獲取方法和檢索方法。
實現(xiàn)技術(shù):考慮到服務(wù)器數(shù)量達到30臺,而且未來還會隨業(yè)務(wù)增長,我們使用kafka來實現(xiàn)存儲模塊,如果數(shù)據(jù)量不大也可以考慮使用數(shù)據(jù)庫如mysql實現(xiàn)。Kafka是Apache軟件基金會開發(fā)的一個開源流處理平臺,是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理大規(guī)模流數(shù)據(jù),適合大量的數(shù)據(jù)實時處理。
實現(xiàn)方法:搭建好kafka后,在kafka上設(shè)置一個monitor主題,就可以使用客戶端程序往這個主題發(fā)送數(shù)據(jù)和獲取數(shù)據(jù)。
(3)傳送模塊:
作用:連接監(jiān)控日志和存儲模塊,把不斷增長的日志文件內(nèi)容即監(jiān)控數(shù)據(jù)傳送到存儲。
實現(xiàn)技術(shù):使用和kafka配套的 filebeat工具,可以穩(wěn)定傳送監(jiān)控數(shù)據(jù)。Filebeat是elastic公司開發(fā)的一個日志文件托運工具,會監(jiān)控日志目錄或者指定的日志文件,追蹤讀取這些文件(追蹤文件的變化,不停的讀),并且轉(zhuǎn)發(fā)這些信息到elasticsearch或者logstarsh、kafka中存放。曾經(jīng)有一段時間項目組使用kafka的python客戶端程序,結(jié)合tail命令來跟蹤傳送監(jiān)控日志文件,但是這個方法難以保證python線程穩(wěn)定運行,不時會產(chǎn)生終端。使用 filebeat之后,除了網(wǎng)絡(luò)中斷和服務(wù)器宕機,沒有發(fā)生其他錯誤。
實現(xiàn)方法:下載安裝 filebeat,配置文件( filebeat.yml)指明要傳遞的日志文件地址和接收數(shù)據(jù)的地址。例如要跟蹤的日志文件為/log/monitor.dat,kafka集群服務(wù)器地址為svr1:9000,svr2:9000,kafka的topic為monitor,那么配置文件為:
filebeat.prospectors:
- input_type: log
enabled: true
paths:
-/log/monitor.dat
tail_ files: true
output.kafka:
hosts:["svr1:9000","svr2:9000"]
topic:'monitor' # hostip from env
required_acks:1 # ack from leader
max_message_bytes:20480
compression:none
codec.format:
string: '%{[message]}'
(4)展示模塊
作用:將監(jiān)控數(shù)據(jù)展示成便于觀察的圖形
實現(xiàn)技術(shù):訂閱kafka的monitor主題,獲取數(shù)據(jù)實時接口獲取數(shù)據(jù),并利用百度圖標插件的開發(fā)的圖形展示頁
實現(xiàn)方法:kafka支持實時流接口獲取數(shù)據(jù)和按指定時間段等條件獲取數(shù)據(jù)。Kafka有python開發(fā)包,引用開發(fā)包,初始化一個Consumer對象,可以獲得訂閱的主題數(shù)據(jù)。Web應(yīng)用在動態(tài)展示服務(wù)器最新監(jiān)控數(shù)據(jù),然后將這些數(shù)據(jù)按監(jiān)控項目,展示成折線圖,多個服務(wù)器同時展示,可以馬上掌握當前各個服務(wù)具體性能壓力,便于對比分析。
(5)告警模塊:
作用:當某監(jiān)控項目超出閾值,對維護人員發(fā)出郵箱、短信、電話等告警信息。
實現(xiàn)技術(shù):利用kafka實時訂閱接口獲取數(shù)據(jù),使用python變成分析數(shù)據(jù),使用郵箱接口、web電話等接口發(fā)出告警。
實現(xiàn)方法:獲取訂閱數(shù)據(jù)后,與對應(yīng)監(jiān)控項目的設(shè)定閾值做對比,超出閾值的記錄下來,如果短期內(nèi)持續(xù)超出閾值一定數(shù)量,則開始發(fā)郵件告警,另外可以調(diào)用web電話接口,進行電話告警。(如圖2所示)
圖2
經(jīng)過近兩年時間的運行,本監(jiān)控系統(tǒng)可以穩(wěn)定運行,并有效支撐了運維工作,滿足設(shè)計要求:
(1)系統(tǒng)資源占用小:雖然監(jiān)控腳本基于shell運行,存儲基于文件日志,在實際運行中,系統(tǒng)資源的占用很小,不影響業(yè)務(wù)系統(tǒng)運行。
(2)結(jié)構(gòu)簡單:已經(jīng)是最簡的監(jiān)控系統(tǒng)設(shè)計,一些業(yè)務(wù)場景如果不需要存儲和展示,還可以做成單機版,對單個服務(wù)器進行監(jiān)控。
(3)易于維護:如果需要增加監(jiān)控項目,增加一個監(jiān)控程序,按格式輸出監(jiān)控數(shù)據(jù)即可。
(4)穩(wěn)定運行:控制好文件大小即使清理陳舊數(shù)據(jù),系統(tǒng)可一直穩(wěn)定運行。
(5)便于對比監(jiān)控:可以方便對比服務(wù)器運行情況,發(fā)現(xiàn)問題。
監(jiān)控圖形舉例:
①對tcp orphaned連接的監(jiān)控。此監(jiān)控項目一般的監(jiān)控系統(tǒng)沒有,但卻是是iptv互動平臺項目關(guān)系的核心系統(tǒng)參數(shù)。(如圖3所示)
②對于redis服務(wù)器instantaneous_ops_per_sec參數(shù)的監(jiān)控。系統(tǒng)用到redis服務(wù)器,是一個定制化的監(jiān)控項目。(如圖4所示)
圖3 tcp-orphaned監(jiān)控圖
圖4 redis instantaneous_ops_per_sec 監(jiān)控圖
③監(jiān)控某端口收到的請求數(shù)。這也是一般監(jiān)控系統(tǒng)沒有的監(jiān)控項目,但是可以反映系統(tǒng)的繁忙程度。(如圖5所示)
圖5 網(wǎng)絡(luò)端口接收請求數(shù)監(jiān)控圖
這套系統(tǒng)是一個結(jié)構(gòu)簡單、穩(wěn)定、易于維護的監(jiān)控系統(tǒng),滿足中小規(guī)模大多數(shù)業(yè)務(wù)的業(yè)務(wù)需求。該系統(tǒng)在iptv互動電視平臺上穩(wěn)定運行,足以支撐iptv互動業(yè)務(wù)未來多年的監(jiān)控需求,可以推廣的其他應(yīng)用系統(tǒng)使用。