對于蘑菇街而言,每年的11.11已經成為一年中最大的考驗,考驗的是系統穩定性,容災能力,緊急故障處理,運維等各個方面的能力。蘑菇街的私有云平臺,從無到有,已經經過了近一年的發展,生產環境上經歷了3次大促,穩定性方面得到了初步驗證。本文我將從架構、技術選型、應用等角度來談談蘑菇街的私有云平臺。
另,ArchSummit全球架構師峰會北京站將于2015年12月18日~19日在北京國際會議中心召開,大會設置了《揭秘雙十一背后的技術較量》專題來深入解讀雙十一背后的技術故事,歡迎關注。
蘑菇街的私有云平臺(以下簡稱蘑菇街私有云)是蘑菇街面向內部上層業務提供的基礎性平臺。通過基礎設施的服務化和平臺化,可以使上層業務能夠更加專注在業務自身,而不是關心底層運行環境的差異性。它通過基于Docker的CaaS層和KVM的IaaS層來為上層提供IaaS/PaaS層的云服務,以提高物理資源的利用率,以及業務部署和交付的效率,并促進應用架構的拆分和微服務化。
在架構選型的時候,我們覺得Docker的輕量化,秒級啟動,標準化的打包/部署/運行的方案,鏡像的快速分發,基于鏡像的灰度發布等特性,都十分適合我們的應用場景。而Docker自身的集群管理能力在當時條件下還很不成熟,因此我們沒有選擇剛出現的Swarm,而是用了業界最成熟的OpenStack,這樣能同時管理Docker和KVM虛擬機。相對來說,Docker適合于無狀態,分布式的業務,KVM適合對安全性,隔離性要求更高的業務。
對于上層業務來說,它不需要關心是運行在容器中,還是KVM虛擬機里。今后的思路是應用的微服務化,把上層的業務進行拆分,變成一個個微服務,從而對接PaaS基于容器的部署和灰度發布。技術架構
在介紹雙十一的準備工作之前,我先簡單介紹一下蘑菇街私有云的技術架構。
我們采用的是OpenStack+novadocker+Docker的架構模式,novadocker是StackForge上一個開源項目,它做為nova的一個插件,通過調用Docker的RESTful接口來控制容器的啟停等動作。每個Docker就是所謂的“胖容器”,它會有獨立的IP地址,通過supervisord來管理容器內的子進程,常見的如SSHD、監控agent等進程。

我們在IaaS的基礎上自研了PaaS層的編排調度等組件,實現了應用的彈性伸縮、灰度升級,支持一定的調度策略。我們通過Docker和Jenkins實現了持續集成(CI)。Git中的項目如果發生了git push等動作,便會觸發Jenkins Job進行自動構建,如果構建成功便會生成Docker Image并push到鏡像倉庫。基于CI生成的Docker Image,可以通過PaaS的API或界面,進行開發測試環境的實例更新,并最終進行生產環境的實例更新,從而實現持續集成和持續交付。
網絡方面,我們沒有采用Docker默認提供的NAT網絡模式,NAT會造成一定的性能損失。通過OpenStack,我們支持Linux bridge和openvswitch,不需要啟動iptables,Docker的性能接近物理機的95%。準備工作 穩定性
迎戰雙11,最重要的當然是確保穩定性。通過近一年的產品化和實際使用,我們積累了豐富的提高穩定性的經驗。
對于那些已遇到過的問題,需要及時采用各種方式進行解決或者規避。比如說,CentOS6.5對network namespace支持不好,在Docker容器內創建Linux bridge會導致內核crash,upstream在2.6.32-504中修復了這個bug,因此線上集群的內核版本,必須升級至2.6.32-504或以上。
又比如,CentOS6.5自帶的device mapper存在dm-thin discard導致內核可能隨機crash,這個問題我們早在四月份的時候已經發現并解決了,解決的辦法是關閉discard support,在docker配置中添加“--storage-opt dm.mountopt=nodiscard --storage-opt dm.blkdiscard=false”,并且嚴格禁止磁盤超配,因為磁盤超配可能會導致整個device mapper無法分配磁盤空間,而把整個文件系統變成只讀,從而引起嚴重問題。
新聞熱點
疑難解答