《如何將Weblogic從虛擬機(jī)遷移到容器》要點(diǎn):
本文介紹了如何將Weblogic從虛擬機(jī)遷移到容器,希望對您有用。如果有疑問,可以聯(lián)系我們。
隨著PaaS和DevOps解決方案需求的增漲,我們可以看到那些運(yùn)行在虛擬機(jī)上或直接運(yùn)行在裸機(jī)上的遺留應(yīng)用程序,在實(shí)踐時會遇到一系列的障礙.分解和遷移的過程復(fù)雜度非常高.通常,為了獲得PaaS或CaaS模式的好處,應(yīng)用程序所有者必須去重新設(shè)計他們的應(yīng)用架構(gòu).
在這個文章里,我們將分析把運(yùn)行在虛擬機(jī)上的Java 遺留應(yīng)用程序遷移到基于容器平臺上的具體挑戰(zhàn).使用Oracle WebLogic Server做為案例,我們將展示分解過程的具體步驟和遷移的結(jié)果.
對比Java EE應(yīng)用運(yùn)行在裸機(jī)的時代,硬件虛擬化已經(jīng)是一個很大的進(jìn)步.它給了我們解決多個應(yīng)用間隔離及提高硬件利用率的能力.然而,Hypervisors(虛擬機(jī)管理程序)在宿主機(jī)上會使用大量CPU和內(nèi)存,且每個虛擬機(jī)都要求擁有完整的操作系統(tǒng)、TCP棧和文件系統(tǒng).
每個虛擬機(jī)都有固定的內(nèi)存,只有部分的虛擬機(jī)管理程序可以為通過內(nèi)存膨脹(memory ballooning)機(jī)制的幫助為運(yùn)行中的虛擬機(jī)重新分配內(nèi)存.所以為了應(yīng)用程序未來的規(guī)模,我們在每個虛擬機(jī)里都會預(yù)留一些資源,但這些資源并沒有得到完全的利用.同時,由于在一個虛擬機(jī)內(nèi)實(shí)例間缺乏適當(dāng)?shù)母綦x,這些資源也不能被其他的程序共享.
而容器通過共享宿主機(jī)的OS kernel、TCP棧、文件系統(tǒng)和其他的系統(tǒng)資源,僅使用很少的資源和CPU就可以運(yùn)行,進(jìn)一步提高了性能和資源利用率.
這里有兩種類型的容器——應(yīng)用容器和系統(tǒng)容器.通常,一個應(yīng)用容器運(yùn)行時相當(dāng)于一個單進(jìn)程.而一個系統(tǒng)容器則像一個完整的操作系統(tǒng),可以在一個單容器內(nèi)執(zhí)行操作系統(tǒng)所有的功能,比如systemd、SysVinit和通過openrc產(chǎn)生其他類似openssh、crond and syslogd的進(jìn)程.兩種類型的容器在不同的使用場景都非常有用,而且在冗余管理進(jìn)程上不浪費(fèi)內(nèi)存,通常消耗的內(nèi)存比虛擬機(jī)少.然而,對于Java遺留應(yīng)用程序的遷移只有使用系統(tǒng)容器可以不需要大量的應(yīng)用重構(gòu).
不同于虛擬機(jī),對于運(yùn)行中實(shí)例的容器資源的不需要重啟就可以很容易修改限制.而且這些在限制邊界內(nèi)沒有被消耗的資源自動與在同一個物理節(jié)點(diǎn)上的其他容器共享.
此外,容器對于開發(fā)而言也非常有用,在創(chuàng)建,打包,測試應(yīng)用方面用一種敏捷的方式加快應(yīng)用的開始進(jìn)度和提高應(yīng)用的可擴(kuò)展性.
這些在物理機(jī)上沒有被利用的資源可以很容易彈性擴(kuò)展或新應(yīng)用的容器使用.考慮到提高容器的隔離,不同類型的應(yīng)用可以運(yùn)行在相同的物理節(jié)點(diǎn)而不相互影響.這些可以平均提高已存在的基礎(chǔ)設(shè)備資源利用率的3-10倍.
在遷移過程中,程序分解是基本部分,它可以幫助把大的單塊應(yīng)用分解成小的,按邏輯塊劃分的,和可以獨(dú)立運(yùn)行程序.
以圖中顯示的是在從虛擬機(jī)遷移到容器時應(yīng)用的一個簡單的分解過程:
在軟件程序開發(fā)里有句老話:遺留軟件是好的,只不過是還在運(yùn)行的舊軟件.下面通過案例讓我們更精確的知道在Oracle Weblogic Server上它是怎么工作的.
在虛擬機(jī)中運(yùn)行時,Weblogic Server包含三種類型的實(shí)例:
管理服務(wù)器是中心節(jié)點(diǎn),通過它可以配置和管理集群中的所有資源.它通過與節(jié)點(diǎn)管理器連接增加或刪除被管理節(jié)點(diǎn).而被管理節(jié)點(diǎn)運(yùn)行Web應(yīng)用、EJBs、Web service和其他的資源.
通常,每個虛擬機(jī)上運(yùn)行一個節(jié)點(diǎn)管理器和多個被管服務(wù)服務(wù)器,而一個管理服務(wù)器則管理所有虛擬機(jī)上的所有實(shí)例.
現(xiàn)在想象一下遇到流量高峰期需要擴(kuò)展集群,新的被管服務(wù)器將會被加入到虛擬機(jī)中用于處理增長的負(fù)載,直到?jīng)]有資源分配.
但是當(dāng)流量還在不斷增長,而當(dāng)前被管理服務(wù)的實(shí)例數(shù)量不足以處理負(fù)載時,則需要增加一個新的虛擬機(jī)去處理程序的進(jìn)一步增長的業(yè)務(wù)規(guī)模.
典型的通過多個虛擬機(jī)對WebLogic進(jìn)行擴(kuò)展包括三個步驟:
然后,這個擴(kuò)展的步驟重復(fù),在新增加的虛擬啟動更多的被管理服務(wù)器直到資源限制.
這樣運(yùn)行Oracle WebLogic是一種資源利用率非常低下的方式,這里有幾個資源浪費(fèi)或未使用的點(diǎn):
這些天,我們找到多個設(shè)計用來在容器里運(yùn)行微服務(wù)的優(yōu)秀應(yīng)用服務(wù)器和框架,比如 Spring Boot、WildFly Swarm、Payara Micro等等.無論如何,有一系列的服務(wù)器設(shè)計運(yùn)行在虛擬機(jī),比如Oracle WebLogic Server,這種類型的實(shí)例遷移到容器里的任務(wù)更加復(fù)雜.這就是為什么我們更關(guān)注這個主題.
這些天通過Docker容器的幫助這個分解是一個相當(dāng)容易的任務(wù).首先,我們需要準(zhǔn)備一個有WebLogic Server的容器鏡像.(鏡像可從Oracle的官方倉庫獲得).
當(dāng)Docker模板已經(jīng)準(zhǔn)備好,我們規(guī)定每個實(shí)例在獨(dú)立的容器里:一個管理服務(wù)器和需要數(shù)量的被管理服務(wù)器.
在這里,我們放棄了用于增加和刪除被管理節(jié)點(diǎn)的節(jié)點(diǎn)管理器.
遷移到容器后,和直接使用管理節(jié)點(diǎn)一樣,通過容器編排平臺和一系列WSLT腳本,被管理服務(wù)器實(shí)例可以被自動增加和刪除.
這樣,我們就得到了一個非常簡單的Weblogic Server Cluster結(jié)構(gòu).
因?yàn)槿萜鞅葟念^開始配置或克隆更容易,這樣水平擴(kuò)展過程變得非常細(xì)顆粒和平滑.還有,每個容器可以被快速啟動或停止,幾乎沒有停機(jī)時間.當(dāng)和虛擬機(jī)對比時容器更加輕量,所以調(diào)度容器時比調(diào)度虛擬機(jī)使用更少的時間.
雖然將應(yīng)用遷移到容器里是一個挑戰(zhàn),但是如果你知道怎么管理它,可以獲得如下的好處:
可以使用相同的方式幫助分解應(yīng)用的其他層,或應(yīng)用其他的Java EE應(yīng)用服務(wù).在下一個主題,我們會通過一個特定的案例描述怎么處理分解后數(shù)據(jù)的全過程.
陳愛珍譯/七牛云布道師
原文出處:Docker(微信訂閱號ID:dockerone)
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/4402.html