集群應(yīng)用及運維經(jīng)驗小結(jié)
作者: 大圓那些事 | 文章可以轉(zhuǎn)載,請以超鏈接形式標明文章原始出處和作者信息
網(wǎng)址: http://www.rzrgm.cn/panfeng412/archive/2013/06/27/cluster-use-and-maintain-experience-summary.html
本人目前很重要的一部分工作是參與或負責部門內(nèi)一些集群的維護、應(yīng)用開發(fā)以及優(yōu)化,其中包括:HBase集群、Storm集群、Hadoop集群、Super Mario集群(部門內(nèi)部開發(fā)的實時流處理系統(tǒng))等,隨著業(yè)務(wù)的拓展,集群機器數(shù)已經(jīng)小有規(guī)模。
接下來是我對自己這1年多以來,在集群應(yīng)用與運維方面所做事情的梳理與總結(jié)。以下內(nèi)容有些零散,大家姑且當做一篇非嚴格意義上的技術(shù)文章來閱讀。
1)安裝、部署過程要盡可能自動化。
將集群搭建的步驟腳本化,可以做到批量部署多個節(jié)點、快速上線/下線一個節(jié)點。集群的節(jié)點多,或者不斷有節(jié)點上下線的話,都能省出不少的時間。
2)搭建并充分利用好集群的監(jiān)控系統(tǒng)。
首先,最重要的是集群自帶的監(jiān)控系統(tǒng)。例如,HBase的Master、Region Server監(jiān)控頁面;Hadoop的JobTracker/TaskTracker、NameNode/DataNode監(jiān)控頁面;Storm的Storm UI監(jiān)控頁面,等等。這類監(jiān)控側(cè)重集群上的作業(yè)、資源等,而且包含的信息很全,包括作業(yè)運行的異常日志等,這對于排查、定位問題是非常及時有效的。
其次,既然是集群,就需要有一個統(tǒng)一的監(jiān)控地址負責收集、展示各個節(jié)點的工作狀態(tài),集群既不能太閑,也不能負載過高。因此,我們需要對集群內(nèi)各節(jié)點的CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等進行監(jiān)控。Ganglia是個很不錯的工具,它的安裝配置過程簡單,采集的指標豐富,而且支持自定義,像Hadoop、HBase都對Ganglia進行了擴展。
3)為集群內(nèi)節(jié)點添加必要的運維腳本。
刪除過期的、無用的日志文件,否則磁盤占滿會導(dǎo)致節(jié)點不工作甚至發(fā)生故障,如Storm集群的Supervisor進程日志、Nimbus進程日志,Hadoop集群的各個進程日志。
為集群上的守護進程添加開機自啟動腳本,盡可能避免宕機重啟后的人工干預(yù)。例如,CDH已經(jīng)為Hadoop、Hive、HBase等添加了啟動腳本,rpm安裝后進程可在機器重啟后自啟動。
同時監(jiān)控集群上的守護進程是否存在,不存在則直接重啟。這種方式只適用于無狀態(tài)的進程,像Storm的Nimbus、Supervisor進程,Zookeeper進程等,都應(yīng)該加上這樣的監(jiān)控腳本,確保服務(wù)進程終止后可以盡快被重啟恢復(fù)。例如,通過設(shè)置crontab每分鐘檢查一次。
4)根據(jù)業(yè)務(wù)特點添加應(yīng)用層的監(jiān)控和告警。
對于業(yè)務(wù)層的計算任務(wù),可以監(jiān)控每天產(chǎn)出數(shù)據(jù)的大小和時間,如果出現(xiàn)異常情況(如數(shù)據(jù)文件的大小驟變,計算結(jié)果產(chǎn)出延遲等)則進行報警。
對于實時計算的應(yīng)用,最重要的是數(shù)據(jù)處理是否出現(xiàn)明顯延遲(分鐘延遲、秒級延遲等),基于此,可以定義一系列的規(guī)則,觸發(fā)不同級別的報警,以便第一時間發(fā)現(xiàn)并解決問題。
5)使多個用戶能夠共享集群的計算和存儲資源。
使用集群的Quota限制不同用戶的資源配額,例如Hadoop就提供了這一機制;但是,Storm和HBase目前并沒有發(fā)現(xiàn)有什么方式可以限制。
通過多用戶隊列的方式對集群的資源進行限制與隔離。例如Hadoop為了解決多用戶爭用計算資源的情況,使用Capacity Scheduler或Fair Scheduler的方式,對不同用戶提交的作業(yè)進行排隊,可以直接部署應(yīng)用,也可以根據(jù)業(yè)務(wù)需求對其進行定制后使用,很方便。
對于Storm集群,其計算資源也是按照Slots劃分的,因此可以考慮在Storm之上加上一層資源控制模塊,記錄每個用戶最大可占用的Slots數(shù)、當前已占有的Slots數(shù)等,從而實現(xiàn)用戶的資源配額(不過目前Storm無論從集群規(guī)模還是內(nèi)部使用用戶來看,都還不算多,這一需求并不是特別迫切)。
另外,不同用戶對集群的訪問控制權(quán)限十分必要。比如,是否可以提交作業(yè)、刪除作業(yè),查看集群各類資源等,這是保證集群安全運行的一道基本保障。
6)實時計算應(yīng)用要想辦法應(yīng)對流量峰值壓力。
真實壓測:例如為了應(yīng)對雙11當天流量壓力,模擬平時3~5倍流量進行壓測,提前發(fā)現(xiàn)解決問題,保證系統(tǒng)穩(wěn)定性。
運維開關(guān):通過加上運維開關(guān),避免流量峰值時刻對系統(tǒng)帶來的沖擊,例如,通過ZooKeeper對實時計算應(yīng)用加上開關(guān),在線調(diào)整處理速度,允許一定時間的延遲,將流量平滑處理掉。
容錯機制:實時計算的場景隨流量的變化而變化,可能遇到各種突發(fā)情況,為此在做系統(tǒng)設(shè)計和實現(xiàn)時必須充分考慮各種可能出錯的情況(如數(shù)據(jù)延遲、丟數(shù)據(jù)、臟數(shù)據(jù)、網(wǎng)絡(luò)斷開等等)。
穩(wěn)定性與準確性折中:建議不要在實時計算中過于追求計算結(jié)果的準確性,為了保證系統(tǒng)的穩(wěn)定運行,可以犧牲一定的準確性,保證應(yīng)用能夠“活下去”更重要。
7)多種方式追蹤、定位、解決集群中的問題。
借助于集群的監(jiān)控系統(tǒng),定位問題所在的具體機器。登錄到問題機器上,也可使用top、free、sar、iostat、nmon等常用命令進一步查看、確認系統(tǒng)資源使用情況、問題之處。
同時,通過查看集群上的日志(包括集群級別、業(yè)務(wù)級別),確認是否有異常日志及對應(yīng)的原因。
另外,也可通過strace、jvm工具等方式追蹤工作進程,從問題現(xiàn)場尋找原因。
8)集群運行任務(wù)的一些調(diào)優(yōu)思路。
綜合考慮系統(tǒng)資源負載:結(jié)合集群監(jiān)控,從各個節(jié)點上任務(wù)實例的運行情況(CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)),定位系統(tǒng)瓶頸后再做優(yōu)化,盡可能使得每個節(jié)點的系統(tǒng)資源得到最大利用,尤其是CPU和內(nèi)存。
任務(wù)實例并行化:可以并行化的直接采用多shard,多進程/多線程的方式;復(fù)雜的任務(wù)則可以考慮先進行拆解,然后進行并行化。
不同類型的任務(wù):CPU密集型考慮利用多核,將CPU盡可能跑滿;內(nèi)存密集型則考慮選擇合適的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)在內(nèi)存中壓縮(壓縮算法的選擇)、數(shù)據(jù)持久化等。
緩存Cache:選擇將頻繁使用、訪問時間開銷大的環(huán)節(jié)做成Cache;通過Cache減少網(wǎng)絡(luò)/磁盤的訪問開銷;合理控制Cache的大小;避免Cache帶來的性能顛簸,等等。
浙公網(wǎng)安備 33010602011771號