基于開源軟件在Azure平臺建立大規模系統的最佳實踐

jopen 10年前發布 | 27K 次閱讀 Azure

        前言

        Microsoft Azure 是微軟公有云的唯一解決方案。借助這一平臺,用戶可以以多種方式部署和發布自己的應用。 這是一個開放的平臺,除了對于 Windows 服務器和 SQL Server 的支持,Microsoft Azure 也支持了大量主流開源軟件和框架,包括 Linux, Tomcat?, Java?等。如何將一個基于開源軟件的系統遷移到 Microsoft Azure 平臺,并充分發揮云在彈性、敏捷性等方面的優勢? 本文和讀者分享一些最佳實踐經驗,并在文末以中國網絡電視臺的系統遷移作為參考案例。

        閱讀本文之前,希望讀者對 Microsoft Azure 有所了解。讀者可以登錄 http://www.windowsazure.cn 得到關于這一平臺的各項信息。本文提到了如下概念:

        - 基礎設施即服務(IaaS: Infrastructure as a Service): 消費者通過互聯網獲得計算機基礎設施類的資源,包括計算資源(虛機),存儲資源和網絡資源等。

        - 平臺即服務(PaaS: Platform as a Service): 云平臺的服務提供商對資源在 IaaS 的基礎上做進一步封裝,將 IaaS 層對用戶透明。消費者借助開發工具和一系列開發語言,在云平臺上構建自己的應用,而無需管理和維護虛機、存儲、網絡等基礎設施。

        在 Azure 中使用 Linux 虛擬服務器:

        Azure 平臺目前支持三種類型的 Linux 操作系統: UBUNTU, CENTOS 和 SUSE。他們的版本分別是:

        - Ubuntu Server 12.04 LTS

        - Ubuntu Server 12.10

        - Ubuntu Server 13.10

        - Ubuntu Server 14.04 LTS

        - OpenLogic

        - SUSE Linux Enterprise Server 11 SP3

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        在 Azure 平臺使用 Linux 虛機,有如下最佳實踐幫助用戶得到更好的體驗。

        為 Linux 配置交換分區(SWAP)

        在 Linux 中保留 swap 分區有兩個重要的原因:

  1. 當物理內存不足以支撐系統和應用程序(進程)的運作時,這個 swap 空間可以用作臨時存放使用率不高的內存分頁,把騰出的內存交給急需的應用程序(進程)使用。
  2. 即使你的機器擁有足夠多的物理內存,也有一些程序會在它們初始化時殘留的極少再用到的內存分頁內容轉移到 swap 空間,以此讓出物理內存空間。對于有發生內存泄漏幾率的應用程序(進程),swap 空間更是重要,因為誰也不想看到由于物理內存不足導致系統崩潰。

        在 Azure 平臺上,當用戶通過鏡像庫,創建出一臺 Linux 服務器時,默認并沒有分配任何交換分區。運行 free 命令,我們可以看到 swap 所對應的數字為0。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        讀者也許會問,既然 swap 分區如此重要,為什么 Azure 平臺的鏡像不自動配置好 swap 分區?一個重要的原因是, swap 分區的大小和位置是由用戶各自的使用場景決定的,Azure 保留客戶自己定制的靈活性,把這一工作留給用戶,在虛機創建之后進行。

        如何創建 swap 分區?下面的例子在/mnt/resource 目錄下創建 5GB 的 swap 分區。

  1. 切換至 root 用戶
  2. 運行命令: fallocate –l 5g /mnt/resource/swap5g
  3. 運行命令: chmod 600 /mnt/resource/swap5g
  4. 運行命令: mkswap /mnt/resource/swap5g
  5. 運行命令: swapon /mnt/resource/swap5g

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        Linux 虛機的非持久化磁盤

        每一臺 Linux 虛擬服務器都自帶一塊非持久化磁盤。這塊磁盤的讀寫速度很高,但它并不存在于 Azure 的持久化存儲設備上,而且在宿主機上。用戶一定要注意不能把需要持久化的數據放在這個目錄下/mnt/resource,否則當服務器重啟以后,這些數據 將會丟失。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        在 Azure 中使用 Tomcat

        如果用戶原有的應用部署于 Tomcat 服務器上,有兩種遷移模式:IaaS 和 PaaS。使用 IaaS 模式,用戶通過 Azure 創建虛機,并把 Tomcat 安裝到虛擬服務器上,然后部署應用。使用 PaaS 模式,用戶借助 Azure 提供的工具,將原有應用部署為“云服務”。如果客戶的應用并不一定要求是 Linux 操作系統(即應用中沒有使用到 Linux 操作系統的特殊功能),我們推薦的方式是 PaaS。下面我們仔細講解把 Tomcat 應用部署為 Azure Cloud Service 的優勢和便利之處。(如何通過 Eclipse 將 Tomcat 應用部署到 Azure,請參考官方文檔: http://msdn.microsoft.com/library/azure/hh694271.aspx

        當我們在 Eclipse 中創建了 Windows Azure 工程以后,單擊右鍵,選擇“部署”。在彈出的部署對話框中,我們可以看到對于 JDK 和 Tomcat 的部署有三種方式:

  1. 使用客戶本地開發環境的 JDK 和 Tomcat。

            這種方式最為直觀,客戶只需指定自己機器上 JDK 和 Tomcat 所在的位置即可。缺點是上傳的時間較長。不過這樣的工作只需在第一次部署時進行,以后更新應用程序時將不再需要。

  2. 使用第三方提供的在 Windows Azure 上的 JDK。
  3. 使用 Azure 存儲中的 JDK 和 Tomcat。

        這種方式需要客戶提前將 JDK 和 Tomcat 壓縮包上傳到 Azure 存儲中。客戶可以借助一系列工具,例如 Windows Azure Storage Explorer, AzCopy 等。這種方法最為快捷,也是筆者推薦的。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        在 Azure 中使用 MySQL

        通過 Microsoft Azure 的鏡像庫部署 CentOS 虛擬服務器,在 YUM Repository 里自帶了 MySQL 的安裝程序包。用戶可以很方便的通過”yum install mysql”安裝 MySQL 服務器。對于部署了 MySQL 的虛機,請執行命令“chkconfig --list mysql”將 MySQL 進程加入到虛機啟動程序里。這樣,當虛機被重啟時,可以保證 MySQL 服務自動恢復正常。

        如何實現 MySQL 的高可用性架構。客戶有多種選擇,例如通過 MySQL, Heartbeat, DRBD 來做虛機狀態監控和數據同步。也可以選擇 Oracle 版本的 MySQL Cluster。在全球的 Azure 實例上,客戶還可以直接采用 ClearDB 提供的 MySQL as a Service。

        對于大規模應用的最佳實踐

        使用 Azure PowerShell 批量部署虛機

        當我們需要部署上百臺甚至更多的虛機時,使用基于瀏覽器的 Azure 管理門戶是非常耗時的。特別是如果我們需要在短時間內將服務器就緒,使用圖形界面人工操作更是不現實的。Azure 管理門戶提供的所有管理功能都可以通過 PowerShell 來實現。對于非 Windows 環境,Azure 也提供了命令行接口

        例如,我們需要部署 100 臺基于 CentOS 的 Apache 服務器。推薦的方法是首先通過 Azure 鏡像庫部署一臺 CentOS 服務器(目前的版本是 CentOS 6.5)。安裝 Apache,并對其進行自己需要的配置。之后,將這臺虛機制作為鏡像(image)。制作方法參考: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-capture-image/ 。制作完成后,我們就可以通過這個鏡像文件,批量部署虛機。參考下面的 PowerShell 腳本。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        注意: Azure 的云服務(Cloud Service)目前最多可以容納 50 臺虛機。如果您的應用程序需要 50 臺以上的虛機,則需要創建多個云服務。

        使用 Azure 的自動伸縮功能

        很多時候,我們對系統規模的需要是動態的。例如一個投票系統,平時的用戶訪問量不大。當有大型活動(例如春晚)的時候,系統訪問量激增。這是我 們需要系統的規模隨需而變。還有些爆發性增長是不可預測的。針對這種場景,Azure 提供了自動伸縮功能。您可以根據 CPU 使用率的平均百分比或基于隊列中的消息數指定縮放。

        在 Windows Azure 管理門戶的“縮放”頁上,您可以手動縮放應用程序,也可以設置參數使其自動縮放。您可以縮放運行 Web 角色、輔助角色或虛擬機的應用程序。若要縮放運行 Web 角色或輔助角色實例的應用程序,您需要添加或刪除角色實例以適應工作負載。

        在配置應用程序的縮放之前,應考慮以下信息:

  • 您必須將虛擬機添加到可用性集,才能縮放使用它們的應用程序。您添加的虛擬機最初可能處于打開或關閉狀態,但它們在擴展操作中將打開,在縮減操作中將關閉。有關虛擬機和可用性集的更多信息,請參見管理虛擬機的可用性
  • 縮放受內核使用情況影響。較大的角色實例或虛擬機使用更多內核。您只能在您的訂閱的內核限制內縮放應用程序。例如,如果您的訂閱的上限是二十個內 核,并且您通過兩個中等規模的虛擬機(一共四個內核)運行某個應用程序,則對于訂閱中的其他云服務部署,您只能擴展十六個內核。可用性集中用于縮放應用程 序的所有虛擬機必須具有相同大小。
  • 您必須先創建隊列并使其與角色或可用性集關聯,然后才能基于消息閾值縮放應用程序。
  • 您可以縮放鏈接到云服務的資源。

        使用 Azure 虛擬網絡提高整體性能

        當我們使用 Azure 的 IaaS 服務創建虛機時,往往需要幾臺虛機之間達到高速的互連互通。例如,我們創建了一個 Windows Server 2008 R2 作為應用服務器,還創建了一臺 SQL Server 2008 R2 Standard 作為數據庫服務器。當應用服務器訪問數據庫服務器時,我們希望它們通過 Azure 內部網絡(即后臺數據中心中的網絡)彼此對話,而不是要繞過 Internet。要達到這個目標,有兩種方法:

  1. 將這些虛機放在同一個云服務里。
  2. 將這些虛機放在同一個虛擬網絡里。

        在一個經典的三層架構的系統中,我們通常都要借助虛擬網絡來部署虛機。由于目前一個云服務最多容納 50 臺虛機,僅使用云服務往往是不夠的。因為系統規模擴大后,很可能超過 50 臺的限制,這樣我們就需要部署多個云服務。在多個云服務中,Azure 并不保證虛機的互聯互通走的是內網 IP。如何使用虛擬網絡部署虛機,讀者可以參考這篇文章: http://blog.csdn.net/azureincubationchina/article/details/10212871

        在某種情況下,系統被部署成 PaaS 和 IaaS 混合的模式。例如 Web 服務器部署為云服務,數據庫服務器部署在虛機上。這時,我們仍然希望 Web 服務器和數據庫服務器處于同一虛擬網絡中。要達到這一點,用戶首先將 IaaS 虛機部署到某個虛擬網絡中,之后編輯云服務的*.csfg 文件,加入下面的段落即可。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        中國網絡電視臺 (CNTV) 案例參考

        有關 CNTV 在 Microsoft Azure 的應用場景和商業價值,讀者可參考下面的文章。本文集中介紹技術架構部分。

        - Windows Azure 助力馬年春晚網絡直播,為 CNTV 帶來三大驚喜: http://blog.sina.com.cn/s/blog_6b8988220102edgt.html

        - CNTV 轉型“一云多屏”新媒體微軟 Windows Azure 保駕護航: http://www.cnetnews.com.cn/2014/0216/3011306.shtml

        技術架構

        CNTV 原有數據中心存在豐富的 IT 資源和關鍵數據,如何將原有 IT 系統與 Windows Azure 融合,以獲得系統資源最佳的利用率和的效率是需要重點考慮的問題。CNTV 的 VDN 視頻分發網絡需要達到每秒處理 8 萬次用戶請求,經過多次測試與論證,CNTV 原有 IT 系統承擔 40% 的用戶請求,另外 60% 的用戶請求將有 Windows Azure 完成,也就是 CNTV 內部設有一條基線,基線以下的業務放在原有 IT 系統中,而基線以上的業務則放在 Windows Azure,比如每天有 4000 萬的 UV 訪問,基線是 1600 萬的 UV,超過 1600 萬 UV 請求就會放在 Windows Azure 之上,而整個的切換過程屬于無縫切換,用戶完全感受不到。

        在 Windows Azure 中,CNTV 的 VDN 前端 Tomcat 服務器采用 Azure Cloud Service 中的 Worker Role,接收來自客戶端的請求,并返回結果。用戶使用 Eclipse,安裝 Azure SDK 插件作為開發和發布環境。在前端,用戶部署了兩個 Cloud Service,一個部署在 Azure 北京數據中心,另一個在上海數據中心。在兩個 VIP 的前端,用戶的 F5 設備對 HTTP 請求進行分流。

        當 Tomcat 服務器接收到請求后,需要首先訪問 MEMCACHE 服務器,查找數據,如果緩存中不存在要查詢的數據,則訪問后臺 MySQL 數據庫,并更新 MEMCACHE。在 Windows Azure 中,MEMCACHE 服務器和 MySQL 服務器,分別由多個實例組成負載均衡集。

        用戶自有數據中心中運行著 MySQL 的主庫。主庫通過 V*N 連接,定期將數據同步到 Windows Azure 上的從庫中。

基于開源軟件在Azure平臺建立大規模系統的最佳實踐

        在 Azure Cloud Service 中,每種角色對應多個實例,屬于同一個負載均衡集。當其中一臺虛機發生問題,Windows Azure 會自動生成一臺新的虛機替換。當系統發生后臺維護時,Windows Azure 也會確保這組虛機不會同時重啟,從而保證服務的延續性和系統的高可用性。

        對于數據庫管理系統,MySQL Master DB 在客戶自有數據中心,Slave MySQL 在 Windows Azure 中。兩邊通過 MySQL Bin-log 進行數據同步。同時,兩臺從庫屬于一個高可用集。通過開源框架 Guzz 實現了 MySQL 的讀寫分離。

        參考文檔

  1. Windows Azure Plugin for Eclipse with Java
  2. http://msdn.microsoft.com/library/azure/hh694271.aspx
  3. 下載 Eclipse IDE: http://www.eclipse.org/downloads/
  4. 下載 Azure Storage Explorer: http://azurestorageexplorer.codeplex.com/
  5. 下載針對 Azure 存儲的高速上傳和下載工具 AzCopy: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx
  6. 下載 Azure PowerShell: http://az412849.vo.msecnd.net/downloads01/windowsazure-powershell.0.6.15.msi
  7. 下載跨平臺命令行接口: http://az412849.vo.msecnd.net/downloads02/windowsazure-cli.0.6.17.msi
  8. 在 Azure 中為 Linux 虛機制作鏡像文件: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-capture-image/
  9. 如何縮放應用程序: http://www.windowsazure.cn/zh-cn/manage/services/cloud-services/how-to-scale-a-cloud-service/

        感謝馬國耀對本文的審校,劉大瑋和 Shirley Wang 對本文的策劃。

來自: InfoQ
                    <span id="shareA4" class="fl">                            
                        </span>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!