Azure 上的 Windows 多層式架構 (N-tier) 應用程式

Blob 儲存體
DNS
Load Balancer
虛擬網路
虛擬機器

此參考架構展示如何在 Windows 上使用 SQL Server 作為資料層,來部署針對多層式架構 (N-Tier) 應用程式設定的虛擬機器 (VM) 和虛擬網路。 部署這個解決方案

使用 Microsoft Azure 的多層式架構

下載這個架構的 Visio 檔案

架構

此架構具有下列元件。

一般

  • 資源群組資源群組可用來將 Azure 資源組合在一起,讓它們可以依存留期、擁有者或其他準則管理。

  • 可用性區域可用性區域 是 Azure 區域內的實體位置。 每個區域都是由一或多個資料中心所組成,其具有獨立的電源、冷卻和網路功能。 藉由將 Vm 放在不同區域,應用程式就能在區域內成為失敗的彈性。

網路和負載平衡

  • 虛擬網路和子網。 每部 Azure VM 都會部署到可以分割成子網路的虛擬網路。 針對每一層建立不同的子網路。

  • 應用程式閘道應用程式閘道 是第7層負載平衡器。 在此架構中,它會將 HTTP 要求路由傳送至 Web 前端。 應用程式閘道也會提供 Web 應用程式防火牆 (WAF),該防火牆會保護應用程式免於常見惡意探索和弱點。

  • 負載平衡 器。 使用 Azure Standard Load Balancer 將網路流量從 web 層散發到商務層,以及從商務層散發到 SQL Server。

  • (Nsg) 的 網路安全性群組。 使用 nsg 來限制虛擬網路內的網路流量。 例如,在如下所示的三層式架構中,資料庫層不接受來自 Web 前端的流量,只接受來自 Business 層和管理子網路的流量。

  • DDoS 保護。 雖然 Azure 平台提供基本的保護,可抵禦分散式阻斷服務 (DDoS) 攻擊,但我們建議您使用 DDoS 保護標準,其中具有增強的 DDoS 風險降低功能。 請參閱安全性考量

  • Azure DNSAzure DNS 是適用於 DNS 網域的主機服務。 其使用 Microsoft Azure 基礎結構來提供名稱解析。 只要將您的網域裝載於 Azure,就可以像管理其他 Azure 服務一樣,使用相同的認證、API、工具和計費方式來管理 DNS 記錄。

虛擬機器

  • SQL Server Always On 可用性群組。 藉由啟用複寫和容錯移轉,在資料層提供高可用性。 它會使用 Windows Server 容錯移轉叢集 (WSFC) 技術來進行容錯移轉。

  • Active Directory Domain Services (AD DS) 伺服器。 容錯移轉叢集及其相關聯叢集角色的電腦物件,是在 Active Directory Domain Services (AD DS) 中建立。

  • 雲端見證。 容錯移轉叢集需要它一半以上的節點執行,也就是具有仲裁。 如果叢集只有兩個節點,則網路磁碟分割可能會導致每個節點將它視為主要節點。 在此情況下,您需要「見證」以打破和局,並建立仲裁。 見證是例如共用磁碟的資源,可以作為打破和局項目以建立仲裁。 雲端見證是使用 Azure Blob 儲存體的見證類型。 若要深入了解有關仲裁的概念,請參閱<了解叢集和集區仲裁>。 如需雲端見證的詳細資訊,請參閱<為容錯移轉叢集部署雲端見證>。

  • Jumpbox。 也稱為防禦主機。 網路上系統管理員用來連線到其他 VM 的安全 VM。 Jumpbox 具有 NSG,只允許來自安全清單上公用 IP 位址的遠端流量。 NSG 應該允許遠端桌面 (RDP) 流量。

建議

您的需求可能和此處所述的架構不同。 請使用以下建議作為起點。

虛擬機器

如需有關設定 Vm 的建議,請參閱 在 Azure 上執行 WINDOWS VM

虛擬網路

當您建立虛擬網路時,請判斷您在每個子網路中的資源需要多少個 IP 位址。 使用 CIDR 標記法,針對所需的 IP 位址指定子網路遮罩和夠大的網路位址範圍。 使用落在標準私人 IP 位址區塊內的位址空間,其為 10.0.0.0/8、172.16.0.0/12 及 192.168.0.0/16。

選擇不會與您的內部部署網路重疊的位址範圍,以防您稍後需要在虛擬網路和您的內部部署網路之間設定閘道。 一旦建立虛擬網路之後,就無法變更位址範圍。

請記得以功能和安全性需求來設計子網路。 位於相同層或角色的所有 VM 都應移入相同的子網路,它可以是安全性界限。 如需設計虛擬網路和子網路的詳細資訊,請參閱規劃和設計 Azure 虛擬網路

應用程式閘道

如需設定應用程式閘道的詳細資訊,請參閱 應用程式閘道設定總覽

負載平衡器

不要直接將 VM 公開至網際網路,而是改為每個 VM 提供私人 IP 位址。 用戶端會使用與應用程式閘道相關聯的公用 IP 位址來進行連線。

定義負載平衡器規則,以將網路流量導向至 VM。 例如,若要啟用 HTTP 流量,請將前端設定的連接埠 80 對應至後端位址集區的連接埠 80。 當用戶端將 HTTP 要求傳送到連接埠 80 時,負載平衡器會藉由使用雜湊演算法 (其中包含來源 IP 位址) 來選取後端 IP 位址。 用戶端要求會散發到後端位址集區中的所有 VM。

網路安全性群組

使用 NSG 規則來限制各層之間的流量。 在如上所示的三層式架構中,Web 層不會直接與資料庫層通訊。 若要強制執行此規則,資料庫層應該封鎖來自 Web 層子網路的連入流量。

  1. 拒絕來自虛擬網路的所有輸入流量。 (在規則中使用 VIRTUAL_NETWORK 標記)。
  2. 允許來自 Business 層子網路的輸入流量。
  3. 允許來自資料庫層子網路本身的輸入流量。 此規則允許資料庫 VM 之間的通訊,是進行資料庫複寫和容錯移轉所需的。
  4. 允許來自 Jumpbox 子網路的 RDP 流量 (連接埠 3389)。 此規則讓系統管理員能夠從 Jumpbox 連線到資料庫層。

建立規則 2 – 4,其優先順序高於第一個規則,因此它們會覆寫它。

SQL Server Always On 可用性群組

我們建議使用 Always On 可用性群組來獲得 SQL Server 高可用性。 在 Windows Server 2016 之前,Always On 可用性群組需要一個網域控制站,而且可用性群組中的所有節點都必須位於相同的 AD 網域。

其他各層會透過可用性群組接聽程式連線到資料庫。 此接聽程式讓 SQL 用戶端能夠在不知道 SQL Server 實體執行個體名稱的情況下連線。 存取資料庫的 VM 必須加入該網域。 用戶端 (在此案例中為另一層) 會使用 DNS,將接聽程式的虛擬網路名稱解析為 IP 位址。

設定 SQL Server Always On 可用性群組,如下:

  1. 建立 Windows Server 容錯移轉叢集 (WSFC) 叢集、SQL Server Always On 可用性群組,以及主要複本。 如需詳細資訊,請參閱 Always On 可用性群組使用者入門

  2. 建立具有靜態私人 IP 位址的內部負載平衡器。

  3. 建立可用性群組接聽程式,並將接聽程式的 DNS 名稱對應到內部負載平衡器的 IP 位址。

  4. 建立 SQL Server 接聽連接埠的負載平衡器規則 (預設為 TCP 連接埠 1433)。 負載平衡器規則必須啟用「浮動 IP」,也稱為「伺服器直接回傳」。 這樣會導致 VM 直接回覆用戶端,以啟用與主要複本的直接連線。

    注意

    啟用浮動 IP 時,前端連接埠號碼必須與負載平衡器規則中的後端連接埠號碼相同。

當 SQL 用戶端嘗試連線時,負載平衡器會將連線要求路由傳送到主要複本。 如果已容錯移轉至另一個複本,負載平衡器會自動將新要求路由傳送到新的主要複本。 如需詳細資訊,請參閱設定 SQL Server Always On 可用性群組的 ILB 接聽程式

在容錯移轉期間,會關閉現有的用戶端連線。 當容錯移轉完成之後,會將新的連線路由傳送到新的主要複本。

如果您應用程式的讀取次數明顯比寫入多很多,您可以將某些唯讀查詢卸載至次要複本。 請參閱使用接聽程式連線至唯讀次要複本 (唯讀路由)

執行可用性群組的強制手動容錯移轉來測試您的部署。

Jumpbox

不允許從公用網際網路對執行應用程式工作負載的 VM 進行 RDP 存取。 對這些 VM 所做的所有 RDP 存取應該改為透過 Jumpbox 進行。 系統管理員會登入 Jumpbox,然後從 Jumpbox 登入其他 VM。 Jumpbox 允許來自網際網路,但只來自已知且安全 IP 位址的 RDP 流量。

Jumpbox 有最低效能需求,因此選取小的 VM 大小。 針對 Jumpbox 建立公用 IP 位址。 將 Jumpbox 放置於與其他 VM 相同的虛擬網路,但在個別的管理子網路中。

若要保護 Jumpbox,請新增 NSG 規則,只允許來自一組安全公用 IP 位址的 RDP 連線。 設定其他子網路的 NSG,允許來自管理子網路的 RDP 流量。

延展性考量

擴展集

針對 Web 和 Business 層,請考慮使用虛擬機器擴展集,而不是部署個別虛擬機器。 擴展集可讓您輕鬆部署及管理一組完全相同的虛擬機器,並根據效能計量自動調整虛擬機器。 當 VM 上的負載增加時,就會將其他 VM 自動新增到負載平衡器。 如果您需要快速相應放大 VM 數目,或需要自動調整規模,請考慮擴展集。

有兩種基本方法可用來設定擴展集中部署的 VM:

  • 部署虛擬機器之後,使用擴充功能來設定它。 透過此方法,新的 VM 執行個體可能需要較長的時間來啟動不具擴充功能的 VM。

  • 利用自訂的磁碟映像來部署受控磁碟。 這個選項可能會更快速地部署。 不過,它會要求您讓映像保持最新狀態。

如需詳細資訊,請參閱擴展集的設計考量

提示

使用任何自動調整規模解決方案時,事前也要利用生產層級的工作負載來進行測試。

訂用帳戶限制

每個 Azure 訂用帳戶都已經有預設限制,包括每個區域的 VM 最大數目。 您可以藉由提出支援要求來提高限制。 如需詳細資訊,請參閱 Azure 訂用帳戶和服務限制、配額和條件約束

應用程式閘道

應用程式閘道支援固定容量模式或自動調整模式。 固定容量模式適用於工作負載一致且可預測的案例。 針對具有變動流量的工作負載,請考慮使用自動調整模式。 如需詳細資訊,請參閱自動調整 和區域多餘的應用程式閘道 v2

可用性考量

可用性區域可在單一區域內提供最佳的復原能力。 如果您需要更高的可用性,請考慮使用 Azure 流量管理員進行容錯移轉,跨兩個區域複寫應用程式。 如需詳細資訊,請參閱適用於高可用性的多重區域多層式架構 (N-tier) 應用程式

並非所有區域都支援可用性區域,而且並非所有 VM 大小都支援所有區域。 執行下列 Azure CLI 命令,以尋找區域內每個 VM 大小支援的區域:

az vm list-skus --resource-type virtualMachines --zone false --location <location> \
    --query "[].{Name:name, Zones:locationInfo[].zones[] | join(','@)}" -o table

如果您將此架構部署至不支援可用性區域的區域,請將每一層的 Vm 放在 可用性設定組 內。 相同可用性設定組內的 Vm 會部署到多部實體伺服器、電腦架、儲存單位和網路交換器,以進行冗余。 擴展集會自動使用 放置群組,其可做為隱含的可用性設定組。

部署至可用性區域時,請使用 Azure Load Balancer 的標準 SKU 和應用程式閘道的 v2 SKU。 這些 Sku 支援跨區域冗余。 如需詳細資訊,請參閱

單一應用程式閘道部署可以執行多個閘道實例。 針對生產工作負載,請執行至少兩個實例。

健康狀態探查

應用程式閘道和 Load Balancer 都會使用健康情況探查來監視 VM 實例的可用性。

  • 應用程式閘道一律會使用 HTTP 探查。
  • Load Balancer 可以測試 HTTP 或 TCP。 一般而言,如果 VM 執行 HTTP 伺服器,請使用 HTTP 探查。 否則,請使用 TCP。

如果探查無法在超時期間內連線到實例,閘道或負載平衡器就會停止將流量傳送到該 VM。 探查會繼續檢查,如果 VM 再次變成可用,則會將 VM 傳回至後端集區。

HTTP 探查會將 HTTP GET 要求傳送至指定的路徑,並接聽 HTTP 200 回應。 此路徑可以是根路徑 ("/"),或是實作一些自訂邏輯來檢查應用程式健康情況的健康情況監視端點。 端點必須允許匿名的 HTTP 要求。

如需健康情況探查的詳細資訊,請參閱:

如需設計健康情況探查端點的考慮,請參閱 健康情況端點監視模式

成本考量

使用 Azure 定價計算機 來預估成本。 以下是一些其他考慮。

虛擬機器擴展集

虛擬機器擴展集適用于所有 Windows VM 大小。 您只需針對您部署的 Azure Vm 和任何額外的基礎結構資源(例如儲存體和網路)支付費用。 虛擬機器擴展集服務不會有累加的費用。

針對單一 Vm 定價選項,請參閱 Windows vm 定價

SQL Server

如果您選擇 Azure SQL DBaas,您可以節省成本,因為不需要設定 Always On 可用性群組和網域控制站電腦。 從單一資料庫到受控實例或彈性集區的部署選項有好幾種。 如需詳細資訊,請參閱 AZURE SQL 定價

如需 SQL server Vm 定價選項,請參閱 Sql vm 定價

負載平衡器

您只需支付已設定的負載平衡和輸出規則數目。 輸入 NAT 規則是免費的。 未設定任何規則時,Standard Load Balancer 不會收取每小時費用。

如需詳細資訊,請參閱 Microsoft Azure Well-Architected Framework 中的成本一節。

安全性考量

虛擬網路是 Azure 中的流量隔離界限。 預設情況下,一個虛擬網路中的 VM 無法與不同虛擬網路中的 VM 直接通訊。 不過,您可以使用 虛擬網路對等互連明確地連接虛擬網路。

Nsg。 使用網路安全性群組 (NSG) 來限制網際網路的進出流量。 如需詳細資訊,請參閱 Microsoft 雲端服務和網路安全性

DMZ。 請考慮新增網路虛擬設備 (NVA),在網際網路和 Azure 虛擬網路之間建立 DMZ。 NVA 是虛擬設備的通稱,可以執行網路相關的工作,例如防火牆、封包檢查、稽核和自訂路由傳送。 如需詳細資訊,請參閱實作 Azure 和網際網路之間的 DMZ

加密。 將機密的待用資料加密,並使用 Azure Key Vault 來管理資料庫加密金鑰。 Key Vault 可以在硬體安全模組 (HSM) 中儲存加密金鑰。 如需詳細資訊,請參閱 在 Azure VM 上設定 SQL Server 的 Azure 金鑰保存庫整合。 也建議將應用程式密碼 (例如資料庫連接字串) 儲存在金鑰保存庫中。

DDoS 保護。 Azure 平台預設會提供基本的 DDoS 保護。 此基本保護的目標是保護整個 Azure 基礎結構。 雖然基本 DDoS 保護會自動啟用,我們仍建議您使用 DDoS 保護標準。 標準保護使用彈性調整,可根據您的應用程式網路流量模式來偵測威脅。 這可讓它針對 DDoS 攻擊套用風險降低措施,這些攻擊可能因整個基礎結構的 DDoS 原則而未被察覺。 標準保護也會提供警示、遙測以及透過 Azure 監視器的分析。 如需詳細資訊,請參閱 Azure DDoS 保護:最佳做法與參考架構

DevOps 考量

在此架構中,您會使用 [Azure 建立區塊範本] [azbb-範本] 來布建 Azure 資源及其相依性。 由於所有的主要資源及其相依性都位於相同的虛擬網路中,因此它們會在相同的基本工作負載中隔離,讓工作負載的特定資源與小組產生關聯,讓小組可以獨立管理這些資源的所有層面。 這種隔離可讓 DevOps 執行 (CI/CD) 的持續整合和持續傳遞。

此外,您可以使用不同的部署範本,並將其與 Azure DevOps Services 整合,以在幾分鐘內布建不同的環境,例如,只在需要時才複寫生產案例或負載測試環境,以節省成本。

在此 sceanario 中,您可以使用虛擬機器擴充功能來設定虛擬機器,因為它們可提供安裝某些額外軟體(例如反惡意程式碼和安全性代理程式)的可能性。 VM 擴充功能只會在 VM 建立期間安裝並執行。 這表示,如果作業系統在稍後的階段未正確設定,則需要手動介入才能將其移回正確的狀態。

此架構中會使用設定管理工具(特別是 Desired State Configuration (DSC) )來設定 Active Directory 和 SQL Server 可用性群組。

請考慮使用 Azure 監視器,不需要登入您的虛擬機器即可分析和最佳化基礎結構的效能、監視和診斷網路問題。 Application Insights 實際上是 Azure 監視器的其中一個元件,可提供您豐富的計量和記錄,以驗證您的完整 Azure 環境狀態。 Azure 監視器可協助您遵循基礎結構的狀態。

請務必只監視支援應用程式程式碼的計算元素,但您的資料平臺(尤其是您的資料庫),因為應用程式資料層的低效能可能會造成嚴重的後果。

為了測試應用程式執行所在的 Azure 環境,它應該透過與應用程式程式碼相同的機制進行版本控制和部署,然後也可以使用 DevOps 測試範例進行測試和驗證。

如需詳細資訊,請參閱 Azure Well-Architected Framework中的卓越操作一節。

部署解決方案

此參考架構的部署可在 GitHub 上取得。 整個部署最多可能需要一小時的時間,包括執行腳本以設定 AD DS、Windows Server 容錯移轉叢集,以及 SQL Server 可用性群組。

如果您指定支援可用性區域的區域,則會將 Vm 部署到可用性區域。 否則,Vm 會部署到可用性設定組中。 如需支援「可用性區域」的區域清單,請參閱 依區域支援的服務

Prerequisites

  1. 複製、派生或下載適用於參考架構 GitHub 存放庫的 zip 檔案。

  2. 安裝 Azure CLI 2.0

  3. 安裝 Node 和 NPM

  4. 安裝 Azure 建置組塊 npm 封裝。

    npm install -g @mspnp/azure-building-blocks
    
  5. 從命令提示字元、Bash 提示字元或 PowerShell 提示字元中登入 Azure 帳戶,如下所示:

    az login
    

部署步驟

  1. 瀏覽至參考架構 GitHub 存放庫的 virtual-machines\n-tier-windows 資料夾。

  2. 開啟 n-tier-windows.json 檔案。

  3. 在檔案中 n-tier-windows.json ,搜尋的所有實例, [replace-with-password] [replace-with-safe-mode-password] 並取代為強式密碼。 儲存檔案。

    注意

    如果變更系統管理員使用者名稱,也必須在 JSON 檔案中更新 extensions 區塊。

  4. 執行下列命令來部署架構。

    azbb -s <your subscription_id> -g <resource_group_name> -l <location> -p n-tier-windows.json --deploy
    
  5. 當部署完成時,請開啟 Azure 入口網站,然後流覽至資源群組。 尋找以 ' sqlcw ' 開頭的儲存體帳戶。 這是將用於叢集的雲端見證的儲存體帳戶。 流覽至儲存體帳戶,選取 [ 存取金鑰],然後複製的值 key1 。 也請複製儲存體帳戶的名稱。

  6. 開啟 n-tier-windows-sqlao.json 檔案。

  7. 在檔案中 n-tier-windows-sqlao.json ,搜尋的所有實例, [replace-with-password] [replace-with-sql-password] 並取代為強式密碼。

    注意

    如果變更系統管理員使用者名稱,也必須在 JSON 檔案中更新 extensions 區塊。

  8. 在檔案中 n-tier-windows-sqlao.json ,搜尋和的所有實例 [replace-with-storageaccountname][replace-with-storagekey] 並以步驟5中的值取代。 儲存檔案。

  9. 執行下列命令來設定 SQL Server Always On。

    azbb -s <your subscription_id> -g <resource_group_name> -l <location> -p n-tier-windows-sqlao.json --deploy
    

後續步驟