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