運維

網際網路運維

運維,這裡指網際網路運維,通常屬於技術部門,與研發、測試、系統管理同為網際網路產品技術支撐的4大部門,這個劃分在國內和國外以及大小公司間都會多少有一些不同。

一個網際網路產品的生成一般經歷的過程是:產品經理、需求分析、研發部門開發、測試部門測試、運維部門部署發布以及長期的運行維護。

運維,本質上是對網路、伺服器、服務的生命周期各個階段的運營與維護,在成本、穩定性、效率上達成一致可接受的狀態。

運維的職責


對於初創公司,運維部和系統部一般是合二為一的,相關工作由同一批人負責,界限可能不是很明顯。大型公司對運維工作的要求更高,需要有更精細的分工,因此機房/網路/操作系統相關的底層工作分離出來由專人負責,成為系統管理部,而上層和應用產品相關的工作則由運維負責,成為運維部。以下從網際網路產品生命周期和運維涉及的技術分別來看分工較細的大型網際網路公司中運維工作的職責。

產品生命周期


運維的職責覆蓋了產品從設計到發布、運行維護、變更升級及至下線的生命周期,各個階段的職責包括:
產品發布前
這個階段運維工程師的職責是參與設計並把有關運維准入,主要包括:
(1)產品的業務熟悉;
(2)產品架構設計的合理性評估,包括是否存在單點,是否可容錯,是否有強耦合等,同時需要提供產品設計的合理性建議以使產品能夠滿足上線發布並穩定運行的基本要求;
(3)資源評估,包括所需的伺服器資源、網路資源以及資源的分佈等,同時把相關產品對資源預算申請的合理性,控制服務成本;
(4)資源就位,將申請的伺服器及基礎環境/域名準備就位。
產品發布
這個階段運維工程師負責發布的具體工作,將具體的軟體和系統/硬體資源整合形成產品並對外提供服務。
對於已在線服務的更新也屬於發布範疇,這個時候的產品發布一般要保障在線發布,在不中斷對外服務的情況下完成產品的升級。對於大型複雜的變更也存在中止服務部署完成後再重新提供服務的情況,但這種情況需要運維工程師通過儘可能的技術手段來避免。
產品運行維護
這個階段的主要工作包括:
(1)監控:對服務運行的狀態進行實時的監控,隨時發現服務的運行異常和資源消耗情況;輸出重要的日常服務運行報表以評估服務/業務整體運行狀況,發現服務隱患;
(2)故障處理:對服務出現的任何異常進行及時處理,儘可能避免問題的擴大化甚至中止服務。這之前運維工程師需要針對各類服務異常,如機房/網路故障、程序bug等問題制定處理的預案,問題出現時可以自動或手動執行預案達到止損的目的。除了日常小故障外,運維工程師還需要考慮產品不同程度受損情況下的災難恢復,包括諸如地震等不可抗力導致大規模機房故障、在線產品被刪除等對產品造成致命傷害的情況。
容量管理:包括服務規模擴張后的資源評估、擴容、機房遷移、流量調度等規劃和具體實施。
產品性能/成本優化
產品對外提供服務最重要的一點是用戶體驗,用戶體驗中非常重要的是產品的可用性和響應速度。而如何用最合理的資源(如機器、帶寬等)支持產品提供高可用和高速度的用戶體驗,這也是運維工程師的重要職責。
產品下線
發展良好的網際網路產品將始終在線對外提供服務,但網際網路產品快速迭代,也存在相當多孵化的產品最後被淘汰的情況,這些產品都需要做下線處理,這個過程運維工程師主要做好資源回收的工作,將機器/網路等資源回收后納入資源池中供其它服務使用。

運維技術方向


產品的整個生命周期里運維的職責重要而廣泛,但運維工程師們的職責不僅限於這部分工作,還需要總結工作中遇到的問題,抽取出相關的技術方向、研發相關的工具和平台以支持/優化業務的發展並提高運維的效率,相關技術工作主要包括:
• 服務監控技術:包括監控平台的研發、應用,服務監控準確性、實時性、全面性的保障
• 服務故障管理:包括服務的故障預案設計,預案的自動化執行,故障的總結並反饋到產品/系統的設計層面進行優化以提高產品的穩定性
• 服務容量管理:測量服務的容量,規劃服務的機房建設,擴容、遷移等工作
• 服務性能優化:從各個方向,包括網路優化、操作系統優化、應用優化、客戶端優化等,提高服務的性能和響應速度,改善用戶體驗
• 服務全局流量調度:接入服務的流量,根據容量和服務狀態在各個機房間分配流量
• 服務任務調度:服務的各種定時/非定時任務的調度觸發及狀態監控
• 服務安全保障:包括服務的訪問安全、防攻擊、許可權控制等
• 數據傳輸技術:包括p2p等各類傳輸技術的研發應用,也遠距離大數據傳輸等問題的解決
• 服務自動發布部署:部署平台/工具的研發,及平台/工具的使用,做到安全、高效的發布服務
• 服務集群管理:包括服務的伺服器管理、大規模集群管理等
• 服務成本優化:儘可能降低服務運行使用的資源,降低服務運行成本
• 資料庫管理(DBA):通過設計、開發和管理高性能資料庫集群,使資料庫服務更穩定、更高效、更易於管理。
• 平台化的開發:類docker和google borg平台的開發管理,及服務接入技術
• 分散式存儲平台的開發優化:類google gfs等分散式存儲平台的研發及服務接入
等等,凡是關係到服務質量、效率、成本、安全等方面的工作,及涉及到的技術、組件、工具、平台都在運維的技術範疇里。做好每一個技術方向、完成相應的組件、工具、平台研發都能對履行運維職責起到積極的作用,對業務的發展發揮關鍵影響。

技能和素質


運維以技術為基礎,通過技術保障產品提供更高質量的服務。運維工作的職責及在業務中的位置決定了運維工程師需要具備更加廣博的知識和深入的技術能力:
• 紮實的計算機基礎知識,包括計算機系統架構,操作系統,網路技術等;
• 通用應用方面需要了解操作系統、網路、安全,存儲,CDN,DB等,知道其相關原理;
• 編程能力,小到運維工具的開發大到大型運維繫統/平台的開發都需要有良好的編程能力;
• 數據分析能力:能夠整理、分析系統運行的各項數據,從中發現問題及找到解決方向;
• 豐富的系統知識,包括系統工具、典型系統架構、常見的平台選型等;
• 綜合利用工具和平台的能力;
運維工作的複雜性對這個崗位的運維工程師們的軟素質也提出了要求:
• 時間管理能力,特別是碎片化時間的處理能力;
• 沉穩的心態,面對緊急情況時需要處變不驚;
• 溝通能力、團隊協作,運維工作跨部門、跨工種工作很多,需善於溝通、並且團隊協作能力要強;
• 工作中需膽大心細:膽大才能創新、不走尋常路,特別對於運維這種新的工種,更需創新才能促進發展;心細,運維工程師是最高線上許可權者,需要謹慎心細;
主動性、執行力,能夠主動學習國際國內的運維技術,並引入到工作中,提高運維的質量和效率;

開展方式


業務運維工程師的日常工作包括:
• 監控線上的服務質量
• 響應異常/處理突發故障
• 在線發布/升級產品
• 和相應產品線的研發和測試協調處理產品問題
• 基於工作中的問題和數據分析進行抽取,將運維經驗理念落地沉澱為方法論/工具/系統/平台,並制定相關的改進計劃,在各個技術方向上落地實現,最終反饋回運維工作中,提高運維本身的效率和產品的價值。

平台工具


運維工程師使用的運維平台和工具包括:
• Web伺服器:apache、tomcat、nginx、lighttpd
• 監控:nagios、ganglia、cacti、zabbix
• 自動部署:ansible、sshpt、salt
• 配置管理:puppet、cfengine
• 負載均衡:lvs、haproxy、nginx
• 傳輸工具:scribe、flume
• 備份工具:rsync、wget
• 資料庫:mysql、oracle、sqlserver
• 分散式平台:hdfs、mapreduce、spark、storm、hive
• 分散式資料庫:hbase、cassandra、redis、MongoDB
• 容器:lxc、docker
• 虛擬化:openstack、xen、kvm
• 安全:kerberos、selinux、acl、iptables
• 問題追查:netstat、top、tcpdump、last
廣義上所有開源的軟體都是運維工程師會使用到的平台和工具,同時也包括運維各個技術方向上自行研發的各類平台。

職業發展


運維工程師從工作方式上分為幾大類:
• 運維工程師/運維開發工程師
負責具體的產品線運維工作,同時也需要掌握開發的能力,深入業務,最了解業務的痛點和問題,同時研發/優化針對產品業務需求的平台、工具和手段,能夠接觸到各類優秀的系統架構並有能力做出優劣對比,同時對業務的掌控決定了相應運維工程師在業務發展中的作用。長遠發展是成為大型系統的架構師
運維平台研發工程師:
專門研發運維相關通用平台和技術,需要有一定的產品線運維經驗或從產品線中拿到運維需求。對研發能力有較高的要求,對系統的設計有較嚴格的標準,並且能夠理解用戶需求,做出適合服務運維和滿足運維工程師使用體驗的運維產品,長遠的發展是成為各個技術縱向領域的技術專家。
資料庫方向是運維技術中較為特殊的一個方向,由於業務的重要性通常需要專設崗位,業界在該方向也有深厚的研究和積累。主要方向有資料庫內核、雲資料庫等,長遠發展是資料庫領域的技術專家,資料庫架構師。
• 運維經理:
運維同學做事情的過程中通常需要協調多個RD和QA同學,對協調和推進能力要求比較高,對一些技術深度還不錯,協調和推進能力比較高的同學非常適合轉型管理職位,長遠的發展和技術部門的管理職位一樣目標是CTO、CEO。
各個方向上的工程師發展到一定階段后,沒有明確的界限,需要同時具備較強的運維、架構、編程、演演算法等能力,是一個要求很高要求的職業。

運維行業前景


• 從行業角度來看,隨著中國網際網路的高速發展、網站規模越來越來大、架構越來越複雜,對專職網站運維工程師、網站架構師的要求會越來越急迫,特別是對有經驗的優秀運維人才需求量大,而且是越老越值錢。
• 從個人角度,運維工程師技術含量及要求會越來越高,同時也是對公司應用、架構最了解最熟悉的人、越來越得到重視。
• 網際網路運維是一個融合多學科(網路、系統、開發、安全、應用架構、存儲等)的綜合性技術崗位,給運維工程師提供了一個很好的個人能力與技術的發展空間。
• 運維工作的相關經驗將會變得非常重要,而且也將成為個人的核心競爭力,優秀的運維工程師具備很好的各層面問題的解決能力及方案提供、全局思考的能力等。
• 由於運維崗位所接觸的知識面非常廣闊,更容易培養或發揮出個人某些方面的特長或愛好,如內核、網路、開發、資料庫等方面,可以做得非常深入精通、成為這方面的專家。
• 當前國內外對運維人才的需求非常迫切,運維工程師的薪資也水漲船高,與研發、測試等技術部門持平,甚至超出。

資深運維


以下是中國網際網路業界部分資深運維工程師對運維的看法(涉及隱私,相關人名採用首字母縮寫):
CXY:
運維是一個非常廣泛的定義,在不同的公司不同的階段有著不同的職責與定位,如果以operation字面的含義去理解,認為就是敲幾行操作命令的工作,那就錯了。對於初創公司,運維工程師的工作可能需要從申請域名開始,購買/租用伺服器,上架,調整網路設備的設置,部署操作系統和運行環境,部署代碼,設計和部署監控,防止漏洞和攻擊等等。對於大型的公司,對於運維工作的要求越來越高,也催生了更細化的運維分工:從大的方向,可以分為網站運維,系統運維,網路運維,資料庫運維,IT運維,運維開發,運維安全等方向。
很多非從業人員對運維的看法一般屬於IT運維的一個非常小的職責:裝系統^^。一些研發工程師對運維的看法也只局限運維工作的幾個點:部署, 變更, 監控,響應。
無論做什麼運維,最基本的職責都是保證業務能夠穩定運行。所以必須成為業務穩定性的owner。有些人通常認為運維工程師像消防員,7*24小時響應異常,救火。但是穩定性的運維工程師和醫生的職業更接近。醫生也分各種科室,也有急症室,需要先判斷病人的問題,對症下藥。
業務有著各種各樣的需求,如果運維工程師能夠滿足業務需求,或者主動挖掘業務的痛點和改進方法,就能為業務實現更多的價值。
在滿足業務需求時,應該分清主次,優先面對業務快速發展非常重要的需求,例如穩定性,部署和變更效率,容量管理。穩定性不用多說,如果用戶沒法穩定使用你的業務,什麼產品特性都沒有價值。對於極速發展的網際網路公司,每天都有大量的升級更新需要提供給用戶,如何在異地的大集群上最快的滿足產品的升級需求,同時讓用戶對升級過程無感知,這是我們的追求。
其次,可以橫向看看不同業務的需求。如果能夠把多個業務的需求抽象出來,把一些有通用價值的工作平台化(例如資料庫,cdn,監控,流量接入和調度,大數據的存儲和計算),也能在這個方向進行深入的發展。
有一定的積累后,可以進入到宏觀和微觀的兩個層面,從整個公司層面考慮業務的智能部署和調度(涉及網路,硬體,系統,應用開發方式等各個要點),進一步提升效率和節省成本。
如果能夠懂業務,理解業務的模式,緊密結合業務進行優化和創新,也是運維工程師體現價值的另外一種方式。有很多產品上的創新,專利的申請,論文的發表,業務指標的提升,直接或者以合作的方式由運維工程師貢獻。
YBX:
運維工程師相對研發人員來講,可以全局觀察所維護的計算機系統,特別是高階運維工程師,不存在模塊界限,這種獨特的位置帶來很多價值:
• 知道準確的系統瓶頸點,進而知道系統準確的容量;在系統出現瓶頸前,知道如何快速提供容量。
• 知道系統的風險點,可以協調風險點上下相關關聯模塊,做出冗餘策略;相比集中解決單點模塊穩定性,更合理。
• 長期從事相關工作,積累較多的架構設計經驗,可以指導新架構設計和審核。
• 從公司不同業務角度看,運維可以從中抽象相同的模塊,統一管理,形成有效的平台和自動化管理方法
同樣從公司不同業務角度看,可以統一調配資源,進而節省資源。
KZ:
• 設計並實現可以提高公司服務可用性,可擴展性,延遲和效率的軟體。
• 處理日常緊急事故,修正,替換問題組件。並設計規避問題方法。
• 設計和實現新的超大規模分散式系統架構和標準。
• 參與服務擴容計劃和預測服務增長趨勢,對軟體和系統性能進行調優。
• 提供在線諮詢服務和現場解決問題服務。
• 構建自動運維平台,解決日常問題。
• 構建知識庫,預測可能的問題。
XX:
運維即生產環境以及和生產環境相關的資源、服務的維護的整個過程,包括了相關的技術、流程手段,確保生產環境穩定、高效、低成本的運行。
運維一方面為對業務功能最終負責,其價值的體現為最大化助力產品價值的發揮。這通常是通過將產品功能的運行表現提升到極致來達成的。例如搜索引擎的運維重點要保障用戶在搜索時候的極致體驗:穩、快、准、新、全。而一個在線聊天系統的運維應該是確保用戶聊天過程的實時與順暢。另一方面為對在線業務的成本最終負責。其價值的體現為降低服務運行成本
運維工作的開展方式一般取決於所維護的業務特點需求,形成所需的多個主題方向進行開展。通常的解決方案中包括如下的一些主題方向:事件管理、配置管理、變更管理、容量管理等。
運維工程師的要求特別嚴苛,因為運維工程師針對不同的問題,需要不斷的補充擴大自己的知識和研究範疇。
在初級階段,優秀運維工程師會體現出格外出眾的主動性和責任心,面對陌生的業務會主動學習和拓展自己對業務對認識和相應的知識範疇,以能夠足夠的勝任業務的獨立維護。
在逐步的發展階段中,注重總結反省的工程師會逐漸成長為高階運維工程師,通常他們會有比較體系化的服務運維理解。也有一部分工程師由於出色的項目管理規劃能力,逐漸成為項目經理
再進一步的發展,高階的運維工程師對於產品的理解將非常的透徹,因而在這種情況下,高階運維工程師甚至可以成為產品的產品經理、產品研發的諮詢顧問,在產品功能的設計與開發中起到至關重要的角色。
SJY:
一個運維工程師所需的技術體系以其專業方向而異。但基本的計算機系統架構,操作系統,網路技術的掌握是基本要求。例如你可能需要熟練掌握linux操作系統的使用,熟練使用各種腳本工具來處理日常工作任務,精通TCP/IP協議棧以排查一個大規模網路系統中的流量異常問題等。更進一步的你需要形成一套軟體可運維性方面的經驗積累,以此作為後續工作的指導。
一個運維工程師在初期階段目的是掌握維護一套系統所需的所有軟硬體知識和經驗。進階階段是需要能夠設計開發一套基礎的體系軟體,以支撐業務系統的穩定可靠運行,即開發服務於軟體的軟體,以支持更大規模的業務系統,提高運維生產力。最高階段是反作用於軟體系統的構建和運行階段,使得系統從誕生階段起即具有天然的可運維性,以最大化系統的生產力,同時最小化對外部支撐資源的依賴。
ZM:
運維工程師首先應該是軟體工程師(Software Engineer),只是責任和側重有所不同。
運維工程師不是系統管理員。和系統管理員最大的差別是,運維工程師的工作不僅僅是配置和管理系統,而且可以運用軟體開發的方法來增強系統的功能、或者對數據進行分析。
運維工程師應該是軟體工程師、系統工程師等角色的綜合體,和一般軟體工程師相比、應該具有更加廣博的知識背景
運維的職責在於:
• 保證服務的穩定運行;
• 考慮服務的可擴展性;
• 從系統的穩定性和可運維性的角度,提出開發需求;
• 定位系統的問題,甚至可以直接修正bug;
• 對突然出現的問題做到快速響應和處理;
運維的日常工作:
• 需要對系統的需求和設計方案進行分析,思考在保證穩定性方面有哪些可以加強的地方,並和系統的研發人員進行有效溝通;
• 使用工具、或者寫程序,對運營數據進行分析;
• 寫程序以建立工具或平台,去加強系統的穩定性;
運維工程師最重要的是會運用編程和軟體的方法來解決問題。發展的道路應該和軟體工程師沒有很大的區別,差異只是關注點和領域方向的不同

國際會議


以下是部分運維相關的國際會議,會議涉及運維及運維相關技術的交流學習。
nsdi'14
Percona live
Velocity Oreilly web
fcw'14
LISA '14
35th IEEE S&P 2014
SIGMOD/PODS ’14
OSDI'14
oow'13
SRECON