天天看點

如何将Weblogic從虛拟機遷移到容器

本文講的是<b>如何将Weblogic從虛拟機遷移到容器</b>【編者的話】本文描述了傳統Web伺服器WebLogic從VM遷移至Docker原因,以及運作在Docker上的優點,并給出了遷移部署的思路。

随着PaaS和DevOps解決方案需求的增漲,我們可以看到那些運作在虛拟機上或直接運作在裸機上的遺留應用程式,在實踐時會遇到一系列的障礙。分解和遷移的過程複雜度非常高。通常,為了獲得PaaS或CaaS模式的好處,應用程式所有者必須去重新設計他們的應用架構。

在這個文章裡,我們将分析把運作在虛拟機上的Java 遺留應用程式遷移到基于容器平台上的具體挑戰。使用Oracle WebLogic Server做為案例,我們将展示分解過程的具體步驟和遷移的結果。

對比Java EE應用運作在裸機的時代,硬體虛拟化已經是一個很大的進步。它給了我們解決多個應用間隔離及提高硬體使用率的能力。然而,Hypervisors(虛拟機管理程式)在主控端上會使用大量CPU和記憶體,且每個虛拟機都要求擁有完整的作業系統、TCP棧和檔案系統。

每個虛拟機都有固定的記憶體,隻有部分的虛拟機管理程式可以為通過記憶體膨脹(memory ballooning)機制的幫助為運作中的虛拟機重新配置設定記憶體。是以為了應用程式未來的規模,我們在每個虛拟機裡都會預留一些資源,但這些資源并沒有得到完全的利用。同時,由于在一個虛拟機内執行個體間缺乏适當的隔離,這些資源也不能被其他的程式共享。

<a href="http://dockerone.com/uploads/article/20161026/fa7726cb916bacb93b85b72d83c70352.png" target="_blank"></a>

而容器通過共享主控端的OS kernel、TCP棧、檔案系統和其他的系統資源,僅使用很少的資源和CPU就可以運作,進一步提高了性能和資源使用率。

這裡有兩種類型的容器——應用容器和系統容器。通常,一個應用容器運作時相當于一個單程序。而一個系統容器則像一個完整的作業系統,可以在一個單容器内執行作業系統所有的功能,比如systemd、SysVinit和通過openrc産生其他類似openssh、crond and syslogd的程序。兩種類型的容器在不同的使用場景都非常有用,而且在備援管理程序上不浪費記憶體,通常消耗的記憶體比虛拟機少。然而,對于Java遺留應用程式的遷移隻有使用系統容器可以不需要大量的應用重構。

不同于虛拟機,對于運作中執行個體的容器資源的不需要重新開機就可以很容易修改限制。而且這些在限制邊界内沒有被消耗的資源自動與在同一個實體節點上的其他容器共享。

<a href="http://dockerone.com/uploads/article/20161026/23e7e2c987ce949ca09b40a459ff59b9.png" target="_blank"></a>

此外,容器對于開發而言也非常有用,在建立,打包,測試應用方面用一種靈活的方式加快應用的開始進度和提高應用的可擴充性。

這些在實體機上沒有被利用的資源可以很容易彈性擴充或新應用的容器使用。考慮到提高容器的隔離,不同類型的應用可以運作在相同的實體節點而不互相影響。這些可以平均提高已存在的基礎裝置資源使用率的3-10倍。

在遷移過程中,程式分解是基本部分,它可以幫助把大的單塊應用分解成小的,按邏輯塊劃分的,和可以獨立運作程式。

以圖中顯示的是在從虛拟機遷移到容器時應用的一個簡單的分解過程:

<a href="http://dockerone.com/uploads/article/20161026/4f023967467ee026a83e4eaf7056d1f8.png" target="_blank"></a>

在軟體程式開發裡有句老話:遺留軟體是好的,隻不過是還在運作的舊軟體。下面通過案例讓我們更精确的知道在Oracle Weblogic Server上它是怎麼工作的。

在虛拟機中運作時,Weblogic Server包含三種類型的執行個體:

Administration Server.(管理伺服器)

Node Manager.(節點管理器)

Managed Server.(被管理伺服器)

管理伺服器是中心節點,通過它可以配置和管理叢集中的所有資源。它通過與節點管理器連接配接增加或删除被管理節點。而被管理節點運作Web應用、EJBs、Web service和其他的資源。

<a href="http://dockerone.com/uploads/article/20161026/36376c41ce46fd129e25f84c4ac9f3cf.png" target="_blank"></a>

通常,每個虛拟機上運作一個節點管理器和多個被管服務伺服器,而一個管理伺服器則管理所有虛拟機上的所有執行個體。

現在想象一下遇到流量高峰期需要擴充叢集,新的被管伺服器将會被加入到虛拟機中用于處理增長的負載,直到沒有資源配置設定。

<a href="http://dockerone.com/uploads/article/20161026/8cc39475a44be6752a9427f58aef90c5.png" target="_blank"></a>

但是當流量還在不斷增長,而目前被管理服務的執行個體數量不足以處理負載時,則需要增加一個新的虛拟機去處理程式的進一步增長的業務規模。

典型的通過多個虛拟機對WebLogic進行擴充包括三個步驟:

提供一個提前配置好 Weblogic Server 模闆的新虛拟機

在新的虛拟機上啟動一個節點管理器,并連接配接到管理伺服器上

添加一個新的被管理伺服器處理部分增長的業務負載

<a href="http://dockerone.com/uploads/article/20161026/27614d7054f2a447f6a41dc6ccd95b3c.png" target="_blank"></a>

然後,這個擴充的步驟重複,在新增加的虛拟啟動更多的被管理伺服器直到資源限制。

<a href="http://dockerone.com/uploads/article/20161026/78c9026610b37245659903bdf20a746e.png" target="_blank"></a>

這樣運作Oracle WebLogic是一種資源使用率非常低下的方式,這裡有幾個資源浪費或未使用的點:

每個虛拟機要求擁有完整的作業系統,TCP 棧和檔案系統,這些需要使用主控端大量的 CPU 和記憶體。

這些資源的配置設定并非高度微粒化,在某些場景,所有當我們隻需要增加一個被管理伺服器時也需要去準備一個完整的虛拟機。

如果當一個虛拟機的資源不足時,添加額外的 CPU 或僅是增加記憶體也需要重新開機整個虛拟機。

每個虛拟機都需要節點管理器用來增加或删除被管理節點,需要消耗額外的資源和增加額外複雜的配置。

在同一個虛拟機裡運作的執行個體由于缺少隔離會互相影響,進而影響整個應用的性能。也出于這個原因,我們不能在同一個虛拟機上混合搭配運作不同的應用程式。

虛拟機的可移植性受限于一個廠商,是以當我們想從一個雲遷移到另一個雲會有一系列的問題。

在虛拟機上做模闆打包和實施CI/CD會非常慢和過程複雜。

當Docker模闆已經準備好,我們規定每個執行個體在獨立的容器裡:一個管理伺服器和需要數量的被管理伺服器。

在這裡,我們放棄了用于增加和删除被管理節點的節點管理器。

這樣,我們就得到了一個非常簡單的Weblogic Server Cluster結構。

<a href="http://dockerone.com/uploads/article/20161026/92c69cfe228e861355748a82351b2ca3.png" target="_blank"></a>

因為容器比從頭開始配置或克隆更容易,這樣水準擴充過程變得非常細顆粒和平滑。還有,每個容器可以被快速啟動或停止,幾乎沒有停機時間。當和虛拟機對比時容器更加輕量,是以排程容器時比排程虛拟機使用更少的時間。

雖然将應用遷移到容器裡是一個挑戰,但是如果你知道怎麼管理它,可以獲得如下的好處:

每個容器消除獨立的完整作業系統,TCP 棧和檔案系統可以減少系統資源( CPU 和記憶體)的使用。

通過在叢集拓撲裡删除節點管理器可以簡化水準擴充。

通過容器可以共享未使用資源的能力可以自動化垂直擴充,而且不需要重新開機就可以重新配置,非常容易。

通過在同一個實體機上使用獨立的容器隔離運作不同的應用,提高基礎裝置的使用率。

通過容器的可移植性解除在不同雲廠商的遷移限制。

可以使用相同的方式幫助分解應用的其他層,或應用其他的Java EE應用服務。在下一個主題,我們會通過一個特定的案例描述怎麼處理分解後資料的全過程。

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

譯者介紹:

陳愛珍,七牛雲布道師。多年企業級系統的應用運維及分布式系統實戰經驗。現專注于容器、微服務及 DevOps 落地的研究與實踐。

<b>原文釋出時間為:</b>2016-10-26

<b>本文作者:</b>陳愛珍

<b>本文來自雲栖社群合作夥伴Dockerone.io,了解相關資訊可以關注Dockerone.io。</b>

<b>原文标題:</b><b>如何将Weblogic從虛拟機遷移到容器</b>