本文來源於MOT技術管理課堂杭州站演講實錄,全文 2410 字,閱讀約需 5分鐘。網易雲信資深研發工程師張翱從私有化面臨的問題及需求提及,分享了網易雲信IM私有化的解決方案和具體實踐。
瞭解
網易雲信,來自網易核心架構的通訊與視頻雲服務。
私有化的源起
在作公有云平臺的過程當中,咱們接觸到不少客戶,有許多客戶和咱們反饋:「大家的雲平臺服務很好、線上也很穩定,但咱們但願能把雲平臺搬到本身的環境裏部署起來」。在進一步瞭解狀況後,咱們也獲得了客戶要求私有化的幾個訴求點:
一些企業出於數據保密及安全方面的顧慮,但願能把關鍵數據安放在自建機房或者數據中心,對網絡訪問進行嚴格控制;另外像銀行金融機構以及政府部門會受到監管合規等方面的限制,私密性甚至是一個硬指標。
但願可以自主掌控IM系統,這類客戶通常自身便具備較強的開發和運維團隊。
公有云上的客戶須要依賴咱們的數據開放能力,而在私有化部署後客戶可以一手掌握存儲的原始數據以及使用過程產生的全部日誌信息,使數據真正轉變爲企業資產,知足靈活多樣的數據分析需求進而增值。
一些企業對應用時延有較高要求,公有云平臺沒法知足,從而須要進行本地私有化部署。另外和現有企業內部信息系統整合,構建溝通交流協做大平臺的需求成爲企業選擇私有化部署的一種考量。
因爲私有化的呼聲持續增加,咱們決定啓動私有化項目,那麼從服務提供者的角度咱們須要什麼樣的私有化呢?
複用公有云代碼,不重複造輪子,減小與公有云代碼版本的差別性,使私有化系統最大限度繼承公有云上的能力,下降測試開發維護成本。
具備私有化需求的客戶來自各行各業,私有化部署環境也會各不相同,系統除了能在網易蜂巢、阿里雲、華爲雲等主流雲平臺上跑起來,也須要可以適配企業自建數據中心的虛擬機以及物理機環境。
部署流程標準化自動化。咱們所追求的私有化,不是耗費1-2個月的工做量爲企業部署一套定製化系統,而是高效可複製的。另外針對目前企業中IM相關的企業辦公等場景的部署規模等實際狀況,標準化部署咱們走的是相對輕量化的路線,有效下降企業的部署成本。
這實際上是一個分佈式系統的基本要求,內部各個組件高可用可擴展,消除單點。
私有化面臨的問題
公有云的主體架構以下,主要由客戶端層、網關接入和路由層、業務層、中間件、數據存儲層以及監控系統組成,其中接入層根據不一樣的鏈接方式以及應用場景拆分爲多個服務,業務層根據不一樣業務邏輯劃分出漫遊、推送、歷史消息以及抄送等服務。
在這些服務裏面會涉及到JAVA、C、Golang等多種技術棧,當這些服務混合部署到各類環境中,如何解決依賴管理以及可能發生的底層庫衝突,怎麼經過技術讓這個過程變得簡單高效,是咱們面臨的主要問題。
私有化解決方案
歸納起來主要是圍繞Docker技術從主機、容器、鏡像和編排四個層面來解決
主機上除了標準的操做系統,初始化只須要安裝Docker引擎、Supervisor和MetricBeat。其中,Supervisor起到管理容器實例的做用,當容器出現情況時起到必定的故障恢復的做用;MetricBeat是ELK技術棧中的監控agent,可以向監控系統上報主機的資源使用狀況以及各個容器的健康情況。最小化依賴組件,就下降了出現依賴衝突的可能性,達到兼容更多雲主機、虛擬機以及物理機環境的目的。
主機上最小化依賴項,那麼每一個服務依賴管理的任務就落到了鏡像這個層面上。每一個鏡像對應一種服務而且自我管理依賴,多個鏡像對應的容器之間相互隔離。好比服務A依賴jdk7,而服務B必須跑在jdk8版本上,若是這兩個服務沒有容器化而是跑在同一主機環境下,咱們就須要顯式指定所使用的JAVA路徑,增長額外的複雜度。更壞的狀況,若是出現底層庫的版本衝突,可能會致使不一樣服務沒法部署在一個主機上,這顯然是咱們不想看到的。但經過Docker與生俱來的隔離特性,咱們能很好地規避這個問題。
鏡像實例化後咱們便獲得了運行中的容器,不一樣於單進程容器的是,咱們使用Supervisor做爲容器入口,再由Supervisor來管理容器中的多個進程,這些進程有主次之分,主進程對外提供服務,次進程通常包括MetricBeat和FileBeat,前者起到主進程監控和業務監控的功能,後者是ELK生態中的日誌採集組件。
將多個同類容器組成集羣,將非同類容器進行配置並鏈接可達,是編排的基本功能。每每提及Docker容器編排,你們首先想到的是kubernetes(如下簡稱k8s),不一樣於容器雲等場景,在企業IM場景中用戶數廣泛爲幾十萬左右,對應的集羣主機數量通常不超過10臺,在這種規模下將k8s整合進去代價較大。因而咱們考慮輕量的方式,就是使用Ansible。
對於Ansible,作過運維的同窗應該比較熟悉,它基於SSH採用無agent架構,是集羣管理的有力工具。雖然丟失了k8s中容器動態管理以及故障自我恢復等高級功能,但經過前面提到的在主機和容器層面引入Supervisor管理的方式,在必定程度上保留了容器管理和故障恢復的能力。
Ansible雖然輕量,但經過豐富的功能模塊、角色定義,可以具有強大的腳本表達能力,咱們在此基礎上編寫主機初始化流程,各個服務的高可用集羣如基於keepalived虛擬ip的MySQL主從或者雙主集羣以及基於OpenResty負載均衡雙主集羣。
除了技術架構上的四個層面,在ansible部署腳本之上咱們封裝了http接口並開發了可視化的安裝嚮導。此外咱們還提供管理平臺和運維平臺kibana,這些可視化平臺可以方便交付工程師和運維工程師在安裝部署、集羣管理、應用管理以及運維監控等方面提升效率,真正作到從部署到交付後運維的全流程高效可複製。
最後,咱們把驗收工做比做交付的最後一千米,因爲PaaS產品並不像SaaS那樣可以作到開箱即用的效果,咱們提供了demo程序進行測試,覆蓋iOS/AOS/Web/PC等主流客戶端,具有單聊、羣聊、聊天室、雙人及多人音視頻通話等場景便於客戶在場景中驗證核心能力。Demo程序開放源代碼,便於後續接入集成。
雲信實戰經驗總結
那麼,從IM私有化實踐中咱們能夠獲得什麼經驗?總結爲如下五點:
以上就是網易雲信IM私有化實踐的分享,期待和你們共同探討、交流。
網易雲信(NeteaseYunXin)是集網易18年IM以及音視頻技術打造的PaaS服務產品,來自網易核心技術架構的通訊與視頻雲服務,穩定易用且功能全面,致力於提供全球領先的技術能力和場景化解決方案。開發者經過集成客戶端SDK和雲端OPEN API,便可快速實現包含IM、音視頻通話、直播、點播、互動白板、短信等功能。