8億用戶、單日活躍人數超過1億人、每日超過600億次的API調度、超過1兆次遠端程序呼叫,甚至連Log記錄檔每天都爆增100TB,這是新浪微博平臺維運架構師王關勝所面對的挑戰,他得設計出一個有能力勝任這些考驗的微博系統的新一代架構,而且高層給他的要求是,系統反應時間不得超過50ms。
王關勝表示,微博如此大規模的業務,除了面臨系統快速更新的任務,各種不同系統元件間的依賴關係也相當複雜。而當國際事件、名人醜聞等高關注度的議題發生時,經常導致微博的業務量遽增,使得系統流量達到頂峰。
尤其遇到大型節日或活動時,如元旦、春晚、聖誕節還有紅包飛等大型活動,同樣也會為微博帶來巨大的流量挑戰。王關勝表示,位於三節的日子,微博的系統流量,會在3個小時內衝上頂峰,而紅包飛則是帶來瞬間的峰值流量,在兩個小時內就達到最高點。過去面對此樣的峰值事件,微博需要調度大量硬體設備。而如此做法,除了成本高外,系統在進行水平擴充時,也必須耗費更多的時間。
過長的前置作業時間為微博帶來營運痛點
而繁瑣擴充流程所花費的時間,為微博帶來了營運痛點。過去當峰值事件出現時,首先,維運團隊必須申請實體機器,將其登入組態管理資料庫(CMDB),在機房安裝妥當後,交予第一線作業人員進行初始化,並開始進行部署作業,如環境部署、監控部署、服務部署及流量導入等流程。
王關勝表示,過去的水平擴充的方法,也可能因為各個服務間的系統環境差異,無法充分使用硬體資源,即使有多餘的伺服器也無法靈活調度。然而,在設備充足的狀況下,完成正常的設備申請程序也必須花上一天,甚至可能碰上沒有足夠設備的狀況,使得系統進行水平擴充花上更多時間。
另外,微博也有許多使用率不高、閒置在各叢集跟服務池的實體基礎設施,而微博過去在應付紅包飛、三節爆增流量的作法,會預先在各個業務的伺服器叢集,準備多餘硬體設備,用來因應峰值突發的事件。而預先準備多餘設備,則包含採購周期過長、機房空間不足所帶來的高營運成本外等缺點。
而設備申請時間周期長、使用率不高的閒置設備,則對新浪微博帶來龐大的成本壓力。而因為面臨這些挑戰、痛點,「我們要建構有彈性的混合雲系統。」王關勝表示,微博的新做法是,導入公有雲並結合過去的私有雲,集結各業務叢集多餘的運算設施,構建混合雲的系統架構。
他表示,混合雲架構除了妥善整合內部硬體資源,解決內部的彈型需求外,當系統面臨流量劇增的峰值事件,亦可以將過多的流量引導至外部公有雲,減輕內部系統的壓力。
王關勝分析了採用混合雲作法的好處,他表示,內部私有雲具備安全性高、掌握度高的特性,也可以因應內部需求,對硬體配置進行優化,適合處理固定的工作負載。而公有雲的設備則具有標準化、自動化的特性,可以快速因應臨時需求,在爆增流量的狀況下,讓企業具備水平擴充工作負載的能力。企業也可以利用公有雲按照使用流量的付費機制,減低固定的營運成本,而採用混合雲架構,可以兼具私有雲以及公有雲的優點,「可以同時擁有安全性與彈性擴充能力」,使系統工作負載可以在叢集間進行遷移,讓低負載的叢集配置較少的設備,反之,負載高的叢集則必須準備足夠的設備。而將Docker導入混合雲的架構,也使微博服務穩定度高上許多。
透過三大關鍵,實現Docker混合雲
微博混合雲系統不單只是一般的混合雲,而是導入了Docker,透過Docker Container快速部署的特性,解決爆量事件對微博系統帶來的壓力。過去企業在面對爆量事件,一般採取的作法是,首先評估需要多少額外設備,並向外部公有雲申請機器分攤流量。然而,除了可能低估應付爆量所需的設備外,即使事先準備了足夠的VM,其部署時間成本也遠高於Docker,無法即時幫助企業分攤過多外部請求。
而王關勝表示,微博Docker Container平臺的混合雲核心設計思想,主要是借鏡銀行的運作機制。他表示,民眾可以把錢存在銀行,而需要使用金錢的時候,只需要提領一部分,剩餘的存款銀行可以拿去進行投資。而微博則借鏡銀行的這一套運作模式,在內部設立一個硬體資源共享池外,還導入了外部公有雲。
而要微博實現高彈性調度資源的混合雲架構,其中實現的關鍵則是Docker。王關勝表示,剛開始他們思考該要使用裸機還是VM架構,作為Docker Container的基礎設施。後來,考量如果要採用VM,內部機房架構要進行許多改造。所以,目前微博的內部私有雲使用裸機部署,而外部公有雲則採用阿里雲彈性計算服務(ECS)的VM架構。
王關勝也揭露微博構成Docker Container平臺基礎架構的3大關鍵,包含Docker在裸機上的部署架構、自主開發的Docker Registry以及網頁伺服器Nginx Upsync模組。
第一是Docker Container的裸機部署方案,透過IP位址以及Port定義一個唯一的Container服務,而每臺伺服器上則可以開啟多個Container,各個具有不同的功能。
例如,每一個Container服務所產生的行為日誌,會經由一個名為Scribe的Container集中收集。而集中後的數據則可進行用戶行為分析。
此外,如果要進行Container的運作監控,則是透過建立Cadvisor Container,將Container運行產生的資料,傳送至Elasticsearch、Logstash及Kibana這3種開源監控軟體,進行分析。或是,搭配開源測量工具Graphite,監控系統的運作狀況。
第二則是Docker Registry,王關勝表示,微博使用Docker官方提供的Docker Registry,構建了私有的映像檔儲存庫Registry Hub,並且透過這個映像檔儲存庫調度Docker Container需要的映像檔。
在今年,微博開發出了第2版本的Registry Hub,將儲存引擎改為使用分散式開源儲存平臺Ceph,並且在Docker Registry前端結合Nginx,實作負載平衡功能。王關勝表示,在升級過程中必須讓系統能夠兼容新舊版本的Registry Hub,而前端Nginx可以分析系統需求,辨別要從新版本或是舊版本映像檔儲存庫下載映像檔。
而外部公有雲,微博則是透過映像檔快取,不必像私有雲一樣,部署完整的映像檔儲存庫。微博位於阿里雲映像檔快取架構,總共包含3層架構。包含最底層作業系統、中間層的運作環境如Java、Tomcat,及最上層的Container。而在調度Container時,透過使用dockerignore指令,減少不必要的文件、目錄,藉此減低映像檔的容量。在映像檔標籤命名上,微博則禁止使用「Latest」做為映像檔標籤。王關勝表示,由於不同使用者對於標籤的理解不一,可能會誤以為是代表映像檔最新的版本。
而第三則是微博開發的Nginx Upsync模組,王關勝表示,去年微博開始使用Container時,必須透過Container將Nginx掛載至前端,執行負載平衡的任務。而Nginx部署完成後,必須透過重啟reload指令重啟Nginx。王關勝發現,Nginx對於特別大的流量會發生運作不穩定的情形。所以微博也直接開發了Nginx Upsync模組,不需要透過reload指令重啟,也可以保持系統穩定運作。而微博也針對兩種模組進行比較,發現流量大時,未修改的Nginx模組會比Nginx Upsync模組多上10%的請求。
(圖片來源/王關勝)
目前微博開發的Docker Container平臺系統,主要包含4層架構:主機層、調度層及排程層,最上層則是包含應用程式的業務層。底層的混合雲基礎架構則架設了專線,打通微博內部資料中心以及阿里雲。
混合雲系統設計核心:自動化、彈性調度
微博混合雲系統的設計理念,總共包含4個核心概念:彈性伸縮、自動化、業務導向以及專門為微博訂製。王關勝表示,混合雲系統必須有彈性調度的運算能力。而微博混合雲系統並不是對外公開的產品化服務,必須以業務需求出發,因此會有包含許多微博自我訂製的功能。
目前微博開發的Docker Container平臺系統,總共包含3層架構:主機層、調度層及排程層。王關勝解釋,主機層的核心是要調度運算資源。目前微博也設計了資源共享池、Buffer資源池及多租戶管理機制,藉此實現彈性調度資源。此外,底層的混合雲基礎架構,也架設了專線,打通微博內部資料中心以及阿里雲。
而調度層則透過API,使用調度工具將API進行包裝,而微博4種常用的調度工具組合包含:Docker、Swarm、Mesos及微博自主開發的Dispatch。
而最上層的排程層則是負責負載平衡。目前,微博的後端服務全部是Java環境,而個人電腦端則是使用PHP撰寫,行動裝置端則是透過調度API。編排層也導入了大資料工具Hadoop,執行大資料分析。
(圖片來源/王關勝)
當業務A多餘的運算資源導入混合雲共享池時,此時爆量的業務C,可從共享池調度業務A的運算資源,而度過峰值事件後,便可以把多餘的運算資源歸還至共享池。
微博引入阿里雲做為第3機房,實現彈性調度架構
然而,王關勝也在思考,依照微博目前的技術框架,採用混合雲的架構是否可行。目前微博機房的部署架構總共分為3層,依序是最上層域名以及負載均衡層。中間則是Web層,包含各種前端框架以及中介軟體(Middleware)。而最下層則包含MySQL、Redis、HBase等資料庫架構,而底部資源的中介軟體,則部署於中間Web層。
微博內部總共有2個機房,兩者互相做為災難備份用途,而第3個機房則採用外部阿里雲。王關勝表示,混合雲架構總共有2種部署方案。第1種部署方案,將阿里雲視為資料中心,底層架構與微博內部機房一樣部署Redis。內部機房採用Linux虛擬伺服器,做為負載平衡層,但外部公有雲則採用伺服器負載平衡SLB。而外部機房的中間Web層則與內部機房架構一致。不過,王關勝表示,由於微博有資料安全性的考慮,仍然把阿里雲做為應付大量峰值的備案,儲存永久性資料的MySQL、HBase資料庫架構並不會部署於阿里雲。
而第2種部署方式則不將阿里雲視為完整資料中心,僅是把內部機房應付爆量事件需要的彈性計算能力,遷移到阿里雲。王關勝表示,第2種部署方案困難之處,需要把微博的內部業務進行改造,讓微博中間Web層,直接對阿里雲機房進行遠端程序呼叫。他表示,此種方案部署結構相較比較簡單,也讓混合雲架構具有實現可行性。
而這2種方案都會仰賴VPC網路,王關勝表示,如果有沒有專線,想實現公有雲的彈性計算能力幾乎是不可能。因為公網調度資源的延遲時間太高,無法應付微博大量的業務。
因此,微博與跟阿里雲合作,在兩邊建立了內部專線,讓阿里雲機房與微博的機房互通。最早微博機房跟阿里雲建立一個1G專線,用於日常峰值,在春節則是透過10G的專線應付。
但是後來微博發現,如果只有一條專線,在峰值爆量的狀況下也很難彈性調度運算計算資源。因此微博也在另一個機房中,開啟了另一條專線。透過建立私有雲及公有雲間的專線,「目前微博已經達到高可用性的目標。」王關勝表示。
三大步驟完成大規模叢集操作自動化
微博Docker Container平臺設計思維,核心目標就是透過自動化操作大規模叢集,進行彈性調度資源的任務,要完成此任務,必須經過3個流程:設備申請、設備初始化及系統水平擴展。
王關勝表示,彈性擴充任務所需要的設備來源是內部的叢集以及外部的阿里雲。而申請到足夠設備後,也必須對伺服器進行初始化、架設環境及配置管理。最後一步則是將伺服器上線,開始執行Container調度以及彈性擴充的任務。
第1步驟則是申請設備,而設備申請借鏡於銀行機制的概念。王關勝分析,私有雲的設備來源,主要來自離線叢集、低負載叢集以及錯峰時間空出的多餘設備。他解釋,離線叢集並不是時時刻刻都在執行運算,即使稍微減少硬體資源,也不會對業務產生重大影響,而工作負載較低的叢集,如果有多餘的資源也可以進行調度。此外,微博有上百個業務線,每個業務線峰值出現的時間點都不一樣,而在此種狀況下,各業務也可以互相支援,共享多餘的硬體資源。
而不同業務的叢集則各自獨立,並且具有獨立的資源池。叢集內可以自由調度資源,例如,縮小A服務的規模,將多餘的運算資源分派給B服務。若叢集要調度外部資源,微博另外也有設計配額制度,控制每個叢集分配到的資源。在叢集外,必須看Buffer池是否有足夠的資源,如果足夠的話,可以直接將Buffer池內的設備初始化,進行使用。
反之,如果Buffer池內的資源不足,也必須查看是否有足夠的配額,可以直接申請機器。當設備申請完成,登入Buffer池後,隨即被納入混合雲系統中,而調度硬體的程序也都會經由Buffer池。
而正常運作的設備,會從未初始化狀態,歷經初始化、Container啟動以及Container上線等程序。不過,王關勝表示,設備異常的狀況也十分常見。如果設備異常就必須就要下線,如果重啟後運作正常,則可以重新回到Buffer池供人調度。但若出現硬體錯誤,則逕行走向報修程序。
第2步驟則是設備初始化,王關勝表示,藉由DHCP機制,微博可以達到作業系統升級自動化、系統操作API化。而伺服器所依賴的基礎環境、需要的軟體等環境配置,透過組態管理工具Puppet,將需要的配置撰寫在模組中,完成組態自動化設定,並使用RPM機制打包,進行安裝。
在初始化流程中,必須要支援軟體反安裝模式,例如,當A業務單位要調度設備時,其他單位在交付設備前,必須要先透過反安裝程序,將要設備恢復為最原始的狀態。
而目前業界中的一些做法也可以免去初始化的流程。例如導入為Container而生的作業系統,像是CoreOS、RancherOS或Red Hat Atomic。不過,王關勝表示,雖然此種做法的可維護性高,但是缺點在於遷移設備的成本較高。
第3步驟則是利用完成初始化的設備,開始進行服務水平擴充。王關勝表示,目前第一線的作業人員,只要在系統頁面上輸入服務池名稱、服務類型、Container類型、需要Container數量以及映像檔位址等參數,而在水平擴充完成後,系統也會產出完整的報告,列出擴充程序中,執行的事項,以及每件任務的成功、失敗狀況。
導入Docker混合雲,不怕爆量事件
為了確保微博Docker混合雲平臺系統的高可用性,微博也成立了技術保障團隊。王關勝表示,技術保障團隊最重要的任務,就是要保障產品的穩定性,讓系統在三節、紅包飛等尖峰時段系統運作無誤。王關勝表示,微博會優先調度內部的共享池資源的運算資源。而儲存節點、永久性資料放在微博內部,確保資料的安全性。但是在紅包飛、春晚時,則必須調度外部的運算資源。平日的正常狀況下,阿里雲只需提供1,000個運算節點,並且在5到10分鐘內完成部署任務。但是,面對春晚、紅包飛的爆增流量,則要提供3,000個節點。王關勝表示,這種與阿里雲租借公有雲的做法,只需要應付臨時的爆增峰值事件,因此,也可以大大降低微博的日常運作成本。
目前微博的Docker混合雲系統,才在今年10月完成,開始啟用不滿3個月,開啟的Container數量約是3,000個。不過,王關勝表示,在今年的雙11,微博也用此系統進行實地演練,也達成微博所設定每次水平擴充時間低於5分鐘的目標,並完成一日內10次的水平擴展的任務。「有這樣的彈性調度能力時,系統面對大型活動的峰值壓力就小很多。」王關勝表示。
(圖片來源/iThome)
王關勝表示,目前微博的混合雲系統在今年10月完成,目前開啟的Container數量約是3,000個。不過,王關勝表示,在今年的雙11,微博也用此系統進行實地演練,也達成微博所設定每次水平擴充時間低於5分鐘的目標。