大數據SRE的總結(1)--部署

在開始寫第一篇《部署》前,我想寫一個日常運維的小插曲。

今天我司的hadoop集群,突然有3-4台機器報警,錯誤是操作系統盤 「/」滿了。我查閱了一下,在/etc/upstart下,有個docker.log. 寫滿了整個系統盤。

這導致這幾台機器上的所有hadoop 進程都掛了,因為這些hadoop進程需要把日誌寫入/var/log但是寫不進去。這個問題是因為docker的日誌錯配造成的。隔壁組開發了一個docker-on-yarn的app,app會把docker container跑在yarn上,分配到空閑機器的container中。container里的docker app產生的app logs會被寫入node manager的data-dir,當這個data-dir被寫滿後,這台機器的docker守護進程就會把這個報錯輸出到守護進程的log,而這個log指向到/etc/upstart/docker.log.

這裡有兩個錯誤:

1.docker app 沒有log rotation,不應該寫滿數據磁碟。

2.docker守護進程的docker.log 沒有配置 log rotation policy,日誌位置的配置也錯誤,應該配為非系統盤路徑。

錯誤發生後,我很擔心,如果我們的集群里還有很多此類節點存在這種錯配的問題,那麼hadoop集群中大量的機器都存在被拖死的危險。如果一起發生,那整個集群就面臨著危險。

於是我找到了隔壁組值班的小夥伴,他開始認為這是一個很小的問題,以為就是日誌錯配了,改好就ok。在我反覆提醒之下,仍然沒有意識到潛在的問題。在我的push下,才把這類app部署的所有docker日誌配置check並修改了一遍。

我寫這個小故事,其實是想反應運維和開發錯位的問題。在生產環境里,運維工程師 和 應用開發工程師 的立場是差別巨大的。 很可能在 應用開發工程師的眼裡,一個很小的問題,並不影響功能,應該為需求上線而讓步。但是在運維工程師這邊,一個錯配,都可能會給線上集群造成很大的影響。

運維很重要!

==================分割線====================

為什麼hadoop部署要拿出來講呢,因為它是hadoop集群存在的第一步,非常重要(似乎是廢話). 當今的規模以上互聯網公司,hadoop集群動輒成百上千,甚至上萬台。這麼多機器,必須要提高部署的效率來應對每時每刻數據的暴增,應對每隔一段時間就會新加入的很多新的機器。這些操作需要運維工程師來操作,如果自動化做的不好,那麼長期做這個事的工程師,會感覺乏味疲憊,操作的責任心也可能會下降,從而可能引起誤操作。長期下去,會陷入惡性循環。

在講部署前,我先從兩個維度,對部署進行分類:

第一個維度,即時代。我把hadoop的部署分為三個時代:

1.裸腳本時代

2.分散式配置管理腳本時代

3.自動化管理系統時代

每個時期,每個公司所採用的技術落地方案在細節都不同,但是其背後的原理,都逃不出這幾個時代維度。

第二個維度,是hadoop的發行版,一般也分為三種情況。

1.apache版本

2.cdh 版本 (由 cloudera 公司定製。 美國公司,即將上市)

3.hdp 版本 (由 hortonworks 公司定製。美國公司,已上市)

所以就有了以下這張二維表:

不論在哪個時代,哪種hadoop發行版,都是這兩個維度的正交。有些情況,比較少見,比如自動化管理系統+apache版本,這一般存在某些互聯網公司自研。而裸腳本時代,也不可能安裝部署cdh和hdp。

在部署hadoop集群時,一般要做這樣三件事。

1.在集群的每一台機器,安裝hadoop整個軟體棧

2.在集群的每一台機器,配置好每一個hadoop的角色的 配置文件

3.在相應的機器,啟動/停止 相應的組件的進程

那麼接下來,就按第一個時代的維度,來看看都是怎麼解決這三件事的。

========================================

第一時代 裸腳本時代

這個時代,部署腳本一般都是一些裸寫的shell/python/ruby 腳本,基本思路就是用ssh登錄到每台機器一步一步幹活。

具體步驟一般如下:

1.先把yum/apt-get 的repo文件copy所有節點上。

2.運行yum/apt-get 安裝hadoop軟體。

3.把準備好的配置文件,copy到所有節點上。

4.ssh到所有節點,啟動上面的datanode nodemanager regionserver等進程。

代表項目:

github.com/hadoop-deplo

缺點:

這個時代的解決方案,缺點很明顯,需要編寫很多繁雜的腳本控制代碼,需要一台一台的去ssh執行流程。如果需要並行安裝多台機器,還要用腳本控制並發邏輯的編程。

這些問題不光光是hadoop集群的問題,也是其它分散式程序的問題。為了解決這類問題,市面出現了很多分散式的配置管理框架,例如ansible/puppet/chef/saltstack, 開源自動化配置框架對比 開源自動化配置管理工具ansible、saltstack、Puppet、Chef選擇 & SaltStack 與 Ansible 選擇?

分散式節點部署-抽象圖 & 痛點分析

第二時代 分散式配置管理腳本時代

很多公司,都是用分散式配置管理腳本來部署hadoop集群,管理hadoop集群的配置。

我自己也在維護一個saltstack+hdp的集群。那我就來分析一下這類解決方案的優劣。

好處:

好處不需多言,網上有很多介紹這類框架的文章。大致就是隱藏了諸如並行、以及通用的一些控制流程序的編寫。(安裝package,複製文件,控制目錄文件的acl 等等)

壞處:

其實這裡不能說是壞處,而是在解決hadoop部署這個問題面前,「分散式配置管理腳本們」還有一些解決的不是很好,或者很難解決的問題。比如:

1.在一部分機器中,如果需要有特殊配置,那就需要重新創建一個表示這類狀態的描述文件。這是一個很麻煩的事情,設想,如果集群內有特殊配置的機器分類越多。那麼「相同,卻又有一部分不同」的配置腳本,就會越來越多。

2.每次修改配置,都需要到git repo統一提交,那麼就要經歷pull最新代碼,merge代碼,再push回倉庫。這似乎對一次運維「太重」了。 比如我們遇到了namenode內存的瓶頸,需要調大heapsize,經歷這麼一遭,似乎太「慢」了。這也不滿足在《大數據SRE的總結(0)--開篇》提出的方法論:「讓一切人對機器的操作儘可能的自動化」。

3.對每台機器的「進程狀態」控制。原則上,hadoop集群的每一個節點,都要啟動datanode,nodemanager,regionserver.因為只有這樣,才滿足計算向數據靠攏的大數據思想(data locality)。運維工程師一般都會維護一張機器到組件進程的映射表<host, [roles..]>,會寫一個外部的周期檢測程序,監控對應機器上,各個進程是否健康的運行。 當集群越來越大後,機器的損壞率會增加,有些機器壞了,會被報修了。而這些機器上的進程也會因為這樣的原因被迫遷移到其它機器,比如zookeeper,journalnode這樣的組件進程就有可能會被迫遷移。這時就需要修改映射表<host, [roles..]>。當集群的機器規模到了百台甚至千台,每次機器壞掉,需要遷移role時。或者每次加入/刪除節點到集群時,維護映射表就成了一個頭疼的問題。

映射表 示例圖

代表項目:

彭博社 bloomberg 使用chef管理hadoop

github.com/bloomberg/ch

github上一些 使用ansible管理hadoop的開源項目

github.com/objectrocket

github.com/lizhitao0923

第三時代 自動化管理系統時代

這個時代的自動化管理系統,架構比較複雜。其主要的設計初衷,都是為了解決運維hadoop的過程中總結/歸納出來的痛點。比如:

1.配置管理,包括配置分組,配置歷史,配置分發。

2.<host,[roles]>映射表,以及每台節點進程狀態的資料庫存儲

3.可視化一切常規運維操作。包括安裝節點,啟動/停止節點,等等。

基本上上規模的互聯網公司,都需要這樣一套SRE系統,來提高公司大數據集群的運維效率,不然運維工程師都該抱怨每天的重複勞動了。這類系統,可以解放運維工程師,做更多的自動化系統,做更好的報警,做更好的調優,和最重要的「自我提升」。

自動化系統,有開源和自研兩條路走。

開源有hortonworks的ambari可供選擇。

小米也開源了自家的hadoop自動化管理系統minos : github.com/XiaoMi/minos

商業版也有cloudera家的cloudera-manager可選。

總之,這類系統的目標,都是為了讓「讓一切人對機器的操作儘可能的自動化

」這個目標得以實現。以解放工程師,提高運維效率為目標。

Ambari

hortonworks.com/apache/

Cloudera-Manager

cloudera.com/products/p

我司最大的集群,也是使用了cloudera manager進行管理。

  • 進程分組 /進程主機映射 /進程狀態

cm的以及進程狀態管理,節點分組圖

  • 可視化的配置管理

可視化配置管理

cloudera也分為:

1.免費版

2.付費版

付費版多一些生猛的功能^_^,還有客服服務, 但免費版已經足夠大部分公司的使用了。(免費版提供hdfs/resourcemanager/hbase-master 的 HA功能哦)

=========================================

最終技術選型的參考決策

作為國內互聯網公司在選擇自動化運維繫統時,我cto們建議先問自己幾個問題。

1.是否願意在商業軟體投入,是想把錢花在買商業軟體直接解決問題,還是想花更多的錢,培養自己的工程師鑽的更細。商業軟體後期面臨被甲方綁架,規模巨大後成本不可控的問題。 工程師團隊面臨早中期投入大,產出慢,維護成本高等問題。

2.即使不願意花錢。那選擇免費時,也有不同。cloudera有免費版。那麼是選擇開源的ambari還是選擇免費的cloudera-manager. 這取決於公司是否有需求做hadoop自動化系統的二次開發。是否自身的需求會超越社區ambari,以及公司是否有實力做開源系統的二次開發。

3.是否自研。 這就更難了,業務需求不大到一定程度,對每個細節的要求不到吹毛求疵,不建議這麼搞。

總之,從1-->2-->3 投入的人力成本是越來越大的,同樣對項目的掌控的難度和帶來的靈活度也是最大的。 這需要公司根據自己的實際情況評估而定。

========================================

最後,到了自動化系統運維時代,運維工程師是否就高枕無憂了呢?

又有一系列的問題被提出來,比如:

  • 自動化的運維程序足夠健壯嘛?如果其本身出bug了,怎麼辦?
  • 自動化系統,能覆蓋所有的運維需求嘛?是否有很難的需求點,很難覆蓋到的?
  • 自動化系統,可以替人決策嘛?可以給我們建議,進行參數調優嘛? 有足夠的metrics數據支撐我們做出運維的判斷嘛?

要回答這些問題,請看後續的系列文章。^_^.

鏈接:

1. 大數據SRE的總結(0)--開篇

2.hortonworks.com/apache/ ambari介紹

3.cloudera.com/products/p cloudera manager 介紹


推薦閱讀:

數據分析和挖掘在售電市場的應用價值點在哪兒?
如果阿里雲跟中石化合作,雲計算、大數據在石油行業可以幹什麼?
泰坦尼克號生存預測(kaggle排名129前2%)
天池大數據競賽歷次資料集錦(持續更新中)

TAG:大数据 | 运维工程师 | IT运维 |