2010-12-16 88 views
11

我正在嘗試爲Java應用程序的零停機時間部署構建非常輕量級的解決方案。爲了簡單起見,我們認爲我們有兩臺服務器。我的解決方案是使用:針對Java應用程序的零停機時間部署

  1. 在「前端」 - 一些負載平衡器(軟件) - 我在這裏考慮HAProxy。

  2. 在「後退」 - 兩臺服務器上,兩臺服務器都運行帶有已部署應用程序的Tomcat。

當我們要部署新版本

  1. 我們禁用與HAProxy的一臺服務器,所以只有一臺服務器(讓我們稱之爲服務器A,這是運行舊版本)會可用。

  2. 在其他服務器上部署新版本(我們稱之爲服務器B),運行生產單元測試(如果我們有它們:-),並使用HAProxy啓用服務器B,同時禁用服務器A.

  3. 現在我們再次只有一個服務器處於活動狀態(服務器B,新版本)。在服務器B上部署新版本,然後重新啓用它。

任何建議如何改善?如何自動化?

任何現成的解決方案,還是必須結束我自己的自定義腳本?

謝謝!

回答

4

如果您的負載均衡器支持此選項(服務器不足),滾動升級確實是一個很好的解決方案。 另一種解決方案是使用支持OSGi的應用程序服務器來熱替換部分或整個應用程序。

我會推薦第一個。 SpringSource的AMS監督控制檯可以關閉一個tcServer集羣(一個定製的tomcat on steroids),並且IIRC自動進行滾動升級(但是查看文檔)。

3

看看OSGi技術,如果你可以容納一個OSGi容器,因爲它爲OSGi包提供了很好的隔離和熱部署。如果您使用Spring框架,您可以使用Spring OSGi

3

LiveRebel提供滾動重啓的功能,爲自動化提供CLI API和Hudson/Jenkins插件。

3

我發現這個article關於零停機時間的一些有趣的解決方案。我只想在該文章中強調幾個解決方案。

1 A/B開關:滾動升級+回退機制

我們應該有一組節點中通過模式站立。我們會將新版本部署到這些節點,並立即將流量切換到它們。如果我們將舊節點保持在原始狀態,我們也可以做到即時回滾。負載均衡器面向應用程序,並根據請求負責此切換。

缺點:如果你需要X服務器運行應用程序,馮需要2X服務器這種方法。

2.零停機

通過這種方法,我們不保持一組機器;相反,我們推遲了端口綁定。共享資源獲取延遲到應用程序啓動。端口在應用程序啓動後進行切換,並且舊版本也保持運行(無需訪問點),以便在需要時立即回滾。

3.並行部署 - 的Apache Tomcat:(僅適用於Web應用程序)

的Apache Tomcat中加入了並行部署功能的版本7的發佈。他們讓兩個版本的應用程序同時運行,並將最新版本作爲默認版本運行。

4.延遲端口綁定:

我們在這裏提出的是,啓動服務器,而無需綁定端口,基本上沒有啓動連接器的能力。稍後,單獨的命令將啓動並綁定連接器。軟件的第2版可以在版本1運行且已經綁定的情況下部署。當版本2稍後啓動時,我們可以解除綁定版本1並綁定版本2.採用這種方法,節點只能在幾秒鐘內實現脫機。

5.高級端口綁定:

通過打破的神話:「Address already in use」,*這兩個老工藝&新進程將綁定到同一個端口。 SO_REUSEPORT在ON模式下的選項允許兩個(或多個)進程綁定到相同的端口。一旦新進程綁定到端口,殺死舊進程。

SO_REUSEPORT選項解決兩個問題:

  1. 應用程序的版本切換之間的小故障,節點可以作爲交通所有的時間,有效地給我們零停機時間。

  2. 改進調度:

enter image description here

總結:

通過結合後期綁定端口重用,我們可以有效地實現零停機。如果我們保持備用過程,我們也可以做一個即時回滾。

0

easy-deploy,它確實與Docker容器完全相同。

部署版本1

easy-deploy -p 80:80 -v some/path:other/path my-image:1 

要部署一個新的版本只運行與更新標籤名稱命令

easy-deploy -p 80:80 -v some/path:other/path my-image:2 

披露:我建這個工具。我建立它完全是因爲我找不到這個問題的簡單解決方案。